@Override public TreeStep<S> clone() { final TreeStep<S> clone = (TreeStep<S>) super.clone(); clone.traversalRing = this.traversalRing.clone(); return clone; }
@Override public MemoryComputeKey<E> getMemoryComputeKey() { return MemoryComputeKey.of(this.getId(), this.getBiOperator(), false, true); }
@Override public Traverser.Admin<E> processNextStart() { this.processAllStarts(); if (this.seed == null) throw FastNoSuchElementException.instance(); final Traverser.Admin<E> traverser = this.getTraversal().getTraverserGenerator().generate(this.generateFinalResult(this.seed), (Step<E, E>) this, 1l); this.seed = null; return traverser; }
.fold(Double.NaN, NumberHelper::max); } else if (endStep instanceof FoldStep) { final BinaryOperator biOperator = endStep.getBiOperator(); result = nextRDD.map(traverser -> { if (endStep.getSeedSupplier() instanceof ArrayListSupplier) { final List list = new ArrayList<>(); for (long i = 0; i < traverser.bulk(); i++) { return traverser.get(); }).fold(endStep.getSeedSupplier().get(), biOperator::apply); } else if (endStep instanceof GroupStep) { final GroupStep.GroupBiOperator<Object, Object> biOperator = (GroupStep.GroupBiOperator) endStep.getBiOperator(); result = ((GroupStep) endStep).generateFinalResult(nextRDD. mapPartitions(partitions -> { final GroupStep<Object, Object, Object> clone = (GroupStep) endStep.clone(); return IteratorUtils.map(partitions, clone::projectTraverser); }).fold(((GroupStep<Object, Object, Object>) endStep).getSeedSupplier().get(), biOperator::apply)); result = nextRDD .mapPartitions(partitions -> { final GroupCountStep<Object, Object> clone = (GroupCountStep) endStep.clone(); return IteratorUtils.map(partitions, clone::projectTraverser); })
@Override public boolean hasNextBarrier() { this.processAllStarts(); return null != this.seed; }
protected static void processMemory(final TraversalMatrix<?, ?> traversalMatrix, final Memory memory, final TraverserSet<Object> toProcessTraversers, final Set<String> completedBarriers) { // handle traversers and data that were sent from the workers to the master traversal via memory if (memory.exists(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { for (final String key : memory.<Set<String>>get(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { final Step<Object, Object> step = traversalMatrix.getStepById(key); assert step instanceof Barrier; completedBarriers.add(step.getId()); if (!(step instanceof LocalBarrier)) { // local barriers don't do any processing on the master traversal (they just lock on the workers) final Barrier<Object> barrier = (Barrier<Object>) step; barrier.addBarrier(memory.get(key)); step.forEachRemaining(toProcessTraversers::add); // if it was a reducing barrier step, reset the barrier to its seed value if (step instanceof ReducingBarrierStep) memory.set(step.getId(), ((ReducingBarrierStep) step).getSeedSupplier().get()); } } } memory.set(TraversalVertexProgram.MUTATED_MEMORY_KEYS, new HashSet<>()); }
@Override public int hashCode() { int result = super.hashCode(); if (this.keyTraversal != null) result ^= this.keyTraversal.hashCode(); return result; }
@Override public void processAllStarts() { if (this.hasProcessedOnce && !this.starts.hasNext()) return; this.hasProcessedOnce = true; if (this.seed == null) this.seed = this.seedSupplier.get(); while (this.starts.hasNext()) this.seed = this.reducingBiOperator.apply(this.seed, this.projectTraverser(this.starts.next())); }
@Override public E nextBarrier() { if (!this.hasNextBarrier()) throw FastNoSuchElementException.instance(); else { final E temp = this.seed; this.seed = null; return temp; } }
.fold(Double.NaN, NumberHelper::max); } else if (endStep instanceof FoldStep) { final BinaryOperator biOperator = endStep.getBiOperator(); result = nextRDD.map(traverser -> { if (endStep.getSeedSupplier() instanceof ArrayListSupplier) { final List list = new ArrayList<>(); for (long i = 0; i < traverser.bulk(); i++) { return traverser.get(); }).fold(endStep.getSeedSupplier().get(), biOperator::apply); } else if (endStep instanceof GroupStep) { final GroupStep.GroupBiOperator<Object, Object> biOperator = (GroupStep.GroupBiOperator) endStep.getBiOperator(); result = ((GroupStep) endStep).generateFinalResult(nextRDD. mapPartitions(partitions -> { final GroupStep<Object, Object, Object> clone = (GroupStep) endStep.clone(); return IteratorUtils.map(partitions, clone::projectTraverser); }).fold(((GroupStep<Object, Object, Object>) endStep).getSeedSupplier().get(), biOperator::apply)); result = nextRDD .mapPartitions(partitions -> { final GroupCountStep<Object, Object> clone = (GroupCountStep) endStep.clone(); return IteratorUtils.map(partitions, clone::projectTraverser); })
@Override public void processAllStarts() { if (this.starts.hasNext()) super.processAllStarts(); }
protected static void processMemory(final TraversalMatrix<?, ?> traversalMatrix, final Memory memory, final TraverserSet<Object> toProcessTraversers, final Set<String> completedBarriers) { // handle traversers and data that were sent from the workers to the master traversal via memory if (memory.exists(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { for (final String key : memory.<Set<String>>get(TraversalVertexProgram.MUTATED_MEMORY_KEYS)) { final Step<Object, Object> step = traversalMatrix.getStepById(key); assert step instanceof Barrier; completedBarriers.add(step.getId()); if (!(step instanceof LocalBarrier)) { // local barriers don't do any processing on the master traversal (they just lock on the workers) final Barrier<Object> barrier = (Barrier<Object>) step; barrier.addBarrier(memory.get(key)); step.forEachRemaining(toProcessTraversers::add); // if it was a reducing barrier step, reset the barrier to its seed value if (step instanceof ReducingBarrierStep) memory.set(step.getId(), ((ReducingBarrierStep) step).getSeedSupplier().get()); } } } memory.set(TraversalVertexProgram.MUTATED_MEMORY_KEYS, new HashSet<>()); }
@Override public int hashCode() { int result = super.hashCode(); if (this.keyTraversal != null) result ^= this.keyTraversal.hashCode(); result ^= this.valueTraversal.hashCode(); return result; }
@Override public void processAllStarts() { if (this.hasProcessedOnce && !this.starts.hasNext()) return; this.hasProcessedOnce = true; if (this.seed == null) this.seed = this.seedSupplier.get(); while (this.starts.hasNext()) this.seed = this.reducingBiOperator.apply(this.seed, this.projectTraverser(this.starts.next())); }
@Override public E nextBarrier() { if (!this.hasNextBarrier()) throw FastNoSuchElementException.instance(); else { final E temp = this.seed; this.seed = null; return temp; } }
@Override public GroupCountStep<S, E> clone() { final GroupCountStep<S, E> clone = (GroupCountStep<S, E>) super.clone(); if (null != this.keyTraversal) clone.keyTraversal = this.keyTraversal.clone(); return clone; }
@Override public Traverser.Admin<E> processNextStart() { this.processAllStarts(); if (this.seed == null) throw FastNoSuchElementException.instance(); final Traverser.Admin<E> traverser = this.getTraversal().getTraverserGenerator().generate(this.generateFinalResult(this.seed), (Step<E, E>) this, 1l); this.seed = null; return traverser; }
@Override public MemoryComputeKey<E> getMemoryComputeKey() { return MemoryComputeKey.of(this.getId(), this.getBiOperator(), false, true); }
@Override public void processAllStarts() { if (this.starts.hasNext()) super.processAllStarts(); }
@Override public int hashCode() { return super.hashCode() ^ this.traversalRing.hashCode(); }