package edu.isistan.uima.unified.utils;
import org.apache.uima.cas.CASException;
import org.apache.uima.cas.ConstraintFactory;
import org.apache.uima.cas.FSIntConstraint;
import org.apache.uima.cas.FSIterator;
import org.apache.uima.cas.FSMatchConstraint;
import org.apache.uima.cas.FSStringConstraint;
import org.apache.uima.cas.FeaturePath;
import org.apache.uima.cas.FeatureStructure;
import org.apache.uima.jcas.JCas;
import org.apache.uima.jcas.tcas.Annotation;
public class IteratorUtil {
public static FSIterator<Annotation> getStringFilteredIterator(JCas aJCas, FSIterator<Annotation> iterator, int type, String feature, String[] matches) {
ConstraintFactory cf = aJCas.getConstraintFactory();
FeaturePath path = aJCas.createFeaturePath();
try {
path.addFeature(aJCas.getRequiredFeature(aJCas.getCasType(type), feature));
} catch (CASException e) {
e.printStackTrace();
}
FSMatchConstraint constraint = null;
for(String match : matches) {
FSStringConstraint stringConstraint = cf.createStringConstraint();
stringConstraint.equals(match);
FSMatchConstraint matchConstraint = cf.embedConstraint(path, stringConstraint);
if(constraint == null)
constraint = matchConstraint;
else
constraint = cf.or(constraint, matchConstraint);
}
FSIterator<Annotation> filteredIterator = aJCas.createFilteredIterator(iterator, constraint);
return filteredIterator;
}
public static FSIterator<Annotation> getStringFilteredIterator(JCas aJCas, FSIterator<Annotation> iterator, int type, String feature, String match) {
return getStringFilteredIterator(aJCas, iterator, type, feature, new String[] { match });
}
public static FSIterator<Annotation> getIntegerFilteredIterator(JCas aJCas, FSIterator<Annotation> iterator, int type, String feature, int match) {
ConstraintFactory cf = aJCas.getConstraintFactory();
FeaturePath path = aJCas.createFeaturePath();
try {
path.addFeature(aJCas.getRequiredFeature(aJCas.getCasType(type), feature));
} catch (CASException e) {
e.printStackTrace();
}
FSIntConstraint constraint = cf.createIntConstraint();
constraint.equals(match);
FSMatchConstraint matchConstraint = cf.embedConstraint(path, constraint);
FSIterator<Annotation> filteredIterator = aJCas.createFilteredIterator(iterator, matchConstraint);
return filteredIterator;
}
public static FSIterator<Annotation> getFeatureFilteredIterator(JCas aJCas, FSIterator<Annotation> iterator, int type, String feature, FeatureStructure object) {
ConstraintFactory cf = aJCas.getConstraintFactory();
FeaturePath path = aJCas.createFeaturePath();
try {
path.addFeature(aJCas.getRequiredFeature(aJCas.getCasType(type), feature));
} catch (CASException e) {
e.printStackTrace();
}
FSFeatureStructureContraint objectConstraint = new FSFeatureStructureContraint();
objectConstraint.add(object);
FSMatchConstraint constraint = cf.embedConstraint(path, objectConstraint);
FSIterator<Annotation> filteredIterator = aJCas.createFilteredIterator(iterator, constraint);
return filteredIterator;
}
public static FSIterator<Annotation> getRangeFilteredIterator(JCas aJCas, FSIterator<Annotation> iterator, int type, int begin, int end) {
ConstraintFactory cf = aJCas.getConstraintFactory();
FeaturePath pathBegin = aJCas.createFeaturePath();
try {
pathBegin.addFeature(aJCas.getRequiredFeature(aJCas.getCasType(type), "begin"));
} catch (CASException e) {
e.printStackTrace();
}
FeaturePath pathEnd = aJCas.createFeaturePath();
try {
pathEnd.addFeature(aJCas.getRequiredFeature(aJCas.getCasType(type), "end"));
} catch (CASException e) {
e.printStackTrace();
}
FSIntConstraint beginConstraint = cf.createIntConstraint();
beginConstraint.eq(begin);
FSMatchConstraint matchBeginConstraint = cf.embedConstraint(pathBegin, beginConstraint);
FSIntConstraint endConstraint = cf.createIntConstraint();
endConstraint.eq(end);
FSMatchConstraint matchEndConstraint = cf.embedConstraint(pathEnd, endConstraint);
FSIterator<Annotation> filteredIterator = aJCas.createFilteredIterator(iterator, cf.and(matchBeginConstraint, matchEndConstraint));
return filteredIterator;
}
}