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 2015/02/18 23:21:57 UTC

incubator-tinkerpop git commit: Count and Max are now MapReducers proper.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/reducingbarrier a949e6125 -> b2871597c


Count and Max are now MapReducers proper.


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

Branch: refs/heads/reducingbarrier
Commit: b2871597c361fc81fa5075705cd36efba3d271b5
Parents: a949e61
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Feb 18 15:21:58 2015 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Feb 18 15:21:58 2015 -0700

----------------------------------------------------------------------
 .../traversal/step/map/ComputerResultStep.java  |  2 +-
 .../traversal/step/filter/DedupGlobalStep.java  | 11 +--
 .../traversal/step/map/CountGlobalStep.java     | 33 ++++-----
 .../graph/traversal/step/map/FoldStep.java      | 27 ++++---
 .../graph/traversal/step/map/MaxGlobalStep.java | 58 +++++++++++++--
 .../traversal/step/map/MeanGlobalStep.java      |  8 +--
 .../graph/traversal/step/map/MinGlobalStep.java |  8 +--
 .../graph/traversal/step/map/SumGlobalStep.java |  8 +--
 .../step/util/ReducingBarrierStep.java          | 59 +++++++---------
 .../process/traversal/step/Reducing.java        | 74 --------------------
 10 files changed, 116 insertions(+), 172 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index eb86435..4c0fe83 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -106,7 +106,7 @@ public final class ComputerResultStep<S> extends AbstractStep<S, S> {
                 this.traversers = IteratorUtils.of(this.getTraversal().getTraverserGenerator().generate((S) sideEffects, this, 1l));
             }
         } else if (endStep instanceof ReducingBarrierStep) {
-            this.traversers = result.memory().get(Graph.Hidden.hide("reducingBarrier"));
+            this.traversers = result.memory().get(ReducingBarrierStep.REDUCING);
         } else {
             this.traversers = result.memory().get(TraverserMapReduce.TRAVERSERS);
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
index b4950be..0476353 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Reversible;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -36,7 +35,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class DedupGlobalStep<S> extends FilterStep<S> implements Reversible, Reducing<Set<Object>, S>, TraversalParent {
+public final class DedupGlobalStep<S> extends FilterStep<S> implements Reversible, TraversalParent {
 
     private Traversal.Admin<S, Object> dedupTraversal = new IdentityTraversal<>();
     private Set<Object> duplicateSet = new HashSet<>();
@@ -63,14 +62,6 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Reversibl
     }
 
     @Override
-    public Reducer<Set<Object>, S> getReducer() {
-        return new Reducer<>(HashSet::new, (set, start) -> {
-            set.add(TraversalUtil.apply(start, this.dedupTraversal));
-            return set;
-        }, false, true);
-    }
-
-    @Override
     public DedupGlobalStep<S> clone() throws CloneNotSupportedException {
         final DedupGlobalStep<S> clone = (DedupGlobalStep<S>) super.clone();
         clone.duplicateSet = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
index 62c714f..28e413d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
@@ -27,10 +27,8 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr
 import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
@@ -44,7 +42,7 @@ import java.util.function.BiFunction;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements Reducing<Long, Traverser<S>>, MapReducer {
+public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements MapReducer {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.BULK);
 
@@ -61,13 +59,8 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
     }
 
     @Override
-    public Reducer<Long, Traverser<S>> getReducer() {
-        return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> getMapReduce() {
-        return (MapReduce) new CountMapReduce();
+    public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Iterator<Traverser.Admin<Long>>> getMapReduce() {
+        return new CountMapReduce();
     }
 
     ///////////
@@ -100,16 +93,6 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
         }
 
         @Override
-        public String getMemoryKey() {
-            return Graph.Hidden.hide("reducingBarrier");
-        }
-
-        @Override
-        public Iterator<Traverser.Admin<Long>> generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
-            return IteratorUtils.of(getTraversal().getTraverserGenerator().generate(keyValues.hasNext() ? keyValues.next().getValue() : 0L, (Step) CountGlobalStep.this, 1L));
-        }
-
-        @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())));
         }
@@ -127,6 +110,16 @@ public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> imple
             }
             emitter.emit(count);
         }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public Iterator<Traverser.Admin<Long>> generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
+            return IteratorUtils.of(getTraversal().getTraverserGenerator().generate(keyValues.hasNext() ? keyValues.next().getValue() : 0L, (Step) CountGlobalStep.this, 1L));
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
index fb2dfbf..885c2fe 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
 
@@ -35,7 +34,7 @@ import java.util.function.Supplier;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements Reducing<E, S> {
+public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
 
@@ -46,12 +45,7 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
     public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
         super(traversal);
         this.setSeedSupplier(seed);
-        this.setBiFunction(new ObjectBiFunction<>(foldFunction));
-    }
-
-    @Override
-    public Reducer<E, S> getReducer() {
-        return new Reducer<>(this.getSeedSupplier(), ((ObjectBiFunction<S, E>) this.getBiFunction()).getBiFunction(), false, false);
+        this.setBiFunction(new FoldBiFunction<>(foldFunction));
     }
 
     @Override
