in hugegraph-core/src/main/java/org/apache/hugegraph/backend/tx/GraphTransaction.java [1841:1888]
private <V extends HugeElement> Iterator<V> joinTxRecords(
Query query,
Iterator<V> records,
BiFunction<Query, V, V> matchFunc,
Map<Id, V> addedTxRecords,
Map<Id, V> removedTxRecords,
Map<Id, V> updatedTxRecords) {
this.checkOwnerThread();
// Return the origin results if there is no change in tx
if (addedTxRecords.isEmpty() &&
removedTxRecords.isEmpty() &&
updatedTxRecords.isEmpty()) {
return records;
}
Set<V> txResults = InsertionOrderUtil.newSet();
/*
* Collect added/updated records
* Records in memory have higher priority than query from backend store
*/
for (V elem : addedTxRecords.values()) {
if (query.reachLimit(txResults.size())) {
break;
}
if ((elem = matchFunc.apply(query, elem)) != null) {
txResults.add(elem);
}
}
for (V elem : updatedTxRecords.values()) {
if (query.reachLimit(txResults.size())) {
break;
}
if ((elem = matchFunc.apply(query, elem)) != null) {
txResults.add(elem);
}
}
// Filter backend record if it's updated in memory
Iterator<V> backendResults = new FilterIterator<>(records, elem -> {
Id id = elem.id();
return !addedTxRecords.containsKey(id) &&
!updatedTxRecords.containsKey(id) &&
!removedTxRecords.containsKey(id);
});
return new ExtendableIterator<V>(txResults.iterator(), backendResults);
}