You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/02/07 22:19:22 UTC

incubator-tinkerpop git commit: Greatly optimized all ReducingBarrierSteps in OLAP execution. I realized that there are actually two 'combine' stages. Given that the HALTED_TRAVERSERS are all group'd at a Vertex prior to MAP, you can COMBINE in Map. Thus

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1131 047ee2065 -> 388d1f25f


Greatly optimized all ReducingBarrierSteps in OLAP execution. I realized that there are actually two 'combine' stages. Given that the HALTED_TRAVERSERS are all group'd at a Vertex prior to MAP, you can COMBINE in Map. Thus, you map/combine, combine, and then reduce. For steps like outE().count(), this means that we don't Map traversers for each edge --- instead we create a single count locally before pushing off to combine/reduce. This will make GC and memory usage minimal for these operations.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/388d1f25
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/388d1f25
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/388d1f25

Branch: refs/heads/TINKERPOP-1131
Commit: 388d1f25fec61aebc175508452d74b6375bacabe
Parents: 047ee20
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Sun Feb 7 14:19:28 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Sun Feb 7 14:19:28 2016 -0700

----------------------------------------------------------------------
 .../traversal/step/map/CountGlobalStep.java     | 31 ++++++------
 .../traversal/step/map/GroupCountStep.java      | 16 ++-----
 .../process/traversal/step/map/GroupStep.java   | 10 +++-
 .../traversal/step/map/GroupStepV3d0.java       | 10 +++-
 .../traversal/step/map/MaxGlobalStep.java       | 23 +++++----
 .../traversal/step/map/MinGlobalStep.java       | 22 +++++----
 .../traversal/step/map/SumGlobalStep.java       | 23 +++++----
 .../process/traversal/step/map/TreeStep.java    | 10 ----
 .../step/util/ReducingBarrierStep.java          | 50 ++++++++++----------
 9 files changed, 106 insertions(+), 89 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
index d090832..096580d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
@@ -27,11 +27,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.Set;
@@ -61,16 +62,6 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
         return CountGlobalMapReduce.instance();
     }
 
-    @Override
-    public Traverser<Long> processNextStart() {
-        if (this.byPass) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            return traverser.asAdmin().split(1l, this); // if bypassing, just key all the traversers to 1 long (the count is going to be the bulk of course)
-        } else {
-            return super.processNextStart();
-        }
-    }
-
     ///////////
 
     private static class CountBiFunction<S> implements BiFunction<Long, Traverser<S>, Long>, Serializable {
@@ -108,7 +99,11 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
 
         @Override
         public void map(final Vertex vertex, final MapEmitter<NullObject, Long> emitter) {
-            vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.bulk())));
+            final Iterator<Long> values = IteratorUtils.map(vertex.<Set<Traverser.Admin<Long>>>property(TraversalVertexProgram.HALTED_TRAVERSERS).orElse(Collections.emptySet()).iterator(),
+                    traverser -> traverser.get() * traverser.bulk());
+            long count = getCount(values);
+            if (count > 0)
+                emitter.emit(count);
         }
 
         @Override
@@ -118,11 +113,17 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
 
         @Override
         public void reduce(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
+            long count = getCount(values);
+            if (count > 0)
+                emitter.emit(count);
+        }
+
+        private Long getCount(final Iterator<Long> longs) {
             long count = 0l;
-            while (values.hasNext()) {
-                count = count + values.next();
+            while (longs.hasNext()) {
+                count = count + longs.next();
             }
-            emitter.emit(count);
+            return count;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
index 7f3904e..95b954e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
@@ -97,16 +97,6 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
     }
 
     @Override
-    public Traverser<Map<E, Long>> processNextStart() {
-        if (this.byPass) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            return traverser.asAdmin().split(TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map<E, Long>>) this.groupTraversal), this);
-        } else {
-            return super.processNextStart();
-        }
-    }
-
-    @Override
     public String toString() {
         return StringFactory.stepString(this, this.groupTraversal);
     }
@@ -146,7 +136,11 @@ public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Lo
 
         @Override
         public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
