Search in sources :

Example 1 with SizeOfNodeId

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;
}
Also used : TDBException(org.apache.jena.tdb2.TDBException) SizeOfNodeId(org.apache.jena.tdb2.sys.SystemTDB.SizeOfNodeId) NodeId(org.apache.jena.tdb2.store.NodeId) Record(org.apache.jena.dboe.base.record.Record) Tuple(org.apache.jena.atlas.lib.tuple.Tuple)

Aggregations

Tuple (org.apache.jena.atlas.lib.tuple.Tuple)1 Record (org.apache.jena.dboe.base.record.Record)1 TDBException (org.apache.jena.tdb2.TDBException)1 NodeId (org.apache.jena.tdb2.store.NodeId)1 SizeOfNodeId (org.apache.jena.tdb2.sys.SystemTDB.SizeOfNodeId)1