in plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionEvaluator.java [213:314]
protected boolean isMatch(String op, Object actualValue, String expectedValue, Object expectedValueInteger, Object expectedValueDouble,
Object expectedValueDate, Object expectedValueDateExpr, Condition condition) {
if (op == null) {
return false;
} else if (actualValue == null) {
return op.equals("missing") || op.equals("notIn") || op.equals("notEquals") || op.equals("hasNoneOf");
} else if (op.equals("exists")) {
if (actualValue instanceof List) {
return ((List) actualValue).size() > 0;
}
return true;
} else if (op.equals("equals")) {
if (actualValue instanceof Collection) {
for (Object o : ((Collection<?>) actualValue)) {
if (o instanceof String) {
o = ConditionContextHelper.foldToASCII((String) o);
}
if (compare(o, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) == 0) {
return true;
}
}
return false;
}
return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) == 0;
} else if (op.equals("notEquals")) {
return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) != 0;
} else if (op.equals("greaterThan")) {
return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) > 0;
} else if (op.equals("greaterThanOrEqualTo")) {
return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) >= 0;
} else if (op.equals("lessThan")) {
return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) < 0;
} else if (op.equals("lessThanOrEqualTo")) {
return compare(actualValue, expectedValue, expectedValueDate, expectedValueInteger, expectedValueDateExpr, expectedValueDouble) <= 0;
} else if (op.equals("between")) {
Collection<?> expectedValuesInteger = (Collection<?>) condition.getParameter("propertyValuesInteger");
Collection<?> expectedValuesDouble = (Collection<?>) condition.getParameter("propertyValuesDouble");
Collection<?> expectedValuesDate = (Collection<?>) condition.getParameter("propertyValuesDate");
Collection<?> expectedValuesDateExpr = (Collection<?>) condition.getParameter("propertyValuesDateExpr");
return compare(actualValue, null,
getDate(getFirst(expectedValuesDate)),
getFirst(expectedValuesInteger),
getFirst(expectedValuesDateExpr),
getFirst(expectedValuesDouble)) >= 0
&&
compare(actualValue, null,
getDate(getSecond(expectedValuesDate)),
getSecond(expectedValuesInteger),
getSecond(expectedValuesDateExpr),
getSecond(expectedValuesDouble)) <= 0;
} else if (op.equals("contains")) {
return actualValue.toString().contains(expectedValue);
} else if (op.equals("notContains")) {
return !actualValue.toString().contains(expectedValue);
} else if (op.equals("startsWith")) {
return actualValue.toString().startsWith(expectedValue);
} else if (op.equals("endsWith")) {
return actualValue.toString().endsWith(expectedValue);
} else if (op.equals("matchesRegex")) {
return expectedValue != null && Pattern.compile(expectedValue).matcher(actualValue.toString()).matches();
} else if (op.equals("in") || op.equals("inContains") || op.equals("notIn") || op.equals("hasSomeOf") || op.equals("hasNoneOf") || op.equals("all")) {
Collection<?> expectedValues = ConditionContextHelper.foldToASCII((Collection<?>) condition.getParameter("propertyValues"));
Collection<?> expectedValuesInteger = (Collection<?>) condition.getParameter("propertyValuesInteger");
Collection<?> expectedValuesDate = (Collection<?>) condition.getParameter("propertyValuesDate");
Collection<?> expectedValuesDateExpr = (Collection<?>) condition.getParameter("propertyValuesDateExpr");
Collection<?> expectedValuesDouble = (Collection<?>) condition.getParameter("propertyValuesDouble");
return compareValues(actualValue, expectedValues, expectedValuesInteger, expectedValuesDouble, expectedValuesDate, expectedValuesDateExpr, op);
} else if (op.equals("isDay") && (expectedValueDate != null || expectedValueDateExpr != null)) {
Object expectedDate = expectedValueDate == null ? expectedValueDateExpr : expectedValueDate;
return yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedDate)));
} else if (op.equals("isNotDay") && (expectedValueDate != null || expectedValueDateExpr != null)) {
Object expectedDate = expectedValueDate == null ? expectedValueDateExpr : expectedValueDate;
return !yearMonthDayDateFormat.format(getDate(actualValue)).equals(yearMonthDayDateFormat.format(getDate(expectedDate)));
} else if (op.equals("distance")) {
GeoPoint actualCenter = null;
if (actualValue instanceof GeoPoint) {
actualCenter = (GeoPoint) actualValue;
} else if (actualValue instanceof Map) {
actualCenter = GeoPoint.fromMap((Map<String, Double>) actualValue);
} else if (actualValue instanceof String) {
actualCenter = GeoPoint.fromString((String) actualValue);
}
if (actualCenter == null) {
return false;
}
final String unitString = (String) condition.getParameter("unit");
final String centerString = (String) condition.getParameter("center");
final Double distance = (Double) condition.getParameter("distance");
if (centerString == null || distance == null) {
return false;
}
final GeoPoint expectedCenter = GeoPoint.fromString(centerString);
final DistanceUnit expectedUnit = unitString != null ? DistanceUnit.fromString(unitString) : DistanceUnit.DEFAULT;
final double distanceInMeters = expectedUnit.convert(distance, DistanceUnit.METERS);
return expectedCenter.distanceTo(actualCenter) <= distanceInMeters;
}
return false;
}