@@ -79,4 +73,21 @@ public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> implements R
             return INSTANCE;
         }
     }
+
+    ///////
+
+    public static class FoldBiFunction<S, E> implements BiFunction<E, Traverser<S>, E>, Serializable {
+
+        private final BiFunction<E, S, E> biFunction;
+
+        public FoldBiFunction(final BiFunction<E, S, E> biFunction) {
+            this.biFunction = biFunction;
+        }
+
+        @Override
+        public E apply(final E seed, final Traverser<S> traverser) {
+            return this.biFunction.apply(seed, traverser.get());
+        }
+
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
index 1765340..0cfb574 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
@@ -18,22 +18,31 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
 
+import org.apache.tinkerpop.gremlin.process.Step;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.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.Iterator;
 import java.util.Set;
 import java.util.function.BiFunction;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements Reducing<S, Traverser<S>> {
+public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
 
     public MaxGlobalStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -47,8 +56,8 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
     }
 
     @Override
-    public Reducer<S, Traverser<S>> getReducer() {
-        return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
+    public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Iterator<Traverser.Admin<Number>>> getMapReduce() {
+        return new MaxMapReduce();
     }
 
     /////
@@ -70,4 +79,45 @@ public final class MaxGlobalStep<S extends Number> extends ReducingBarrierStep<S
             return INSTANCE;
         }
     }
+
+    ///////////
+
+    private class MaxMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Iterator<Traverser.Admin<Number>>> {
+
+        @Override
+        public boolean doStage(final MapReduce.Stage stage) {
+            return true;
+        }
+
+        @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())));
+        }
+
+        @Override
+        public void combine(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+            this.reduce(key, values, emitter);
+        }
+
+        @Override
+        public void reduce(final NullObject key, final Iterator<Number> values, final ReduceEmitter<NullObject, Number> emitter) {
+            Number max = -Double.MAX_VALUE;
+            while (values.hasNext()) {
+                final Number value = values.next();
+                if (value.doubleValue() > max.doubleValue())
+                    max = value;
+            }
+            emitter.emit(max);
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public Iterator<Traverser.Admin<Number>> generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+            return IteratorUtils.of(getTraversal().getTraverserGenerator().generate(keyValues.hasNext() ? keyValues.next().getValue() : -Double.MAX_VALUE, (Step) MaxGlobalStep.this, 1L));
+        }
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
index 4e656a2..f9c8a05 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
 
@@ -34,7 +33,7 @@ import java.util.function.Supplier;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> implements Reducing<E, Traverser<S>> {
+public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT, TraverserRequirement.BULK);
 
@@ -49,11 +48,6 @@ public final class MeanGlobalStep<S extends Number, E extends Number> extends Re
         return REQUIREMENTS;
     }
 
-    @Override
-    public Reducer<E, Traverser<S>> getReducer() {
-        return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), false, true);
-    }
-
     /////
 
     private static class MeanBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