-            vertex.<TraverserSet<E>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
+            final Map<E, Long> groupCount = new HashMap<>();
+            vertex.<TraverserSet<Map<E, Long>>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet ->
+                    traverserSet.forEach(traverser ->
+                            traverser.get().forEach((k, v) -> MapHelper.incr(groupCount, k, (v * traverser.bulk())))));
+            groupCount.forEach(emitter::emit);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
index 32a16a7..069d57e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
@@ -24,9 +24,11 @@ import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
@@ -55,7 +57,7 @@ import java.util.function.Supplier;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> implements MapReducer, TraversalParent {
+public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> implements MapReducer, EngineDependent, TraversalParent {
 
     private char state = 'k';
 
@@ -63,6 +65,7 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
     private Traversal.Admin<S, ?> valueTraversal = this.integrateChild(__.identity().asAdmin());   // used in OLAP
     private Traversal.Admin<?, V> reduceTraversal = this.integrateChild(__.fold().asAdmin());      // used in OLAP
     private Traversal.Admin<S, V> valueReduceTraversal = this.integrateChild(__.fold().asAdmin()); // used in OLTP
+    private boolean byPass = false;
 
     public GroupStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -71,6 +74,11 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>>
     }
 
     @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        this.byPass = traversalEngine.isComputer();
+    }
+
+    @Override
     public List<Traversal.Admin<?, ?>> getLocalChildren() {
         final List<Traversal.Admin<?, ?>> children = new ArrayList<>(4);
         if (null != this.keyTraversal)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
index 04acf62..a988d4e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStepV3d0.java
@@ -25,7 +25,9 @@ import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
@@ -55,13 +57,14 @@ import java.util.function.Supplier;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 @Deprecated
-public final class GroupStepV3d0<S, K, V, R> extends ReducingBarrierStep<S, Map<K, R>> implements MapReducer, TraversalParent {
+public final class GroupStepV3d0<S, K, V, R> extends ReducingBarrierStep<S, Map<K, R>> implements MapReducer, EngineDependent, TraversalParent {
 
     private char state = 'k';
 
     private Traversal.Admin<S, K> keyTraversal = null;
     private Traversal.Admin<S, V> valueTraversal = null;
     private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
+    private boolean byPass = false;
 
     public GroupStepV3d0(final Traversal.Admin traversal) {
         super(traversal);
@@ -70,6 +73,11 @@ public final class GroupStepV3d0<S, K, V, R> extends ReducingBarrierStep<S, Map<
     }
 
     @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        this.byPass = traversalEngine.isComputer();
+    }
+
+    @Override
     public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
         final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
         if (null != this.keyTraversal)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
index d876d2d..c552bab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
@@ -27,9 +27,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
 import java.util.Collections;
@@ -98,7 +98,9 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
-            vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
+            final Iterator<Number> values = IteratorUtils.map(vertex.<Set<Traverser.Admin<Number>>>property(TraversalVertexProgram.HALTED_TRAVERSERS).orElse(Collections.emptySet()).iterator(), Traverser.Admin::get);
+            if (values.hasNext())
+                emitter.emit(getMax(values));
         }
 
         @Override
@@ -108,14 +110,17 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
-            if (values.hasNext()) {
-                Number max = null;
-                while (values.hasNext()) {
-                    final Number value = values.next();
-                    max = max != null ? max(value, max) : value;
-                }
-                emitter.emit(max);
+            if (values.hasNext())
+                emitter.emit(getMax(values));
+        }
+
+        private Number getMax(final Iterator<Number> numbers) {
+            Number max = null;
+            while (numbers.hasNext()) {
+                final Number value = numbers.next();
+                max = max != null ? max(value, max) : value;
             }
+            return max;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
index 750e36c..88dd46f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
@@ -27,9 +27,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
 import java.util.Collections;
@@ -98,7 +98,9 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
-            vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
+            final Iterator<Number> values = IteratorUtils.map(vertex.<Set<Traverser.Admin<Number>>>property(TraversalVertexProgram.HALTED_TRAVERSERS).orElse(Collections.emptySet()).iterator(), Traverser.Admin::get);
+            if (values.hasNext())
+                emitter.emit(getMin(values));
         }
 
         @Override
@@ -108,14 +110,16 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
-            if (values.hasNext()) {
-                Number min = null;
-                while (values.hasNext()) {
-                    final Number value = values.next();
-                    min = min != null ? min(value, min) : value;
-                }
-                emitter.emit(min);
+            if (values.hasNext()) emitter.emit(getMin(values));
+        }
+
+        private Number getMin(final Iterator<Number> numbers) {
+            Number min = null;
+            while (numbers.hasNext()) {
+                final Number value = numbers.next();
+                min = min != null ? min(value, min) : value;
             }
+            return min;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
index 14573d1..8c13192 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
@@ -27,11 +27,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
+import java.util.Collections;
 import java.util.EnumSet;
 import java.util.Iterator;
 import java.util.Set;
@@ -104,7 +105,10 @@ public final class SumGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public void map(final Vertex vertex, final MapEmitter<NullObject, Number> emitter) {
-            vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(mul(traverser.get(), traverser.bulk()))));
+            final Iterator<Number> values = IteratorUtils.map(vertex.<Set<Traverser.Admin<Number>>>property(TraversalVertexProgram.HALTED_TRAVERSERS).orElse(Collections.emptySet()).iterator(),
+                    traverser -> mul(traverser.get(), traverser.bulk()));
+            if (values.hasNext())
+                emitter.emit(getSum(values));
         }
 
         @Override
