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