package org.activityinfo.model.expr.functions; import org.activityinfo.model.type.FieldType; import org.activityinfo.model.type.FieldValue; import org.activityinfo.model.type.number.Quantity; import org.activityinfo.model.type.primitive.BooleanFieldValue; import org.activityinfo.model.type.primitive.BooleanType; import java.util.List; public abstract class ComparisonOperator extends ExprFunction { private final String name; public ComparisonOperator(String name) { this.name = name; } @Override public final String getId() { return name; } @Override public String getLabel() { return name; } @Override public FieldValue apply(List<FieldValue> arguments) { FieldValue a = arguments.get(0); FieldValue b = arguments.get(1); // special handling if right operand is constant without units specified: {fieldId}==2.0 // then constract copy of Quantity without unit information for correct comparison. if (a instanceof Quantity && b instanceof Quantity) { Quantity aQuantity = (Quantity) a; Quantity bQuantity = (Quantity) b; if (Quantity.UNKNOWN_UNITS.equals(aQuantity.getUnits()) || Quantity.UNKNOWN_UNITS.equals(bQuantity.getUnits())) { a = new Quantity(aQuantity.getValue()); b = new Quantity(bQuantity.getValue()); } } return BooleanFieldValue.valueOf(apply(a, b)); } @Override public FieldType resolveResultType(List<FieldType> argumentTypes) { return BooleanType.INSTANCE; } protected abstract boolean apply(FieldValue a, FieldValue b); }