in ruta-core/src/main/java/org/apache/uima/ruta/expression/feature/FeatureMatchExpression.java [89:169]
public boolean checkFeatureValue(FeatureStructure fs, Feature feature, MatchContext context,
RutaStream stream) {
Type featureRangeType = null;
TypeSystem typeSystem = stream.getCas().getTypeSystem();
if (feature instanceof TypeFeature) {
if (getArg() instanceof ITypeExpression) {
Type t1 = fs.getType();
ITypeExpression expr = (ITypeExpression) getArg();
Type t2 = expr.getType(context, stream);
return compare(t1, t2);
}
} else if (feature instanceof CoveredTextFeature) {
featureRangeType = typeSystem.getType(CAS.TYPE_NAME_STRING);
} else if (feature != null) {
featureRangeType = feature.getRange();
}
String rangeName = featureRangeType.getName();
if (rangeName.equals(CAS.TYPE_NAME_BOOLEAN)) {
Boolean v1 = fs.getBooleanValue(feature);
if (getArg() instanceof IBooleanExpression) {
IBooleanExpression expr = (IBooleanExpression) getArg();
Boolean v2 = expr.getBooleanValue(context, stream);
return compare(v1, v2);
}
} else if (rangeName.equals(CAS.TYPE_NAME_INTEGER) || rangeName.equals(CAS.TYPE_NAME_BYTE)
|| rangeName.equals(CAS.TYPE_NAME_SHORT) || rangeName.equals(CAS.TYPE_NAME_LONG)) {
Integer v1 = fs.getIntValue(feature);
if (getArg() instanceof INumberExpression) {
INumberExpression expr = (INumberExpression) getArg();
Integer v2 = expr.getIntegerValue(context, stream);
return compare(v1, v2);
}
} else if (rangeName.equals(CAS.TYPE_NAME_DOUBLE)) {
Double v1 = fs.getDoubleValue(feature);
if (getArg() instanceof INumberExpression) {
INumberExpression expr = (INumberExpression) getArg();
Double v2 = expr.getDoubleValue(context, stream);
return compare(v1, v2);
}
} else if (rangeName.equals(CAS.TYPE_NAME_FLOAT)) {
Float v1 = fs.getFloatValue(feature);
if (getArg() instanceof INumberExpression) {
INumberExpression expr = (INumberExpression) getArg();
Float v2 = expr.getFloatValue(context, stream);
return compare(v1, v2);
}
} else if (typeSystem.subsumes(typeSystem.getType(CAS.TYPE_NAME_STRING), featureRangeType)) {
String v1 = null;
// null is possibly coveredText
if (feature instanceof CoveredTextFeature && fs instanceof AnnotationFS) {
v1 = ((AnnotationFS) fs).getCoveredText();
} else if (feature != null) {
v1 = fs.getStringValue(feature);
}
if (getArg() instanceof IStringExpression) {
IStringExpression expr = (IStringExpression) getArg();
String v2 = expr.getStringValue(context, stream);
return compare(v1, v2);
}
} else {
FeatureStructure featureValue = fs.getFeatureValue(feature);
if (!feature.getRange().isPrimitive() && getArg() instanceof FeatureExpression) {
FeatureExpression fe = (FeatureExpression) getArg();
Collection<? extends FeatureStructure> featureAnnotations = fe
.getFeatureStructures(asList(fs), false, context, stream);
return compare(featureValue, featureAnnotations);
} else if (!feature.getRange().isPrimitive() && getArg() instanceof IAnnotationExpression) {
IAnnotationExpression ae = (IAnnotationExpression) getArg();
AnnotationFS compareAnnotation = ae.getAnnotation(context, stream);
return compare(featureValue, compareAnnotation);
} else if (!feature.getRange().isPrimitive()
&& typeSystem.subsumes(typeSystem.getType(CAS.TYPE_NAME_FS_ARRAY), featureRangeType)
&& getArg() instanceof IAnnotationListExpression) {
ArrayFS<?> fsArray = (ArrayFS<?>) featureValue;
IAnnotationListExpression ale = (IAnnotationListExpression) getArg();
List<AnnotationFS> annotationList = ale.getAnnotationList(context, stream);
return compare(Arrays.asList(fsArray.toArray()), annotationList);
}
}
return false;
}