private void addTail(Traverser.Admin<S> start) { // Calculate the tail bulk including this new start. this.tailBulk += start.bulk(); // Evict from the tail buffer until we have enough room. while (!this.tail.isEmpty()) { final Traverser.Admin<S> oldest = this.tail.getFirst(); final long bulk = oldest.bulk(); if (this.tailBulk - bulk < limit) break; this.tail.pop(); this.tailBulk -= bulk; } this.tail.add(start); }
@Override public Map<E, Long> projectTraverser(final Traverser.Admin<S> traverser) { final Map<E, Long> map = new HashMap<>(1); map.put(TraversalUtil.applyNullable(traverser, this.keyTraversal), traverser.bulk()); return map; }
public long bulkSize() { long bulk = 0L; for (final Traverser.Admin<S> traverser : this.map.values()) { bulk = bulk + traverser.bulk(); } return bulk; }
@Override public Traverser.Admin<E> nextTraverser() { try { if (!this.locked) this.applyStrategies(); if (this.lastTraverser.bulk() > 0L) { final Traverser.Admin<E> temp = this.lastTraverser; this.lastTraverser = EmptyTraverser.instance(); return temp; } else { return this.finalEndStep.next(); } } catch (final FastNoSuchElementException e) { throw this.parent instanceof EmptyStep ? new NoSuchElementException() : e; } }
@Override public E next() { if (0L == this.lastTraverser.bulk()) this.lastTraverser = this.traversers.next(); if (1L == this.lastTraverser.bulk()) { final E temp = this.lastTraverser.get(); this.lastTraverser = EmptyTraverser.instance(); return temp; } else { this.lastTraverser.setBulk(this.lastTraverser.bulk() - 1L); return this.lastTraverser.get(); } }
@Override public S projectTraverser(final Traverser.Admin<S> traverser) { return (S) mul(traverser.get(), traverser.bulk()); }
@Override public void processAllStarts() { if (this.starts.hasNext()) { final BulkSet<Object> bulkSet = new BulkSet<>(); while (this.starts.hasNext()) { final Traverser.Admin<S> traverser = this.starts.next(); bulkSet.add(TraversalUtil.applyNullable(traverser, this.aggregateTraversal), traverser.bulk()); traverser.setStepId(this.getNextStep().getId()); // when barrier is reloaded, the traversers should be at the next step this.barrier.add(traverser); } this.getTraversal().getSideEffects().add(this.sideEffectKey, bulkSet); } }
@Override public boolean hasNext() { return this.lastTraverser.bulk() > 0L || this.traversers.hasNext(); }
@Override public E projectTraverser(final Traverser.Admin<S> traverser) { return (E) new MeanNumber(traverser.get(), traverser.bulk()); }
@Override public Long projectTraverser(final Traverser.Admin<S> traverser) { return traverser.bulk(); }
@Override public long bulk() { return this.baseTraverser.bulk(); }
@Override protected void sideEffect(final Traverser.Admin<S> traverser) { final BulkSet<Object> bulkSet = new BulkSet<>(); bulkSet.add(TraversalUtil.applyNullable(traverser, this.storeTraversal), traverser.bulk()); this.getTraversal().getSideEffects().add(this.sideEffectKey, bulkSet); }
@Override protected void sideEffect(final Traverser.Admin<S> traverser) { final Map<E, Long> map = new HashMap<>(1); map.put(TraversalUtil.applyNullable(traverser, this.keyTraversal), traverser.bulk()); this.getTraversal().getSideEffects().add(this.sideEffectKey, map); }
@Override public E projectTraverser(final Traverser.Admin<S> traverser) { if (this.listFold) { final List<S> list = new ArrayList<>(); for (long i = 0; i < traverser.bulk(); i++) { list.add(traverser.get()); } return (E) list; } else { return (E) traverser.get(); } }
@Override public boolean hasNext() { if (!this.locked) this.applyStrategies(); return this.lastTraverser.bulk() > 0L || this.finalEndStep.hasNext(); }
@Override public void merge(final Traverser.Admin<?> other) { super.merge(other); this.bulk = this.bulk + other.bulk(); }
@Override public Object next() { if (this.bulker.isEmpty()) this.fillBulker(); final Traverser.Admin t = this.haltedTraverserStrategy.halt(this.bulker.remove()); return new DefaultRemoteTraverser<>(t.get(), t.bulk()); }
@Override public Traverser.Admin<E> nextTraverser() { // the lastTraverser is initialized as "empty" at start of iteration so the initial pass through will // call next() to begin the iteration if (0L == this.lastTraverser.bulk()) return this.traversers.next(); else { final Traverser.Admin<E> temp = this.lastTraverser; this.lastTraverser = EmptyTraverser.instance(); return temp; } }
@Override public E next() { try { if (!this.locked) this.applyStrategies(); if (this.lastTraverser.bulk() == 0L) this.lastTraverser = this.finalEndStep.next(); this.lastTraverser.setBulk(this.lastTraverser.bulk() - 1L); return this.lastTraverser.get(); } catch (final FastNoSuchElementException e) { throw this.parent instanceof EmptyStep ? new NoSuchElementException() : e; } }
@Override public void accept(final TraverserSet<Object> traverserSet) { Number total = 0.0; for (final Traverser.Admin<Object> traverser : traverserSet) { total = add(total, mul(traverser.sack(), traverser.bulk())); } for (final Traverser.Admin<Object> traverser : traverserSet) { traverser.sack(div(mul(traverser.sack(), traverser.bulk()), total)); } } }