in tablestore/src/main/java/com/alicloud/openservices/tablestore/ecosystem/DefaultTablestoreSplitManager.java [39:111]
public List<ITablestoreSplit> generateTablestoreSplits(
SyncClient client,
Filter filter,
String tableName,
ComputeParameters parameter,
List<String> requiredColumns) {
TableCatalog catalog;
catalog = manager.getTableCatalog(tableName);
if (catalog == null) {
throw new InvalidParameterException("table does not exist");
}
List<ITablestoreSplit> tableSplits = new ArrayList<ITablestoreSplit>();
LeftMatchResult calculateResult = new LeftMatchResult(tableName, catalog.getTableMeta());
if (parameter.getComputeMode() == ComputeParameters.ComputeMode.Auto) {
calculateResult = calculateComputeMode(client, catalog, filter, parameter, requiredColumns);
}
if (parameter.getComputeMode() == ComputeParameters.ComputeMode.KV) {
List<Split> rawSplits = getTableSplits(client, calculateResult.getTableName(), parameter);
for (Split rawSplit : rawSplits) {
TablestoreSplit split = new TablestoreSplit(TablestoreSplit.SplitType.KeyValue, filter, requiredColumns);
split.setKvSplit(rawSplit);
split.setKvTableMeta(calculateResult.getTableMeta());
split.setTableName(tableName);
split.setSplitName(calculateResult.getTableName());
if (split.checkIfMatchTheFilter(filter)) {
tableSplits.add(split);
}
}
} else if (parameter.getComputeMode() == ComputeParameters.ComputeMode.Search) {
// generate one split and later use parallel scan
if (parameter.getSearchIndexName() != null) {
DescribeSearchIndexRequest request = new DescribeSearchIndexRequest();
request.setTableName(tableName);
request.setIndexName(parameter.getSearchIndexName());
DescribeSearchIndexResponse response = client.describeSearchIndex(request);
IndexSchema schema = response.getSchema();
List<String> geoFieldList = new ArrayList<String>();
for (FieldSchema fieldSchema : schema.getFieldSchemas()) {
if (fieldSchema.getFieldType() == FieldType.GEO_POINT) {
geoFieldList.add(fieldSchema.getFieldName());
}
}
ComputeSplitsRequest computeSplitsRequest = new ComputeSplitsRequest();
computeSplitsRequest.setTableName(tableName);
computeSplitsRequest.setSplitsOptions(new SearchIndexSplitsOptions(parameter.getSearchIndexName()));
ComputeSplitsResponse computeSplitsResponse = client.computeSplits(computeSplitsRequest);
byte[] sessionId = computeSplitsResponse.getSessionId();
int splitsSize = computeSplitsResponse.getSplitsSize();
if (parameter.getMaxSplitsCount() > 0 && parameter.getMaxSplitsCount() < splitsSize) {
splitsSize = parameter.getMaxSplitsCount();
}
for (int i = 0; i < splitsSize; i++) {
TablestoreSplit split = new TablestoreSplit(TablestoreSplit.SplitType.SearchIndex, filter, requiredColumns, sessionId, i, splitsSize, geoFieldList);
SearchInfo info = new SearchInfo(parameter.getSearchIndexName(), catalog.getSearchSchema().get(0));
split.setSearchInfo(info);
split.setTableName(tableName);
split.setSplitName(parameter.getSearchIndexName());
tableSplits.add(split);
}
} else {
TablestoreSplit split = new TablestoreSplit(TablestoreSplit.SplitType.SearchIndex, filter, requiredColumns);
SearchInfo info = new SearchInfo(catalog.getSearchNames().get(0), catalog.getSearchSchema().get(0));
split.setSearchInfo(info);
split.setTableName(tableName);
split.setSplitName(catalog.getSearchNames().get(0));
tableSplits.add(split);
}
}
return tableSplits;
}