/** * * @param DIM dimensions * @param valTemplate A null indicates that no values are to be extracted. */ public NodeIteratorNoGC(int DIM, long[] valTemplate) { this.DIM = DIM; this.valTemplate = valTemplate; this.nextPost1 = new PhEntry<T>(new long[DIM], null); this.nextPost2 = new PhEntry<T>(new long[DIM], null); }
/** * Get post-fix. * @param hcPos * @param in The entry to check. * @param range After the method call, this contains the postfix if the postfix matches the * range. Otherwise it contains only part of the postfix. * @return NodeEntry if the postfix matches the range, otherwise null. */ @SuppressWarnings("unchecked") <T> boolean checkAndGetEntryNt(long hcPos, Object value, PhEntry<T> result, long[] valTemplate, long[] rangeMin, long[] rangeMax) { if (value instanceof Node) { Node sub = (Node) value; if (!checkAndApplyInfixNt(sub.getInfixLen(), result.getKey(), valTemplate, rangeMin, rangeMax)) { return false; } result.setNodeInternal(sub); } else { long[] inKey = result.getKey(); for (int i = 0; i < inKey.length; i++) { long k = inKey[i]; if (k < rangeMin[i] || k > rangeMax[i]) { return false; } } result.setValueInternal((T) value); } return true; }
private long[] returnAnyValue(long[] ret, long[] key, Node node) { //First, get correct prefix. long mask = (-1L) << (node.getPostLen()+1); for (int i = 0; i < dims; i++) { ret[i] = key[i] & mask; } NodeIteratorFullNoGC<T> ni = new NodeIteratorFullNoGC<>(dims, ret); //This allows writing the result directly into 'ret' PhEntry<T> result = new PhEntry<>(ret, null); ni.init(node, null); while (ni.increment(result)) { if (result.hasNodeInternal()) { //traverse sub node ni.init((Node) result.getNodeInternal(), null); } else { //Never return closest key if we look for nMin>1 keys! if (nMin > 1 && Arrays.equals(key, result.getKey())) { //Never return a perfect match if we look for nMin>1 keys! //otherwise the distance is too small. //This check should be cheap and will not be executed more than once anyway. continue; } return ret; } } throw new IllegalStateException(); }
@SuppressWarnings("unchecked") private boolean readValue(BSTEntry entry, PhEntry<T> result) { long[] kdKey = entry.getKdKey(); Object value = entry.getValue(); if (value instanceof Node) { Node sub = (Node) value; if (checker != null && !checker.isValid(sub.postLenStored()+1, kdKey)) { return false; } result.setKeyInternal(kdKey); result.setNodeInternal(sub); } else { if (checker != null && !checker.isValid(kdKey)) { return false; } result.setKeyInternal(kdKey); //ensure that 'node' is set to null result.setValueInternal((T) value); } return true; }
private void findNextElement() { PhEntry<T> result = resultFree; while (!stack.isEmpty()) { NodeIteratorFullNoGC<T> p = stack.peek(); while (p.increment(result)) { if (result.hasNodeInternal()) { p = stack.prepareAndPush((Node) result.getNodeInternal()); continue; } else { resultFree = resultToReturn; resultToReturn = result; return; } } // no matching (more) elements found stack.pop(); } //finished isFinished = true; }
private void findNextElement() { PhEntry<T> result = resultFree; while (!stack.isEmpty()) { NodeIteratorNoGC<T> p = stack.peek(); while (p.increment(result)) { if (result.hasNodeInternal()) { p = stack.prepareAndPush((Node) result.getNodeInternal(), result.getKey()); continue; } else { resultFree = resultToReturn; resultToReturn = result; return; } } // no matching (more) elements found stack.pop(); } //finished isFinished = true; }
@Override public T next() { T v = nextEntryReuse().getValue(); return v == PhTreeHelper.NULL ? null : v; }
/** * * @return False if the value does not match the range, otherwise true. */ private boolean readValue(long pos, int offsPostKey, PhEntry<T> result) { long[] key = result.getKey(); System.arraycopy(valTemplate, 0, key, 0, DIM); PhTreeHelper.applyHcPos(pos, postLen, key); result.setValue( node.getPostPOB(offsPostKey, pos, key) ); if (checker != null && !checker.isValid(key)) { return false; } //Don't set to 'null' here, that interferes with parallel iteration over post/sub //nextSubNode = null; isNextPost1free = !isNextPost1free; return true; }
@Override void phOffer(PhEntry<T> e) { list.add((PhEntryDist<T>) e); free = createEntry(pool, new long[e.getKey().length], null, 0); }
@Override public String toString() { return super.toString() + " dist=" + dist; } }
public void set(T val, double dist) { super.setValue(val); this.dist = dist; }
private long[] returnAnyValue(long[] ret, long[] key, Node node) { //First, get correct prefix. long mask = (-1L) << (node.getPostLen()+1); for (int i = 0; i < dims; i++) { ret[i] = key[i] & mask; } NodeIteratorFullNoGC<T> ni = new NodeIteratorFullNoGC<>(dims, ret); //This allows writing the result directly into 'ret' PhEntry<T> result = new PhEntry<>(ret, null); ni.init(node, null); while (ni.increment(result)) { if (result.hasNodeInternal()) { //traverse sub node ni.init((Node) result.getNodeInternal(), null); } else { //Never return closest key if we look for nMin>1 keys! if (nMin > 1 && Arrays.equals(key, result.getKey())) { //Never return a perfect match if we look for nMin>1 keys! //otherwise the distance is too small. //This check should be cheap and will not be executed more than once anyway. continue; } return ret; } } throw new IllegalStateException(); }
@SuppressWarnings("unchecked") private boolean readValue(BSTEntry entry, PhEntry<T> result) { long[] kdKey = entry.getKdKey(); Object value = entry.getValue(); if (value instanceof Node) { Node sub = (Node) value; if (checker != null && !checker.isValid(sub.postLenStored()+1, kdKey)) { return false; } result.setKeyInternal(kdKey); result.setNodeInternal(sub); } else { if (checker != null && !checker.isValid(kdKey)) { return false; } result.setKeyInternal(kdKey); //ensure that 'node' is set to null result.setValueInternal((T) value); } return true; }
private void findNextElement() { PhEntry<T> result = resultFree; while (!stack.isEmpty()) { NodeIteratorNoGC<T> p = stack.peek(); while (p.increment(result)) { if (result.hasNodeInternal()) { p = stack.prepareAndPush((Node) result.getNodeInternal()); continue; } else { resultFree = resultToReturn; resultToReturn = result; return; } } // no matching (more) elements found stack.pop(); } //finished isFinished = true; }
private void findNextElement() { PhEntry<T> result = resultFree; while (!stack.isEmpty()) { NodeIteratorNoGC<T> p = stack.peek(); while (p.increment(result)) { if (result.hasNodeInternal()) { p = stack.prepareAndPush((Node) result.getNodeInternal(), result.getKey()); continue; } else { resultFree = resultToReturn; resultToReturn = result; return; } } // no matching (more) elements found stack.pop(); } //finished isFinished = true; }
@Override public T next() { T v = nextEntryReuse().getValue(); return v == PhTreeHelper.NULL ? null : v; }