* are clauses (that is, e1.getCategory() == e2.getCategory ==
* {@link simplenlg.framework.PhraseCategory#CLAUSE}).
*/
@Override
public NLGElement apply(NLGElement previous, NLGElement next) {
NLGElement aggregated = null;
if (previous.getCategory() == PhraseCategory.CLAUSE
&& next.getCategory() == PhraseCategory.CLAUSE
&& PhraseChecker.nonePassive(previous, next)
&& !PhraseChecker.expletiveSubjects(previous, next)) {
// case 1: identical sentences: remove the current
if (PhraseChecker.sameSentences(previous, next)) {
aggregated = previous;
// case 2: subjects identical: coordinate VPs
} else if (PhraseChecker.sameFrontMods(previous, next)
&& PhraseChecker.sameSubjects(previous, next)
&& PhraseChecker.samePostMods(previous, next)) {
aggregated = this.factory.createClause();
aggregated.setFeature(InternalFeature.SUBJECTS, previous
.getFeatureAsElementList(InternalFeature.SUBJECTS));
aggregated.setFeature(InternalFeature.FRONT_MODIFIERS, previous
.getFeatureAsElement(InternalFeature.FRONT_MODIFIERS));
aggregated.setFeature(Feature.CUE_PHRASE, previous
.getFeatureAsElement(Feature.CUE_PHRASE));
aggregated
.setFeature(
InternalFeature.POSTMODIFIERS,
previous
.getFeatureAsElementList(InternalFeature.POSTMODIFIERS));
NLGElement vp;
// case 2.1: VPs have different arguments but same
// head & mods
if (!PhraseChecker.sameVPArgs(previous, next)
&& PhraseChecker.sameVPHead(previous, next)
&& PhraseChecker.sameVPModifiers(previous, next)) {
NLGElement vp1 = previous
.getFeatureAsElement(InternalFeature.VERB_PHRASE);
vp = this.factory.createVerbPhrase();
vp.setFeature(InternalFeature.HEAD, vp1
.getFeatureAsElement(InternalFeature.HEAD));
vp
.setFeature(
InternalFeature.COMPLEMENTS,
vp1
.getFeatureAsElementList(InternalFeature.COMPLEMENTS));
vp
.setFeature(
InternalFeature.PREMODIFIERS,
vp1
.getFeatureAsElementList(InternalFeature.PREMODIFIERS));
vp
.setFeature(
InternalFeature.POSTMODIFIERS,
vp1
.getFeatureAsElementList(InternalFeature.POSTMODIFIERS));
// case 2.2: just create a coordinate vP
} else {
NLGElement vp1 = previous
.getFeatureAsElement(InternalFeature.VERB_PHRASE);
NLGElement vp2 = next
.getFeatureAsElement(InternalFeature.VERB_PHRASE);
vp = this.factory.createCoordinatedPhrase(vp1, vp2);
// case 2.3: expletive subjects
}