in plugins/baseplugin/src/main/java/org/apache/unomi/plugins/baseplugin/conditions/PropertyConditionESQueryBuilder.java [47:176]
public QueryBuilder buildQuery(Condition condition, Map<String, Object> context, ConditionESQueryBuilderDispatcher dispatcher) {
String comparisonOperator = (String) condition.getParameter("comparisonOperator");
String name = (String) condition.getParameter("propertyName");
if (comparisonOperator == null || name == null) {
throw new IllegalArgumentException("Impossible to build ES filter, condition is not valid, comparisonOperator and propertyName properties should be provided");
}
String expectedValue = ConditionContextHelper.foldToASCII((String) condition.getParameter("propertyValue"));
Object expectedValueInteger = condition.getParameter("propertyValueInteger");
Object expectedValueDouble = condition.getParameter("propertyValueDouble");
Object expectedValueDate = convertDateToISO(condition.getParameter("propertyValueDate"));
Object expectedValueDateExpr = condition.getParameter("propertyValueDateExpr");
Collection<?> expectedValues = ConditionContextHelper.foldToASCII((Collection<?>) condition.getParameter("propertyValues"));
Collection<?> expectedValuesInteger = (Collection<?>) condition.getParameter("propertyValuesInteger");
Collection<?> expectedValuesDouble = (Collection<?>) condition.getParameter("propertyValuesDouble");
Collection<?> expectedValuesDate = convertDatesToISO((Collection<?>) condition.getParameter("propertyValuesDate"));
Collection<?> expectedValuesDateExpr = (Collection<?>) condition.getParameter("propertyValuesDateExpr");
Object value = ObjectUtils.firstNonNull(expectedValue, expectedValueInteger, expectedValueDouble, expectedValueDate, expectedValueDateExpr);
@SuppressWarnings("unchecked")
Collection<?> values = ObjectUtils.firstNonNull(expectedValues, expectedValuesInteger, expectedValuesDouble, expectedValuesDate, expectedValuesDateExpr);
switch (comparisonOperator) {
case "equals":
checkRequiredValue(value, name, comparisonOperator, false);
return QueryBuilders.termQuery(name, value);
case "notEquals":
checkRequiredValue(value, name, comparisonOperator, false);
return QueryBuilders.boolQuery().mustNot(QueryBuilders.termQuery(name, value));
case "greaterThan":
checkRequiredValue(value, name, comparisonOperator, false);
return QueryBuilders.rangeQuery(name).gt(value);
case "greaterThanOrEqualTo":
checkRequiredValue(value, name, comparisonOperator, false);
return QueryBuilders.rangeQuery(name).gte(value);
case "lessThan":
checkRequiredValue(value, name, comparisonOperator, false);
return QueryBuilders.rangeQuery(name).lt(value);
case "lessThanOrEqualTo":
checkRequiredValue(value, name, comparisonOperator, false);
return QueryBuilders.rangeQuery(name).lte(value);
case "between":
checkRequiredValuesSize(values, name, comparisonOperator, 2);
Iterator<?> iterator = values.iterator();
return QueryBuilders.rangeQuery(name).gte(iterator.next()).lte(iterator.next());
case "exists":
return QueryBuilders.existsQuery(name);
case "missing":
return QueryBuilders.boolQuery().mustNot(QueryBuilders.existsQuery((name)));
case "contains":
checkRequiredValue(expectedValue, name, comparisonOperator, false);
return QueryBuilders.regexpQuery(name, ".*" + expectedValue + ".*");
case "notContains":
checkRequiredValue(expectedValue, name, comparisonOperator, false);
return QueryBuilders.boolQuery().mustNot(QueryBuilders.regexpQuery(name, ".*" + expectedValue + ".*"));
case "startsWith":
checkRequiredValue(expectedValue, name, comparisonOperator, false);
return QueryBuilders.prefixQuery(name, expectedValue);
case "endsWith":
checkRequiredValue(expectedValue, name, comparisonOperator, false);
return QueryBuilders.regexpQuery(name, ".*" + expectedValue);
case "matchesRegex":
checkRequiredValue(expectedValue, name, comparisonOperator, false);
return QueryBuilders.regexpQuery(name, expectedValue);
case "in":
checkRequiredValue(values, name, comparisonOperator, true);
return QueryBuilders.termsQuery(name, values.toArray());
case "notIn":
checkRequiredValue(values, name, comparisonOperator, true);
return QueryBuilders.boolQuery().mustNot(QueryBuilders.termsQuery(name, values.toArray()));
case "all":
checkRequiredValue(values, name, comparisonOperator, true);
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (Object curValue : values) {
boolQueryBuilder.must(QueryBuilders.termQuery(name, curValue));
}
return boolQueryBuilder;
case "inContains":
checkRequiredValue(values, name, comparisonOperator, true);
BoolQueryBuilder boolQueryBuilderInContains = QueryBuilders.boolQuery();
for (Object curValue : values) {
boolQueryBuilderInContains.must(QueryBuilders.regexpQuery(name, ".*" + curValue + ".*"));
}
return boolQueryBuilderInContains;
case "hasSomeOf":
checkRequiredValue(values, name, comparisonOperator, true);
boolQueryBuilder = QueryBuilders.boolQuery();
for (Object curValue : values) {
boolQueryBuilder.should(QueryBuilders.termQuery(name, curValue));
}
return boolQueryBuilder;
case "hasNoneOf":
checkRequiredValue(values, name, comparisonOperator, true);
boolQueryBuilder = QueryBuilders.boolQuery();
for (Object curValue : values) {
boolQueryBuilder.mustNot(QueryBuilders.termQuery(name, curValue));
}
return boolQueryBuilder;
case "isDay":
checkRequiredValue(value, name, comparisonOperator, false);
return getIsSameDayRange(getDate(value), name);
case "isNotDay":
checkRequiredValue(value, name, comparisonOperator, false);
return QueryBuilders.boolQuery().mustNot(getIsSameDayRange(getDate(value), name));
case "distance":
final String unitString = (String) condition.getParameter("unit");
final Object centerObj = condition.getParameter("center");
final Double distance = (Double) condition.getParameter("distance");
if (centerObj != null && distance != null) {
String centerString;
if (centerObj instanceof org.apache.unomi.api.GeoPoint) {
centerString = ((org.apache.unomi.api.GeoPoint) centerObj).asString();
} else if (centerObj instanceof String) {
centerString = (String) centerObj;
} else {
centerString = centerObj.toString();
}
DistanceUnit unit = unitString != null ? DistanceUnit.fromString(unitString) : DistanceUnit.DEFAULT;
return QueryBuilders.geoDistanceQuery(name)
.ignoreUnmapped(true)
.distance(distance, unit)
.point(new GeoPoint(centerString));
}
}
return null;
}