use of org.apache.jena.tdb2.sys.SystemTDB.SizeOfNodeId in project jena by apache.
the class TupleIndexRecord method findWorker.
private Iterator<Tuple<NodeId>> findWorker(Tuple<NodeId> patternNaturalOrder, boolean partialScanAllowed, boolean fullScanAllowed) {
if (Check) {
if (tupleLength != patternNaturalOrder.len())
throw new TDBException(String.format("Mismatch: tuple length %d / index for length %d", patternNaturalOrder.len(), tupleLength));
}
// Convert to index order.
Tuple<NodeId> pattern = tupleMap.map(patternNaturalOrder);
// Canonical form.
int numSlots = 0;
// Index of last leading pattern NodeId. Start less than numSlots-1
int leadingIdx = -2;
boolean leading = true;
// Records.
Record minRec = factory.createKeyOnly();
Record maxRec = factory.createKeyOnly();
// Set the prefixes.
for (int i = 0; i < pattern.len(); i++) {
NodeId X = pattern.get(i);
if (NodeId.isAny(X)) {
X = null;
// No longer seting leading key slots.
leading = false;
continue;
}
// if ( NodeId.isDoesNotExist(X) )
// return Iter.nullIterator();
numSlots++;
if (leading) {
leadingIdx = i;
NodeIdFactory.set(X, minRec.getKey(), i * SizeOfNodeId);
NodeIdFactory.set(X, maxRec.getKey(), i * SizeOfNodeId);
}
}
// Is it a simple existence test?
if (numSlots == pattern.len()) {
if (index.contains(minRec))
return new SingletonIterator<>(pattern);
else
return new NullIterator<>();
}
if (true) {
Iterator<Tuple<NodeId>> tuples;
if (leadingIdx < 0) {
if (!fullScanAllowed)
return null;
// Full scan necessary
tuples = index.iterator(null, null, recordMapper);
} else {
// Adjust the maxRec.
NodeId X = pattern.get(leadingIdx);
// Set the max Record to the leading NodeIds, +1.
// Example, SP? inclusive to S(P+1)? exclusive where ? is zero.
NodeIdFactory.setNext(X, maxRec.getKey(), leadingIdx * SizeOfNodeId);
tuples = index.iterator(minRec, maxRec, recordMapper);
}
if (leadingIdx < numSlots - 1) {
if (!partialScanAllowed)
return null;
// Didn't match all defined slots in request.
// Partial or full scan needed.
// pattern.unmap(colMap);
tuples = scan(tuples, patternNaturalOrder);
}
return tuples;
}
Iterator<Record> iter = null;
if (leadingIdx < 0) {
if (!fullScanAllowed)
return null;
// Full scan necessary
iter = index.iterator();
} else {
// Adjust the maxRec.
NodeId X = pattern.get(leadingIdx);
// Set the max Record to the leading NodeIds, +1.
// Example, SP? inclusive to S(P+1)? exclusive where ? is zero.
NodeIdFactory.setNext(X, maxRec.getKey(), leadingIdx * SizeOfNodeId);
iter = index.iterator(minRec, maxRec);
}
Iterator<Tuple<NodeId>> tuples = Iter.map(iter, item -> TupleLib.tuple(item, tupleMap));
if (leadingIdx < numSlots - 1) {
if (!partialScanAllowed)
return null;
// Didn't match all defined slots in request.
// Partial or full scan needed.
// pattern.unmap(colMap);
tuples = scan(tuples, patternNaturalOrder);
}
return tuples;
}
Aggregations