in hugegraph-core/src/main/java/org/apache/hugegraph/backend/tx/GraphIndexTransaction.java [960:1015]
private static Set<IndexLabel> matchJointIndexes(
ConditionQuery query,
Set<IndexLabel> indexLabels) {
if (query.hasNeqCondition()) {
return ImmutableSet.of();
}
Set<Id> queryPropKeys = query.userpropKeys();
assert !queryPropKeys.isEmpty();
Set<IndexLabel> allILs = InsertionOrderUtil.newSet(indexLabels);
// Handle range/search index first
Set<IndexLabel> matchedIndexLabels = InsertionOrderUtil.newSet();
if (query.hasRangeCondition() || query.hasSearchCondition()) {
matchedIndexLabels = matchRangeOrSearchIndexLabels(query, allILs);
if (matchedIndexLabels.isEmpty()) {
return ImmutableSet.of();
}
allILs.removeAll(matchedIndexLabels);
// Remove matched queryPropKeys
for (IndexLabel il : matchedIndexLabels) {
// Only one field each range/search index-label
queryPropKeys.remove(il.indexField());
}
// Return if all fields are matched
if (queryPropKeys.isEmpty()) {
return matchedIndexLabels;
}
}
// Handle secondary indexes
Set<Id> indexFields = InsertionOrderUtil.newSet();
for (IndexLabel indexLabel : allILs) {
// Range index equal-condition and secondary index can joint
if (indexLabel.indexType().isSearch()) {
// Search index must be handled at the previous step
continue;
}
List<Id> fields = indexLabel.indexFields();
// Collect all fields prefix
for (Id field : fields) {
if (!queryPropKeys.contains(field)) {
break;
}
matchedIndexLabels.add(indexLabel);
indexFields.add(field);
}
}
// Must match all fields
if (indexFields.equals(queryPropKeys)) {
return matchedIndexLabels;
} else {
return ImmutableSet.of();
}
}