public static Filter getUnhandledOtsFilterCore()

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;
            }
        }

    }