index 1c190cb..876717d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 
@@ -33,7 +32,7 @@ import java.util.function.BiFunction;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements Reducing<S, Traverser<S>> {
+public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> {
 
     public MinGlobalStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -46,11 +45,6 @@ public final class MinGlobalStep<S extends Number> extends ReducingBarrierStep<S
         return Collections.singleton(TraverserRequirement.OBJECT);
     }
 
-    @Override
-    public Reducer<S, Traverser<S>> getReducer() {
-        return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
-    }
-
     /////
 
     private static class MinBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
index be8f4e3..1f2842b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.graph.traversal.step.map;
 import org.apache.tinkerpop.gremlin.process.Traversal;
 import org.apache.tinkerpop.gremlin.process.Traverser;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
 import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 
@@ -33,7 +32,7 @@ import java.util.function.BiFunction;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> implements Reducing<Double, Traverser<Number>> {
+public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
             TraverserRequirement.BULK,
@@ -52,11 +51,6 @@ public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> imp
         return REQUIREMENTS;
     }
 
-    @Override
-    public Reducer<Double, Traverser<Number>> getReducer() {
-        return new Reducer<>(this.getSeedSupplier(), this.getBiFunction(), true, true);
-    }
-
     /////
 
     private static class SumBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
index 9e1ab48..a861b27 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
@@ -28,7 +28,6 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr
 import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
 import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Reducing;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -36,6 +35,7 @@ import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
+import java.util.Collections;
 import java.util.Iterator;
 import java.util.function.BiFunction;
 import java.util.function.Supplier;
@@ -45,10 +45,12 @@ import java.util.function.Supplier;
  */
 public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer {
 
+    public static final String REDUCING = Graph.Hidden.hide("reducing");
+
     private Supplier<E> seedSupplier;
     private BiFunction<E, Traverser<S>, E> reducingBiFunction;
     private boolean done = false;
-    private boolean byPass =false;
+    private boolean byPass = false;
 
     public ReducingBarrierStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -82,8 +84,8 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
 
     @Override
     public Traverser<E> processNextStart() {
-        if(this.byPass) {
-          return (Traverser<E>) this.starts.next();
+        if (this.byPass) {
+            return (Traverser<E>) this.starts.next();
         } else {
             if (this.done)
                 throw FastNoSuchElementException.instance();
@@ -91,7 +93,7 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
             while (this.starts.hasNext())
                 seed = this.reducingBiFunction.apply(seed, this.starts.next());
             this.done = true;
-            return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(Reducing.FinalGet.tryFinalGet(seed), (Step) this, 1l);
+            return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(seed), (Step) this, 1l);
         }
     }
 
@@ -109,28 +111,7 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
 
     ///////
 
-    public static class ObjectBiFunction<S, E> implements BiFunction<E, Traverser<S>, E>, Serializable {
-
-        private final BiFunction<E, S, E> biFunction;
-
-        public ObjectBiFunction(final BiFunction<E, S, E> biFunction) {
-            this.biFunction = biFunction;
-        }
-
-        public final BiFunction<E, S, E> getBiFunction() {
-            return this.biFunction;
-        }
-
-        @Override
-        public E apply(final E seed, final Traverser<S> traverser) {
-            return this.biFunction.apply(seed, traverser.get());
-        }
-
-    }
-
-    ///////
-
-    public class DefaultMapReduce extends StaticMapReduce {
+    public class DefaultMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Object> {
 
         @Override
         public boolean doStage(Stage stage) {
@@ -139,31 +120,41 @@ public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> imple
 
         @Override
         public String getMemoryKey() {
-            return Graph.Hidden.hide("reducingBarrier");
+            return REDUCING;
         }
 
         @Override
         public Object generateFinalResult(final Iterator keyValues) {
-            return IteratorUtils.of(((KeyValue) keyValues.next()).getValue());
+            return keyValues.hasNext() ? IteratorUtils.of(((KeyValue) keyValues.next()).getValue()) : Collections.emptyIterator();
 
         }
 
         @Override
-        public void map(final Vertex vertex, final MapEmitter emitter) {
+        public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
             vertex.<TraverserSet<?>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(emitter::emit));
         }
 
         @Override
-        public void reduce(final Object key, final Iterator values, final ReduceEmitter emitter) {
+        public void reduce(final NullObject key, final Iterator<Object> values, final ReduceEmitter<NullObject, Object> emitter) {
             Object mutatingSeed = getSeedSupplier().get();
             final BiFunction function = getBiFunction();
-            final boolean onTraverser = true;
             while (values.hasNext()) {
-                mutatingSeed = function.apply(mutatingSeed, onTraverser ? values.next() : ((Traverser) values.next()).get());
+                mutatingSeed = function.apply(mutatingSeed, values.next());
             }
-            emitter.emit(key, getTraversal().getTraverserGenerator().generate(Reducing.FinalGet.tryFinalGet(mutatingSeed), (Step) getTraversal().getEndStep(), 1l));
+            emitter.emit(getTraversal().getTraverserGenerator().generate(FinalGet.tryFinalGet(mutatingSeed), (Step) getTraversal().getEndStep(), 1l));
         }
 
     }
 
+    /////
+
+    public interface FinalGet<A> {
+
+        public A getFinal();
+
+        public static <A> A tryFinalGet(final Object object) {
+            return object instanceof FinalGet ? ((FinalGet<A>) object).getFinal() : (A) object;
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b2871597/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java
deleted file mode 100644
index 16e62b1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Reducing.java
+++ /dev/null
@@ -1,74 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.step;
-
-import java.io.Serializable;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Reducing<A, B> {
-
-    public Reducer<A, B> getReducer();
-
-    //////////
-
-    public class Reducer<A, B> implements Serializable {
-        private final Supplier<A> seedSupplier;
-        private final BiFunction<A, B, A> biFunction;
-        private final boolean onTraverser;
-        private final boolean supportsCombiner;
-
-        public Reducer(final Supplier<A> seedSupplier, final BiFunction<A, B, A> biFunction, final boolean supportsCombiner, final boolean onTraverser) {
-            this.seedSupplier = seedSupplier;
-            this.biFunction = biFunction;
-            this.supportsCombiner = supportsCombiner;
-            this.onTraverser = onTraverser;
-        }
-
-        public Supplier<A> getSeedSupplier() {
-            return this.seedSupplier;
-        }
-
-        public BiFunction<A, B, A> getBiFunction() {
-            return this.biFunction;
-        }
-
-        public boolean supportsCombiner() {
-            return this.supportsCombiner;
-        }
-
-        public boolean onTraverser() {
-            return this.onTraverser;
-        }
-    }
-
-    //////////
-
-    public interface FinalGet<A> {
-
-        public A getFinal();
-
-        public static <A> A tryFinalGet(final Object object) {
-            return object instanceof FinalGet ? ((FinalGet<A>) object).getFinal() : (A) object;
-        }
-    }
-}