@Override public PackedIndexTree clone() { PackedIndexTree index = new PackedIndexTree(); index.nodeID = nodeID; index.level = level; index.splitDim = splitDim; index.leafBlockFPStack[level] = leafBlockFPStack[level]; index.leftNodePositions[level] = leftNodePositions[level]; index.rightNodePositions[level] = rightNodePositions[level]; index.splitValuesStack[index.level] = splitValuesStack[index.level].clone(); System.arraycopy(negativeDeltas, level*numIndexDims, index.negativeDeltas, level*numIndexDims, numIndexDims); index.splitDims[level] = splitDims[level]; return index; }
if (isLeafNode()) { splitDim = -1; } else {
@Override public void pushLeft() { int nodePosition = leftNodePositions[level]; super.pushLeft(); System.arraycopy(negativeDeltas, (level-1)*numIndexDims, negativeDeltas, level*numIndexDims, numIndexDims); assert splitDim != -1; negativeDeltas[level*numIndexDims+splitDim] = true; in.setPosition(nodePosition); readNodeData(true); }
if (isLeafNode()) { splitDim = -1; } else {
public PackedIndexTree() { int treeDepth = getTreeDepth(); leafBlockFPStack = new long[treeDepth+1]; leftNodePositions = new int[treeDepth+1]; rightNodePositions = new int[treeDepth+1]; splitValuesStack = new byte[treeDepth+1][]; splitDims = new int[treeDepth+1]; negativeDeltas = new boolean[numIndexDims*(treeDepth+1)]; in = new ByteArrayDataInput(packedIndex); splitValuesStack[0] = new byte[packedIndexBytesLength]; readNodeData(false); scratch = new BytesRef(); scratch.length = bytesPerDim; }
@Override public void pushRight() { int nodePosition = rightNodePositions[level]; super.pushRight(); System.arraycopy(negativeDeltas, (level-1)*numIndexDims, negativeDeltas, level*numIndexDims, numIndexDims); assert splitDim != -1; negativeDeltas[level*numIndexDims+splitDim] = false; in.setPosition(nodePosition); readNodeData(false); }
@Override public void pushLeft() { int nodePosition = leftNodePositions[level]; super.pushLeft(); System.arraycopy(negativeDeltas, (level-1)*numIndexDims, negativeDeltas, level*numIndexDims, numIndexDims); assert splitDim != -1; negativeDeltas[level*numIndexDims+splitDim] = true; in.setPosition(nodePosition); readNodeData(true); }
@Override public BytesRef getSplitDimValue() { assert isLeafNode() == false; scratch.bytes = splitValuesStack[level]; scratch.offset = splitDim * bytesPerDim; return scratch; }
/** Create a new {@link IntersectState} */ public IntersectState getIntersectState(IntersectVisitor visitor) { IndexTree index; if (packedIndex != null) { index = new PackedIndexTree(); } else { index = new LegacyIndexTree(); } return new IntersectState(in.clone(), numDataDims, packedBytesLength, packedIndexBytesLength, maxPointsInLeafNode, visitor, index); }
@Override public PackedIndexTree clone() { PackedIndexTree index = new PackedIndexTree(); index.nodeID = nodeID; index.level = level; index.splitDim = splitDim; index.leafBlockFPStack[level] = leafBlockFPStack[level]; index.leftNodePositions[level] = leftNodePositions[level]; index.rightNodePositions[level] = rightNodePositions[level]; index.splitValuesStack[index.level] = splitValuesStack[index.level].clone(); System.arraycopy(negativeDeltas, level*numIndexDims, index.negativeDeltas, level*numIndexDims, numIndexDims); index.splitDims[level] = splitDims[level]; return index; }
@Override public long getLeafBlockFP() { assert isLeafNode(): "nodeID=" + nodeID + " is not a leaf"; return leafBlockFPStack[level]; }
/** Create a new {@link IntersectState} */ public IntersectState getIntersectState(IntersectVisitor visitor) { IndexTree index; if (packedIndex != null) { index = new PackedIndexTree(); } else { index = new LegacyIndexTree(); } return new IntersectState(in.clone(), numDataDims, packedBytesLength, packedIndexBytesLength, maxPointsInLeafNode, visitor, index); }
@Override public long getLeafBlockFP() { assert isLeafNode(): "nodeID=" + nodeID + " is not a leaf"; return leafBlockFPStack[level]; }
public PackedIndexTree() { int treeDepth = getTreeDepth(); leafBlockFPStack = new long[treeDepth+1]; leftNodePositions = new int[treeDepth+1]; rightNodePositions = new int[treeDepth+1]; splitValuesStack = new byte[treeDepth+1][]; splitDims = new int[treeDepth+1]; negativeDeltas = new boolean[numIndexDims*(treeDepth+1)]; in = new ByteArrayDataInput(packedIndex); splitValuesStack[0] = new byte[packedIndexBytesLength]; readNodeData(false); scratch = new BytesRef(); scratch.length = bytesPerDim; }
@Override public void pushRight() { int nodePosition = rightNodePositions[level]; super.pushRight(); System.arraycopy(negativeDeltas, (level-1)*numIndexDims, negativeDeltas, level*numIndexDims, numIndexDims); assert splitDim != -1; negativeDeltas[level*numIndexDims+splitDim] = false; in.setPosition(nodePosition); readNodeData(false); }
@Override public BytesRef getSplitDimValue() { assert isLeafNode() == false; scratch.bytes = splitValuesStack[level]; scratch.offset = splitDim * bytesPerDim; return scratch; }