in tablestore/src/main/java/com/alicloud/openservices/tablestore/ecosystem/TablestoreSplit.java [938:1003]
public static Filter getUnhandledOtsFilterCore(SyncClient client, Filter filter, String tableName, String indexName, FilterPushdownConfig filterPushdownConfig) {
boolean pushRangeLong = filterPushdownConfig.pushRangeLong;
boolean pushRangeString = filterPushdownConfig.pushRangeString;
if (geoColumnNames == null) {
geoColumnNames = generateGeoColumnNames(client, tableName, indexName);
}
if (filter.isNested()) {
List<Filter> subFiltersOld = filter.getFilters();
List<Filter> subFilterNewList = new ArrayList<Filter>();
if (filter.getLogicOperator() == Filter.LogicOperator.OR) {
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, so all filters will be pushed down");
}
}
for (Filter subFilter : subFiltersOld) {
Filter subFilterNew = getUnhandledOtsFilterCore(client, subFilter, tableName, indexName, filterPushdownConfig);
if (subFilterNew != null) {
subFilterNewList.add(subFilterNew);
}
}
if (subFilterNewList.size() >= 2) {
filter.setFilters(subFilterNewList);
} else if (subFilterNewList.size() == 1) {
filter = subFilterNewList.get(0);
} else {
filter = null;
}
return filter;
} else {
ColumnValue filterColumnValue = filter.getColumnValue();
if (geoColumnNames.contains(filter.getColumnName())) {
containGeo = true;
return null;
} 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) {
if (filterColumnValue.getType() == ColumnType.INTEGER) {
containsRangeLong = true;
}
if (filterColumnValue.getType() == ColumnType.STRING) {
containsRangeString = true;
}
if (containOr) {
if (!pushRangeLong && containsRangeLong || !pushRangeString && containsRangeString) {
LOGGER.warn("push.down.range.long push.down.range.string will be regarded as true when sql contains OR, so all filters will be pushed down");
}
return null;
} else {
if ((!pushRangeLong && filterColumnValue.getType() == ColumnType.INTEGER) ||
(!pushRangeString && filterColumnValue.getType() == ColumnType.STRING)) {
return filter;
} else {
return null;
}
}
} else {
//other has been pushed down filter : start with isnull equal and so on
return null;
}
}
}