public boolean checkFeatureValue()

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;
  }