public Query buildMergedSearchQueryFromFilter()

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