private List buildPkRangeFromRange()

in tablestore/src/main/java/com/alicloud/openservices/tablestore/ecosystem/TablestoreSplit.java [496:596]


    private List<PkRange> buildPkRangeFromRange(List<Range> rangeList, PrimaryKey begin, PrimaryKey end) {
        List<PkRange> pkList = new ArrayList<PkRange>();
        int pkCount = this.meta.getPrimaryKeyList().size();
        for (Range range : rangeList) {
            LOGGER.info("build rangeBegin: {}, rangeEnd: {}, rangeEqual: {}, PrimaryKeyEnd:{}",
                    range.begin, range.end, range.equal, end);
            PrimaryKeyBuilder pkb = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            PrimaryKeyBuilder pkb2 = PrimaryKeyBuilder.createPrimaryKeyBuilder();
            PrimaryKey equalPk = null;
            boolean isAllEqual = false;
            boolean isRange = false;
            if (range.equal != null) {
                pkb.addPrimaryKeyColumn(range.equal.getName(), range.equal.getValue());
                if (pkCount > 1) {
                    pkb2.addPrimaryKeyColumn(range.equal.getName(), range.equal.getValue());
                } else {
                    equalPk = pkb.build();
                    isAllEqual = true;
                }
            } else {
                isRange = true;
                pkb.addPrimaryKeyColumn(range.begin.getName(), range.begin.getValue());
                pkb2.addPrimaryKeyColumn(range.end.getName(), range.end.getValue());
                if (pkCount == 1 && !range.isRightOpen()) {
                    equalPk = pkb2.build();
                }
            }

            int index = 0;
            Range currentColumn = range.next;
            int equalCursor = 0;
            for (PrimaryKeySchema pkSchema : this.meta.getPrimaryKeyList()) {
                if (index > 0) {
                    if (isRange || currentColumn == null) {
                        pkb.addPrimaryKeyColumn(pkSchema.getName(), PrimaryKeyValue.INF_MIN);
                        if (range.getEqual() != null && !range.getEqual().getValue().equals(end.getPrimaryKeyColumn(equalCursor).getValue())) {
                            pkb2.addPrimaryKeyColumn(pkSchema.getName(), PrimaryKeyValue.INF_MAX);
                        } else if (range.getEqual() != null && range.getEqual().getValue().equals(end.getPrimaryKeyColumn(equalCursor).getValue())) {
                            pkb2.addPrimaryKeyColumn(pkSchema.getName(), PrimaryKeyValue.INF_MIN);
                        } else if (range.getEnd().getValue().equals(end.getPrimaryKeyColumn(equalCursor).getValue())) {
                            pkb2.addPrimaryKeyColumn(pkSchema.getName(), PrimaryKeyValue.INF_MIN);
                        } else {
                            if (range.isRightOpen) {
                                pkb2.addPrimaryKeyColumn(pkSchema.getName(), PrimaryKeyValue.INF_MIN);
                            } else {
                                pkb2.addPrimaryKeyColumn(pkSchema.getName(), PrimaryKeyValue.INF_MAX);
                            }
                        }

                        isRange = true;
                    } else {
                        if (currentColumn.equal != null) {
                            pkb.addPrimaryKeyColumn(pkSchema.getName(), currentColumn.equal.getValue());
                            if (index < pkCount - 1) {
                                pkb2.addPrimaryKeyColumn(pkSchema.getName(), currentColumn.equal.getValue());
                            } else {
                                equalPk = pkb.build();
                                isAllEqual = true;
                            }
                        } else {
                            pkb.addPrimaryKeyColumn(pkSchema.getName(), currentColumn.begin.getValue());
                            pkb2.addPrimaryKeyColumn(pkSchema.getName(), currentColumn.end.getValue());
                            isRange = true;

                            if (index == pkCount - 1) {
                                PrimaryKey temp = pkb2.build();
                                if (temp.compareTo(end) < 0 && currentColumn.end.getValue() != PrimaryKeyValue.INF_MAX && currentColumn.end.getValue() != PrimaryKeyValue.INF_MIN) {
                                    if (!currentColumn.isRightOpen()) {
                                        equalPk = pkb2.build();
                                    }
                                }
                            }
                        }
                        range = currentColumn;
                        currentColumn = currentColumn.next;
                        equalCursor++;
                    }
                }
                index++;
            }
            PkRange pkRange;
            PrimaryKey beginPk = pkb.build();
            if (isRange) {
                PrimaryKey endPk = pkb2.build();
                pkRange = new PkRange(beginPk, endPk);
            } else {
                pkRange = new PkRange(beginPk);
            }
            if (!isAllEqual) {
                pkList.add(pkRange);
            }

            if (equalPk != null) {
                PkRange pkRange2 = new PkRange(equalPk);
                pkList.add(pkRange2);
            }

        }
        // filter invalid PKRange.
        return filterPkRanges(pkList, begin, end);
    }