private List generateColumnRange()

in tablestore/src/main/java/com/alicloud/openservices/tablestore/ecosystem/TablestoreSplit.java [349:439]


    private List<Range> generateColumnRange(Filter filter, PrimaryKey begin, PrimaryKey end, int starPos) {
        String name = this.meta.getPrimaryKeyList().get(starPos).getName();

        if (filter.isNested()) {
            if (filter.getLogicOperator() == Filter.LogicOperator.AND || filter.getLogicOperator() == Filter.LogicOperator.OR) {
                List<Range> mergedResult = new ArrayList<Range>();
                for (Filter subFilter : filter.getSubFilters()) {
                    List<Range> result = generateColumnRange(subFilter, begin, end, starPos);
                    if (mergedResult.isEmpty() && result != null && !result.isEmpty()) {
                        mergedResult = result;
                        continue;
                    }

                    if (filter.getLogicOperator() == Filter.LogicOperator.AND) {
                        if (result != null && !result.isEmpty()) {
                            mergedResult = mergeSubRange(mergedResult, result, begin, end);
                        }
                        if (result == null) {
                            return new ArrayList<Range>();
                        }
                    } else {
                        if (result != null && !result.isEmpty()) {
                            mergedResult = mergeTotalRange(mergedResult, result, begin, end);
                        }
                    }
                }
                return mergedResult;
            } else {
                PrimaryKeyColumn col1 = new PrimaryKeyColumn(name, begin.getPrimaryKeyColumn(starPos).getValue());
                PrimaryKeyColumn col2 = new PrimaryKeyColumn(name, end.getPrimaryKeyColumn(starPos).getValue());

                Range range = new Range(col1, col2);
                return Arrays.asList(range);
            }
        } else {
            List<Range> result = new ArrayList<Range>();
            if (filter != null && filter.getColumnName() != null && filter.getColumnName().equals(name)) {
                PrimaryKeyValue pkv = PrimaryKeyValue.fromColumn(filter.getColumnValue());
                if (filter.getCompareOperator() == Filter.CompareOperator.EQUAL) {
                    PrimaryKeyColumn pkc = new PrimaryKeyColumn(name, PrimaryKeyValue.fromColumn(filter.getColumnValue()));
                    Range range = new Range(pkc);
                    result.add(range);
                } else if (filter.getCompareOperator() == Filter.CompareOperator.LESS_THAN ||
                        filter.getCompareOperator() == Filter.CompareOperator.LESS_EQUAL) {
                    boolean isRightOpen = filter.getCompareOperator() == Filter.CompareOperator.LESS_THAN;
                    if (starPos == 0) {
                        if (pkv.compareTo(end.getPrimaryKeyColumn(starPos).getValue()) >= 0) {
                            PrimaryKeyColumn pkc1 = new PrimaryKeyColumn(name, begin.getPrimaryKeyColumn(starPos).getValue());
                            PrimaryKeyColumn pkc2 = new PrimaryKeyColumn(name, end.getPrimaryKeyColumn(starPos).getValue());
                            Range range = new Range(pkc1, pkc2, isRightOpen);
                            result.add(range);
                        } else if (pkv.compareTo(begin.getPrimaryKeyColumn(starPos).getValue()) >= 0) {
                            PrimaryKeyColumn pkc1 = new PrimaryKeyColumn(name, begin.getPrimaryKeyColumn(starPos).getValue());
                            PrimaryKeyColumn pkc2 = new PrimaryKeyColumn(name, pkv);
                            Range range = new Range(pkc1, pkc2, isRightOpen);
                            result.add(range);
                        } else {
                            //
                            LOGGER.info("find empty split", begin.toString(), end.toString());
                        }
                    } else {
                        PrimaryKeyColumn pkc1 = new PrimaryKeyColumn(name, PrimaryKeyValue.INF_MIN);
                        PrimaryKeyColumn pkc2 = new PrimaryKeyColumn(name, pkv);
                        Range range = new Range(pkc1, pkc2, isRightOpen);
                        result.add(range);
                    }
                } else if (filter.getCompareOperator() == Filter.CompareOperator.GREATER_EQUAL ||
                        filter.getCompareOperator() == Filter.CompareOperator.GREATER_THAN) {
                    if (starPos == 0) {
                        if (pkv.compareTo(begin.getPrimaryKeyColumn(starPos).getValue()) < 0) {
                            PrimaryKeyColumn pkc1 = new PrimaryKeyColumn(name, begin.getPrimaryKeyColumn(starPos).getValue());
                            PrimaryKeyColumn pkc2 = new PrimaryKeyColumn(name, end.getPrimaryKeyColumn(starPos).getValue());
                            Range range = new Range(pkc1, pkc2);
                            result.add(range);
                        } else if (pkv.compareTo(end.getPrimaryKeyColumn(starPos).getValue()) <= 0) {
                            PrimaryKeyColumn pkc1 = new PrimaryKeyColumn(name, pkv);
                            PrimaryKeyColumn pkc2 = new PrimaryKeyColumn(name, end.getPrimaryKeyColumn(starPos).getValue());
                            Range range = new Range(pkc1, pkc2);
                            result.add(range);
                        }
                    } else {
                        PrimaryKeyColumn pkc1 = new PrimaryKeyColumn(name, pkv);
                        PrimaryKeyColumn pkc2 = new PrimaryKeyColumn(name, PrimaryKeyValue.INF_MAX);
                        Range range = new Range(pkc1, pkc2);
                        result.add(range);
                    }
                }
            }
            return result;
        }
    }