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