@@ -114,13 +118,16 @@ public final class SumGlobalStep<S extends Number> extends ReducingBarrierStep<S
 
         @Override
         public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
-            if (values.hasNext()) {
-                Number sum = values.next();
-                while (values.hasNext()) {
-                    sum = add(sum, values.next());
-                }
-                emitter.emit(sum);
+            if (values.hasNext())
+                emitter.emit(getSum(values));
+        }
+
+        private Number getSum(final Iterator<Number> numbers) {
+            Number sum = numbers.next();
+            while (numbers.hasNext()) {
+                sum = add(sum, numbers.next());
             }
+            return sum;
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
index 3de0a9d..92ffb76 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
@@ -94,16 +94,6 @@ public final class TreeStep<S> extends ReducingBarrierStep<S, Tree> implements M
     }
 
     @Override
-    public Traverser<Tree> processNextStart() {
-        if (this.byPass) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            return traverser.split(this.reducingBiFunction.apply(new Tree(), traverser), this);
-        } else {
-            return super.processNextStart();
-        }
-    }
-
-    @Override
     public String toString() {
         return StringFactory.stepString(this, this.traversalRing);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/388d1f25/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
index b459071..fb7ecb7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
@@ -26,10 +26,8 @@ import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
@@ -44,14 +42,13 @@ import java.util.function.Supplier;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer, EngineDependent, Barrier {
+public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer, Barrier {
 
     public static final String REDUCING = Graph.Hidden.hide("reducing");
 
     protected Supplier<E> seedSupplier;
     protected BiFunction<E, Traverser<S>, E> reducingBiFunction;
     private boolean done = false;
-    protected boolean byPass = false;
 
     private E seed = null;
 
@@ -68,11 +65,6 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
     }
 
     @Override
-    public void onEngine(final TraversalEngine traversalEngine) {
-        this.byPass = traversalEngine.isComputer();
-    }
-
-    @Override
     public void reset() {
         super.reset();
         this.done = false;
@@ -80,27 +72,35 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
     }
 
     @Override
-    public void processAllStarts() {
-        if (!this.byPass) {
-            if (this.seed == null) this.seed = this.seedSupplier.get();
-            while (this.starts.hasNext())
-                this.seed = this.reducingBiFunction.apply(this.seed, this.starts.next());
+    public void addStarts(final Iterator<Traverser<S>> starts) {
+        if (starts.hasNext()) {
+            this.done = false;
+            super.addStarts(starts);
         }
     }
 
     @Override
+    public void addStart(final Traverser<S> start) {
+        this.done = false;
+        super.addStart(start);
+    }
+
+    @Override
+    public void processAllStarts() {
+        if (this.seed == null) this.seed = this.seedSupplier.get();
+        while (this.starts.hasNext())
+            this.seed = this.reducingBiFunction.apply(this.seed, this.starts.next());
+    }
+
+    @Override
     public Traverser<E> processNextStart() {
-        if (this.byPass) {
-            return (Traverser<E>) this.starts.next();
-        } else {
-            if (this.done)
-                throw FastNoSuchElementException.instance();
-            this.processAllStarts();
-            this.done = true;
-            final Traverser<E> traverser = TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(this.seed), (Step) this, 1l);
-            this.seed = null;
-            return traverser;
-        }
+        if (this.done)
+            throw FastNoSuchElementException.instance();
+        this.processAllStarts();
+        this.done = true;
+        final Traverser<E> traverser = TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(this.seed), (Step) this, 1l);
+        this.seed = null;
+        return traverser;
     }
 
     @Override