in tablestore/src/main/java/com/alicloud/openservices/tablestore/ecosystem/TablestoreSplit.java [1030:1087]
public Query buildMergedSearchQueryFromFilter(Filter filter, FilterPushdownConfig filterPushdownConfig) {
boolean pushRangeLong = filterPushdownConfig.pushRangeLong;
boolean pushRangeString = filterPushdownConfig.pushRangeString;
if (filter.isNested()) {
BoolQuery boolQuery = new BoolQuery();
List<Query> mustQuerys = new ArrayList<Query>();
List<Query> shouldQuerys = new ArrayList<Query>();
List<Query> mustNotQuerys = new ArrayList<Query>();
for (Filter subFilter : filter.getSubFilters()) {
Query subQuery = buildMergedSearchQueryFromFilter(subFilter, filterPushdownConfig);
if (filter.getLogicOperator() == Filter.LogicOperator.AND) {
mustQuerys.add(subQuery);
} else if (filter.getLogicOperator() == Filter.LogicOperator.OR) {
shouldQuerys.add(subQuery);
containOr = true;
if (!pushRangeLong && containsRangeLong || !pushRangeString && containsRangeString) {
LOGGER.warn("push.down.range.long push.down.range.string will be regarded as true when sql contains OR");
}
} else if (filter.getLogicOperator() == Filter.LogicOperator.NOT) {
mustNotQuerys.add(subQuery);
}
}
// Merged the mustQuerys
List<Query> mergedMustQuerys = mergeQuerys(mustQuerys);
boolQuery.setMustQueries(mergedMustQuerys);
boolQuery.setShouldQueries(shouldQuerys);
boolQuery.setMustNotQueries(mustNotQuerys);
return boolQuery;
} else {
ColumnValue filterColumnValue = filter.getColumnValue();
if (geoColumnNames != null && geoColumnNames.contains(filter.getColumnName())) {
Query geoQuery = getGeoQuery(filter);
if (geoQuery != null) {
return geoQuery;
}
} else if (filter.getCompareOperator() == Filter.CompareOperator.EQUAL) {
return QueryBuilders.term(filter.getColumnName(), filterColumnValue.getValue()).build();
} else if (filter.getCompareOperator() == Filter.CompareOperator.IN) {
return getInQuery(filter);
} else if (filter.getCompareOperator() == Filter.CompareOperator.IS_NULL) {
return getIsNullQuery(filter);
} else if (filter.getCompareOperator() == Filter.CompareOperator.NOT_EQUAL) {
return getNotEqualQuery(filter, filterColumnValue);
} else if (filter.getCompareOperator() == Filter.CompareOperator.START_WITH) {
return getStartWithQuery(filter, filterColumnValue);
} else if (filter.getCompareOperator() == Filter.CompareOperator.GREATER_THAN ||
filter.getCompareOperator() == Filter.CompareOperator.GREATER_EQUAL ||
filter.getCompareOperator() == Filter.CompareOperator.LESS_THAN ||
filter.getCompareOperator() == Filter.CompareOperator.LESS_EQUAL) {
Query rangeQuery = getRangeQuery(filter, pushRangeLong, pushRangeString, filterColumnValue);
if (rangeQuery != null) {
return rangeQuery;
}
}
}
return new MatchAllQuery();
}