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/19 21:02:29 UTC

[2/2] incubator-tinkerpop git commit: GroupStep (group()) and GroupSideEffectStep (group(key)) now exist.

GroupStep (group()) and GroupSideEffectStep (group(key)) now exist.


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

Branch: refs/heads/master
Commit: 0d4f1d9364a680a63a014c0d9bcff95028c603df
Parents: 1d3a8af
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Feb 19 13:02:14 2015 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Feb 19 13:02:24 2015 -0700

----------------------------------------------------------------------
 .../graph/traversal/ElementTraversal.java       |  45 ++--
 .../process/graph/traversal/GraphTraversal.java |  29 +--
 .../gremlin/process/graph/traversal/__.java     |  24 +-
 .../traversal/step/map/GroupCountStep.java      |   2 +-
 .../graph/traversal/step/map/GroupStep.java     | 243 ++++++++++++++++++
 .../step/sideEffect/AggregateStep.java          |   8 +-
 .../step/sideEffect/GroupSideEffectStep.java    | 244 +++++++++++++++++++
 .../traversal/step/sideEffect/GroupStep.java    | 156 ------------
 .../traversal/step/sideEffect/StoreStep.java    |  10 +-
 .../sideEffect/mapreduce/GroupMapReduce.java    | 126 ----------
 .../step/filter/GroovyDedupTest.groovy          |  17 +-
 .../step/filter/GroovySampleTest.groovy         |   8 +-
 .../traversal/step/map/GroovyMaxTest.groovy     |   4 +-
 .../traversal/step/map/GroovyMeanTest.groovy    |   4 +-
 .../traversal/step/map/GroovyMinTest.groovy     |   4 +-
 .../traversal/step/map/GroovySelectTest.groovy  |   6 +-
 .../traversal/step/map/GroovySumTest.groovy     |   4 +-
 .../step/sideEffect/GroovyAggregateTest.groovy  |  16 +-
 .../graph/traversal/step/filter/DedupTest.java  |   8 +-
 .../graph/traversal/step/filter/SampleTest.java |   4 +-
 .../graph/traversal/step/map/MaxTest.java       |   2 +-
 .../graph/traversal/step/map/MeanTest.java      |   2 +-
 .../graph/traversal/step/map/MinTest.java       |   2 +-
 .../graph/traversal/step/map/SelectTest.java    |   8 +-
 .../graph/traversal/step/map/SumTest.java       |   2 +-
 .../step/sideEffect/AggregateTest.java          |  20 +-
 .../tinkergraph/structure/TinkerGraphTest.java  |   5 +-
 27 files changed, 591 insertions(+), 412 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
index a45b101..d7f2b7d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/ElementTraversal.java
@@ -18,14 +18,29 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal;
 
-import org.apache.tinkerpop.gremlin.process.*;
-import org.apache.tinkerpop.gremlin.structure.*;
+import org.apache.tinkerpop.gremlin.process.Path;
+import org.apache.tinkerpop.gremlin.process.Scope;
+import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
 
 import java.util.Collection;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.function.*;
+import java.util.function.BiFunction;
+import java.util.function.BiPredicate;
+import java.util.function.BinaryOperator;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Predicate;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -196,6 +211,14 @@ public abstract interface ElementTraversal<A extends Element> {
         return this.start().mean(scope);
     }
 
+    public default <K, R> GraphTraversal<A, Map<K, R>> group() {
+        return this.start().group();
+    }
+
+    public default <B> GraphTraversal<A, Map<B, Long>> groupCount() {
+        return this.start().<B>groupCount();
+    }
+
     ///////////////////// FILTER STEPS /////////////////////
 
     public default GraphTraversal<A, A> filter(final Predicate<Traverser<A>> predicate) {
@@ -380,26 +403,14 @@ public abstract interface ElementTraversal<A extends Element> {
         return this.start().aggregate(sideEffectKey);
     }
 
-    public default GraphTraversal<A, A> aggregate() {
-        return this.start().aggregate();
-    }
-
     public default GraphTraversal<A, A> group(final String sideEffectKey) {
         return this.start().group(sideEffectKey);
     }
 
-    public default GraphTraversal<A, A> group() {
-        return this.start().group();
-    }
-
     public default GraphTraversal<A, A> groupCount(final String sideEffectKey) {
         return this.start().groupCount(sideEffectKey);
     }
 
-    public default <B> GraphTraversal<A, Map<B,Long>> groupCount() {
-        return this.start().<B>groupCount();
-    }
-
     public default GraphTraversal<A, Vertex> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
         return this.start().addE(direction, edgeLabel, stepLabel, propertyKeyValues);
     }
@@ -440,10 +451,6 @@ public abstract interface ElementTraversal<A extends Element> {
         return this.start().store(sideEffectKey);
     }
 
-    public default GraphTraversal<A, A> store() {
-        return this.start().store();
-    }
-
     ///////////////////// BRANCH STEPS /////////////////////
 
     public default <M, E2> GraphTraversal<A, E2> branch(final Function<Traverser<A>, M> function) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
index a0a8526..8faec59 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
@@ -57,6 +57,7 @@ import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeOtherVe
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.FoldStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroupCountStep;
+import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroupStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.IdStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.KeyStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LabelStep;
@@ -87,7 +88,7 @@ import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.Match
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AddEdgeStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupCountSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupStep;
+import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupSideEffectStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectStep;
 import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.LambdaSideEffectStep;
@@ -355,6 +356,14 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.asAdmin().addStep(scope.equals(Scope.global) ? new MeanGlobalStep<>(this.asAdmin()) : new MeanLocalStep<>(this.asAdmin()));
     }
 
+    public default <K, R> GraphTraversal<S, Map<K, R>> group() {
+        return this.asAdmin().addStep(new GroupStep<>(this.asAdmin()));
+    }
+
+    public default <E2> GraphTraversal<S, Map<E2, Long>> groupCount() {
+        return this.asAdmin().addStep(new GroupCountStep<>(this.asAdmin()));
+    }
+
     ///////////////////// FILTER STEPS /////////////////////
 
     public default GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) {
@@ -547,26 +556,14 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.asAdmin().addStep(new AggregateStep<>(this.asAdmin(), sideEffectKey));
     }
 
-    public default GraphTraversal<S, E> aggregate() {
-        return this.aggregate(null);
-    }
-
     public default GraphTraversal<S, E> group(final String sideEffectKey) {
-        return this.asAdmin().addStep(new GroupStep<>(this.asAdmin(), sideEffectKey));
-    }
-
-    public default GraphTraversal<S, E> group() {
-        return this.group(null);
+        return this.asAdmin().addStep(new GroupSideEffectStep<>(this.asAdmin(), sideEffectKey));
     }
 
     public default GraphTraversal<S, E> groupCount(final String sideEffectKey) {
         return this.asAdmin().addStep(new GroupCountSideEffectStep<>(this.asAdmin(), sideEffectKey));
     }
 
-    public default <E2> GraphTraversal<S, Map<E2, Long>> groupCount() {
-        return this.asAdmin().addStep(new GroupCountStep<>(this.asAdmin()));
-    }
-
     public default GraphTraversal<S, Vertex> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
         return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, stepLabel, propertyKeyValues));
     }
@@ -607,10 +604,6 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), sideEffectKey));
     }
 
-    public default GraphTraversal<S, E> store() {
-        return this.store(null);
-    }
-
     public default GraphTraversal<S, E> profile() {
         return this.asAdmin().addStep(new ProfileStep<>(this.asAdmin()));
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
index ed9156a..18e0009 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
@@ -246,6 +246,14 @@ public class __ {
         return __.<A>start().mean(scope);
     }
 
+    public static <A, K, R> GraphTraversal<A, Map<K, R>> group() {
+        return __.<A>start().group();
+    }
+
+    public static <A, B> GraphTraversal<A, Map<B, Long>> groupCount() {
+        return __.<A>start().<B>groupCount();
+    }
+
     ///////////////////// FILTER STEPS /////////////////////
 
     public static <A> GraphTraversal<A, A> filter(final Predicate<Traverser<A>> predicate) {
@@ -430,26 +438,14 @@ public class __ {
         return __.<A>start().aggregate(sideEffectKey);
     }
 
-    public static <A> GraphTraversal<A, A> aggregate() {
-        return __.<A>start().aggregate();
-    }
-
     public static <A> GraphTraversal<A, A> group(final String sideEffectKey) {
         return __.<A>start().group(sideEffectKey);
     }
 
-    public static <A> GraphTraversal<A, A> group() {
-        return __.<A>start().group();
-    }
-
     public static <A> GraphTraversal<A, A> groupCount(final String sideEffectKey) {
         return __.<A>start().groupCount(sideEffectKey);
     }
 
-    public static <A,B> GraphTraversal<A, Map<B, Long>> groupCount() {
-        return __.<A>start().<B>groupCount();
-    }
-
     public static <A> GraphTraversal<A, Vertex> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
         return __.<A>start().addE(direction, edgeLabel, stepLabel, propertyKeyValues);
     }
@@ -490,10 +486,6 @@ public class __ {
         return __.<A>start().store(sideEffectKey);
     }
 
-    public static <A> GraphTraversal<A, A> store() {
-        return __.<A>start().store();
-    }
-
     ///////////////////// BRANCH STEPS /////////////////////
 
     public static <A, M, E2> GraphTraversal<A, E2> branch(final Function<Traverser<A>, M> function) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
index 8696191..c289b44 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
@@ -47,7 +47,7 @@ import java.util.function.BiFunction;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements MapReducer, TraversalParent {
+public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements MapReducer, TraversalParent {
 
     private Traversal.Admin<S, E> groupTraversal = new IdentityTraversal<>();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java
new file mode 100644
index 0000000..6df4828
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java
@@ -0,0 +1,243 @@
+/*
+ * 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.graph.traversal.step.map;
+
+import org.apache.commons.configuration.Configuration;
+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.graph.traversal.step.sideEffect.GroupSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+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.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.io.Serializable;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GroupStep<S, K, V, R> extends ReducingBarrierStep<S, Map<K, R>> implements MapReducer, TraversalParent {
+
+    private char state = 'k';
+
+    private Traversal.Admin<S, K> keyTraversal = new IdentityTraversal<>();
+    private Traversal.Admin<S, V> valueTraversal = new IdentityTraversal<>();
+    private Traversal.Admin<Collection<V>, R> reduceTraversal = new IdentityTraversal<>();
+
+    public GroupStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier(() -> (Map) new GroupMap());
+        this.setBiFunction((BiFunction) new GroupReducingBiFunction());
+    }
+
+    @Override
+    public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
+        return null == this.reduceTraversal ? (List) Arrays.asList(this.keyTraversal, this.valueTraversal) : (List) Arrays.asList(this.keyTraversal, this.valueTraversal, this.reduceTraversal);
+    }
+
+    public Traversal.Admin<Collection<V>, R> getReduceTraversal() {
+        return this.reduceTraversal;
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> kvrTraversal) {
+        if ('k' == this.state) {
+            this.keyTraversal = this.integrateChild(kvrTraversal);
+            this.state = 'v';
+        } else if ('v' == this.state) {
+            this.valueTraversal = this.integrateChild(kvrTraversal);
+            this.state = 'r';
+        } else if ('r' == this.state) {
+            this.reduceTraversal = this.integrateChild(kvrTraversal);
+            this.state = 'x';
+        } else {
+            throw new IllegalStateException("The key, value, and reduce functions for group()-step have already been set");
+        }
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
+    }
+
+    @Override
+    public GroupStep<S, K, V, R> clone() throws CloneNotSupportedException {
+        final GroupStep<S, K, V, R> clone = (GroupStep<S, K, V, R>) super.clone();
+        clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
+        clone.valueTraversal = clone.integrateChild(this.valueTraversal.clone());
+        if (null != this.reduceTraversal)
+            clone.reduceTraversal = clone.integrateChild(this.reduceTraversal.clone());
+        return clone;
+    }
+
+    @Override
+    public MapReduce<K, Collection<V>, K, R, Map<K, R>> getMapReduce() {
+        return new GroupReducingMapReduce<>(this);
+    }
+
+    @Override
+    public Traverser<Map<K, R>> processNextStart() {
+        if (this.byPass) {
+            final Traverser.Admin<S> traverser = this.starts.next();
+            final Object[] kvPair = new Object[]{TraversalUtil.apply(traverser, (Traversal.Admin<S, Map>) this.keyTraversal), TraversalUtil.apply(traverser, (Traversal.Admin<S, Map>) this.valueTraversal)};
+            return traverser.asAdmin().split(kvPair, (Step) this);
+        } else {
+            return super.processNextStart();
+        }
+    }
+
+    ///////////
+
+    private class GroupReducingBiFunction implements BiFunction<Map<K, Collection<V>>, Traverser.Admin<S>, Map<K, Collection<V>>>, Serializable {
+
+        private GroupReducingBiFunction() {
+
+        }
+
+        @Override
+        public Map<K, Collection<V>> apply(final Map<K, Collection<V>> mutatingSeed, final Traverser.Admin<S> traverser) {
+            this.doGroup(traverser, mutatingSeed, keyTraversal, valueTraversal);
+            return mutatingSeed;
+        }
+
+        private void doGroup(final Traverser.Admin<S> traverser, final Map<K, Collection<V>> groupMap, final Traversal.Admin<S, K> keyTraversal, final Traversal.Admin<S, V> valueTraversal) {
+            final K key = TraversalUtil.apply(traverser, keyTraversal);
+            final V value = TraversalUtil.apply(traverser, valueTraversal);
+            Collection<V> values = groupMap.get(key);
+            if (null == values) {
+                values = new BulkSet<>();
+                groupMap.put(key, values);
+            }
+            TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
+        }
+    }
+
+    //////////
+
+    private class GroupMap extends HashMap<K, Collection<V>> implements FinalGet<Map<K, R>> {
+
+        @Override
+        public Map<K, R> getFinal() {
+            final Map<K, R> reduceMap = new HashMap<>();
+            this.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.apply(vv, reduceTraversal)));
+            return reduceMap;
+        }
+    }
+
+    ///////////
+
+    public static final class GroupReducingMapReduce<K, V, R> implements MapReduce<K, Collection<V>, K, R, Map<K, R>> {
+
+        public static final String GROUP_BY_STEP_STEP_ID = "gremlin.groupStep.stepId";
+
+        private String groupStepId;
+        private Traversal.Admin<Collection<V>, R> reduceTraversal;
+
+        private GroupReducingMapReduce() {
+
+        }
+
+        public GroupReducingMapReduce(final GroupStep step) {
+            this.groupStepId = step.getId();
+            this.reduceTraversal = step.getReduceTraversal();
+        }
+
+        @Override
+        public void storeState(final Configuration configuration) {
+            MapReduce.super.storeState(configuration);
+            configuration.setProperty(GROUP_BY_STEP_STEP_ID, this.groupStepId);
+        }
+
+        @Override
+        public void loadState(final Configuration configuration) {
+            this.groupStepId = configuration.getString(GROUP_BY_STEP_STEP_ID);
+            final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
+            if (!traversal.isLocked())
+                traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
+            final GroupSideEffectStep groupSideEffectStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
+            this.reduceTraversal = groupSideEffectStep.getReduceTraversal();
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return !stage.equals(Stage.COMBINE);
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<K, Collection<V>> emitter) {
+            vertex.<TraverserSet<Object[]>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> {
+                final Object[] objects = traverser.get();
+                emitter.emit((K) objects[0], objects[1] instanceof Collection ? (Collection<V>) objects[1] : Arrays.asList((V) objects[1]));
+            }));
+        }
+
+        @Override
+        public void reduce(final K key, final Iterator<Collection<V>> values, final ReduceEmitter<K, R> emitter) {
+            final Set<V> set = new BulkSet<>();
+            values.forEachRemaining(set::addAll);
+            emitter.emit(key, null == this.reduceTraversal ? (R) set : TraversalUtil.apply(set, this.reduceTraversal));
+        }
+
+        @Override
+        public Map<K, R> generateFinalResult(final Iterator<KeyValue<K, R>> keyValues) {
+            final Map<K, R> map = new HashMap<>();
+            keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+            return map;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public GroupReducingMapReduce<K, V, R> clone() throws CloneNotSupportedException {
+            final GroupReducingMapReduce<K, V, R> clone = (GroupReducingMapReduce<K, V, R>) super.clone();
+            if (null != clone.reduceTraversal)
+                clone.reduceTraversal = this.reduceTraversal.clone();
+            return clone;
+        }
+
+        @Override
+        public String toString() {
+            return StringFactory.mapReduceString(this, this.getMemoryKey());
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
index 51bc77c..5d7bc80 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
@@ -26,7 +26,6 @@ import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.Collecting
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Reversible;
-import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
@@ -42,7 +41,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class AggregateStep<S> extends CollectingBarrierStep<S> implements SideEffectRegistrar, SideEffectCapable, Reversible, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+public final class AggregateStep<S> extends CollectingBarrierStep<S> implements SideEffectCapable, Reversible, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
 
     private Traversal.Admin<S, Object> aggregateTraversal = new IdentityTraversal<>();
     private String sideEffectKey;
@@ -50,11 +49,6 @@ public final class AggregateStep<S> extends CollectingBarrierStep<S> implements
     public AggregateStep(final Traversal.Admin traversal, final String sideEffectKey) {
         super(traversal);
         this.sideEffectKey = sideEffectKey;
-    }
-
-    @Override
-    public void registerSideEffects() {
-        if (null == this.sideEffectKey) this.sideEffectKey = this.getId();
         this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java
new file mode 100644
index 0000000..d9b9a26
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java
@@ -0,0 +1,244 @@
+/*
+ * 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.graph.traversal.step.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+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.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+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.Reversible;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GroupSideEffectStep<S, K, V, R> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, Reversible, EngineDependent, MapReducer<K, Collection<V>, K, R, Map<K, R>> {
+
+    private char state = 'k';
+    private Traversal.Admin<S, K> keyTraversal = new IdentityTraversal<>();
+    private Traversal.Admin<S, V> valueTraversal = new IdentityTraversal<>();
+    private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
+    private String sideEffectKey;
+    private boolean onGraphComputer = false;
+    private Map<K, Collection<V>> tempGroupByMap;
+
+    public GroupSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
+        super(traversal);
+        this.sideEffectKey = sideEffectKey;
+        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<S> traverser) {
+        final Map<K, Collection<V>> groupByMap = null == this.tempGroupByMap ? traverser.sideEffects(this.sideEffectKey) : this.tempGroupByMap; // for nested traversals and not !starts.hasNext()
+        doGroup(traverser.asAdmin(), groupByMap, this.keyTraversal, this.valueTraversal);
+        if (!this.onGraphComputer && null != this.reduceTraversal && !this.starts.hasNext()) {
+            this.tempGroupByMap = groupByMap;
+            final Map<K, R> reduceMap = new HashMap<>();
+            doReduce(groupByMap, reduceMap, this.reduceTraversal);
+            traverser.sideEffects(this.sideEffectKey, reduceMap);
+        }
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    private static <S, K, V> void doGroup(final Traverser.Admin<S> traverser, final Map<K, Collection<V>> groupMap, final Traversal.Admin<S, K> keyTraversal, final Traversal.Admin<S, V> valueTraversal) {
+        final K key = TraversalUtil.apply(traverser, keyTraversal);
+        final V value = TraversalUtil.apply(traverser, valueTraversal);
+        Collection<V> values = groupMap.get(key);
+        if (null == values) {
+            values = new BulkSet<>();
+            groupMap.put(key, values);
+        }
+        TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
+    }
+
+    private static <K, V, R> void doReduce(final Map<K, Collection<V>> groupMap, final Map<K, R> reduceMap, final Traversal.Admin<Collection<V>, R> reduceTraversal) {
+        groupMap.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.apply(vv, reduceTraversal)));
+    }
+
+    @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        this.onGraphComputer = traversalEngine.isComputer();
+    }
+
+    @Override
+    public MapReduce<K, Collection<V>, K, R, Map<K, R>> getMapReduce() {
+        return new GroupSideEffectMapReduce<>(this);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
+    }
+
+    @Override
+    public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
+        return null == this.reduceTraversal ? (List) Arrays.asList(this.keyTraversal, this.valueTraversal) : (List) Arrays.asList(this.keyTraversal, this.valueTraversal, this.reduceTraversal);
+    }
+
+    public Traversal.Admin<Collection<V>, R> getReduceTraversal() {
+        return this.reduceTraversal;
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> kvrTraversal) {
+        if ('k' == this.state) {
+            this.keyTraversal = this.integrateChild(kvrTraversal);
+            this.state = 'v';
+        } else if ('v' == this.state) {
+            this.valueTraversal = this.integrateChild(kvrTraversal);
+            this.state = 'r';
+        } else if ('r' == this.state) {
+            this.reduceTraversal = this.integrateChild(kvrTraversal);
+            this.state = 'x';
+        } else {
+            throw new IllegalStateException("The key, value, and reduce functions for group()-step have already been set");
+        }
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
+    }
+
+    @Override
+    public GroupSideEffectStep<S, K, V, R> clone() throws CloneNotSupportedException {
+        final GroupSideEffectStep<S, K, V, R> clone = (GroupSideEffectStep<S, K, V, R>) super.clone();
+        clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
+        clone.valueTraversal = clone.integrateChild(this.valueTraversal.clone());
+        if (null != this.reduceTraversal)
+            clone.reduceTraversal = clone.integrateChild(this.reduceTraversal.clone());
+        return clone;
+    }
+
+    ///////////
+
+    public static final class GroupSideEffectMapReduce<K, V, R> implements MapReduce<K, Collection<V>, K, R, Map<K, R>> {
+
+        public static final String GROUP_BY_STEP_SIDE_EFFECT_KEY = "gremlin.groupStep.sideEffectKey";
+        public static final String GROUP_BY_STEP_STEP_ID = "gremlin.groupStep.stepId";
+
+        private String sideEffectKey;
+        private String groupStepId;
+        private Traversal.Admin<Collection<V>, R> reduceTraversal;
+        private Supplier<Map<K, R>> mapSupplier;
+
+        private GroupSideEffectMapReduce() {
+
+        }
+
+        public GroupSideEffectMapReduce(final GroupSideEffectStep step) {
+            this.groupStepId = step.getId();
+            this.sideEffectKey = step.getSideEffectKey();
+            this.reduceTraversal = step.getReduceTraversal();
+            this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<K, R>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+        }
+
+        @Override
+        public void storeState(final Configuration configuration) {
+            MapReduce.super.storeState(configuration);
+            configuration.setProperty(GROUP_BY_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+            configuration.setProperty(GROUP_BY_STEP_STEP_ID, this.groupStepId);
+        }
+
+        @Override
+        public void loadState(final Configuration configuration) {
+            this.sideEffectKey = configuration.getString(GROUP_BY_STEP_SIDE_EFFECT_KEY);
+            this.groupStepId = configuration.getString(GROUP_BY_STEP_STEP_ID);
+            final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
+            if (!traversal.isLocked())
+                traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
+            final GroupSideEffectStep groupSideEffectStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
+            this.reduceTraversal = groupSideEffectStep.getReduceTraversal();
+            this.mapSupplier = traversal.getSideEffects().<Map<K, R>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return !stage.equals(Stage.COMBINE);
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<K, Collection<V>> emitter) {
+            VertexTraversalSideEffects.of(vertex).<Map<K, Collection<V>>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach(emitter::emit);
+        }
+
+        @Override
+        public void reduce(final K key, final Iterator<Collection<V>> values, final ReduceEmitter<K, R> emitter) {
+            final Set<V> set = new BulkSet<>();
+            values.forEachRemaining(set::addAll);
+            emitter.emit(key, (null == this.reduceTraversal) ? (R) set : TraversalUtil.apply(set, this.reduceTraversal));
+        }
+
+        @Override
+        public Map<K, R> generateFinalResult(final Iterator<KeyValue<K, R>> keyValues) {
+            final Map<K, R> map = this.mapSupplier.get();
+            keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+            return map;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return this.sideEffectKey;
+        }
+
+        @Override
+        public GroupSideEffectMapReduce<K, V, R> clone() throws CloneNotSupportedException {
+            final GroupSideEffectMapReduce<K, V, R> clone = (GroupSideEffectMapReduce<K, V, R>) super.clone();
+            if (null != clone.reduceTraversal)
+                clone.reduceTraversal = this.reduceTraversal.clone();
+            return clone;
+        }
+
+        @Override
+        public String toString() {
+            return StringFactory.mapReduceString(this, this.getMemoryKey());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
deleted file mode 100644
index 95c67c7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupStep.java
+++ /dev/null
@@ -1,156 +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.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapreduce.GroupMapReduce;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-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.Reversible;
-import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GroupStep<S, K, V, R> extends SideEffectStep<S> implements SideEffectCapable, SideEffectRegistrar, TraversalParent, Reversible, EngineDependent, MapReducer<Object, Collection, Object, Object, Map> {
-
-    private char state = 'k';
-    private Traversal.Admin<S, K> keyTraversal = new IdentityTraversal<>();
-    private Traversal.Admin<S, V> valueTraversal = new IdentityTraversal<>();
-    private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
-    private String sideEffectKey;
-    private boolean onGraphComputer = false;
-    private Map<K, Collection<V>> tempGroupByMap;
-
-    public GroupStep(final Traversal.Admin traversal, final String sideEffectKey) {
-        super(traversal);
-        this.sideEffectKey = sideEffectKey;
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<S> traverser) {
-        final Map<K, Collection<V>> groupByMap = null == this.tempGroupByMap ? traverser.sideEffects(this.sideEffectKey) : this.tempGroupByMap; // for nested traversals and not !starts.hasNext()
-        doGroup(traverser.asAdmin(), groupByMap, this.keyTraversal, this.valueTraversal);
-        if (!this.onGraphComputer && null != this.reduceTraversal && !this.starts.hasNext()) {
-            this.tempGroupByMap = groupByMap;
-            final Map<K, R> reduceMap = new HashMap<>();
-            doReduce(groupByMap, reduceMap, this.reduceTraversal);
-            traverser.sideEffects(this.sideEffectKey, reduceMap);
-        }
-    }
-
-    @Override
-    public String getSideEffectKey() {
-        return this.sideEffectKey;
-    }
-
-    @Override
-    public void registerSideEffects() {
-        if (this.sideEffectKey == null) this.sideEffectKey = this.getId();
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, HashMapSupplier.instance());
-    }
-
-    private static <S, K, V> void doGroup(final Traverser.Admin<S> traverser, final Map<K, Collection<V>> groupMap, final Traversal.Admin<S, K> keyTraversal, final Traversal.Admin<S, V> valueTraversal) {
-        final K key = TraversalUtil.apply(traverser, keyTraversal);
-        final V value = TraversalUtil.apply(traverser, valueTraversal);
-        Collection<V> values = groupMap.get(key);
-        if (null == values) {
-            values = new BulkSet<>();
-            groupMap.put(key, values);
-        }
-        TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
-    }
-
-    private static <K, V, R> void doReduce(final Map<K, Collection<V>> groupMap, final Map<K, R> reduceMap, final Traversal.Admin<Collection<V>, R> reduceTraversal) {
-        groupMap.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.apply(vv, reduceTraversal)));
-    }
-
-    @Override
-    public void onEngine(final TraversalEngine traversalEngine) {
-        this.onGraphComputer = traversalEngine.isComputer();
-    }
-
-    @Override
-    public MapReduce<Object, Collection, Object, Object, Map> getMapReduce() {
-        return new GroupMapReduce(this);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
-    }
-
-    @Override
-    public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
-        return null == this.reduceTraversal ? (List) Arrays.asList(this.keyTraversal, this.valueTraversal) : (List) Arrays.asList(this.keyTraversal, this.valueTraversal, this.reduceTraversal);
-    }
-
-    public Traversal.Admin<Collection<V>, R> getReduceTraversal() {
-        return this.reduceTraversal;
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> kvrTraversal) {
-        if ('k' == this.state) {
-            this.keyTraversal = this.integrateChild(kvrTraversal);
-            this.state = 'v';
-        } else if ('v' == this.state) {
-            this.valueTraversal = this.integrateChild(kvrTraversal);
-            this.state = 'r';
-        } else if ('r' == this.state) {
-            this.reduceTraversal = this.integrateChild(kvrTraversal);
-            this.state = 'x';
-        } else {
-            throw new IllegalStateException("The key, value, and reduce functions for group()-step have already been set");
-        }
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
-    }
-
-    @Override
-    public GroupStep<S, K, V, R> clone() throws CloneNotSupportedException {
-        final GroupStep<S, K, V, R> clone = (GroupStep<S, K, V, R>) super.clone();
-        clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
-        clone.valueTraversal = clone.integrateChild(this.valueTraversal.clone());
-        if (null != this.reduceTraversal)
-            clone.reduceTraversal = clone.integrateChild(this.reduceTraversal.clone());
-        return clone;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
index d97186f..c89df07 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
@@ -26,7 +26,6 @@ import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.mapr
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Reversible;
-import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectRegistrar;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
@@ -41,7 +40,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectCapable, SideEffectRegistrar, Reversible, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectCapable, Reversible, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
 
     private Traversal.Admin<S, Object> storeTraversal = new IdentityTraversal<>();
     private String sideEffectKey;
@@ -49,6 +48,7 @@ public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectC
     public StoreStep(final Traversal.Admin traversal, final String sideEffectKey) {
         super(traversal);
         this.sideEffectKey = sideEffectKey;
+        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
     }
 
     @Override
@@ -60,12 +60,6 @@ public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectC
     }
 
     @Override
-    public void registerSideEffects() {
-        if (null == this.sideEffectKey) this.sideEffectKey = this.getId();
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
-    }
-
-    @Override
     public String getSideEffectKey() {
         return this.sideEffectKey;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
deleted file mode 100644
index a431d02..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/mapreduce/GroupMapReduce.java
+++ /dev/null
@@ -1,126 +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.graph.traversal.step.sideEffect.mapreduce;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-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.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupStep;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GroupMapReduce implements MapReduce<Object, Collection, Object, Object, Map> {
-
-    public static final String GROUP_BY_STEP_SIDE_EFFECT_KEY = "gremlin.groupStep.sideEffectKey";
-    public static final String GROUP_BY_STEP_STEP_ID = "gremlin.groupStep.stepId";
-
-    private String sideEffectKey;
-    private String groupStepId;
-    private Traversal.Admin reduceFunction;
-    private Supplier<Map> mapSupplier;
-
-    private GroupMapReduce() {
-
-    }
-
-    public GroupMapReduce(final GroupStep step) {
-        this.groupStepId = step.getId();
-        this.sideEffectKey = step.getSideEffectKey();
-        this.reduceFunction = step.getReduceTraversal();
-        this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
-    }
-
-    @Override
-    public void storeState(final Configuration configuration) {
-        MapReduce.super.storeState(configuration);
-        configuration.setProperty(GROUP_BY_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
-        configuration.setProperty(GROUP_BY_STEP_STEP_ID, this.groupStepId);
-    }
-
-    @Override
-    public void loadState(final Configuration configuration) {
-        this.sideEffectKey = configuration.getString(GROUP_BY_STEP_SIDE_EFFECT_KEY);
-        this.groupStepId = configuration.getString(GROUP_BY_STEP_STEP_ID);
-        final Traversal.Admin<?, ?> traversal = TraversalVertexProgram.getTraversalSupplier(configuration).get();
-        if (!traversal.isLocked())
-            traversal.applyStrategies(); // TODO: this is a scary error prone requirement, but only a problem for GroupStep
-        final GroupStep groupStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
-        this.reduceFunction = groupStep.getReduceTraversal();
-        this.mapSupplier = traversal.getSideEffects().<Map>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
-    }
-
-    @Override
-    public boolean doStage(final Stage stage) {
-        return !stage.equals(Stage.COMBINE);
-    }
-
-    @Override
-    public void map(final Vertex vertex, final MapEmitter<Object, Collection> emitter) {
-        VertexTraversalSideEffects.of(vertex).<Map<Object, Collection>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach(emitter::emit);
-    }
-
-    @Override
-    public void reduce(final Object key, final Iterator<Collection> values, final ReduceEmitter<Object, Object> emitter) {
-        final Set set = new BulkSet<>();
-        values.forEachRemaining(set::addAll);
-        emitter.emit(key, (null == this.reduceFunction) ? set : TraversalUtil.apply(set, this.reduceFunction));
-    }
-
-    @Override
-    public Map generateFinalResult(final Iterator<KeyValue<Object, Object>> keyValues) {
-        final Map map = this.mapSupplier.get();
-        keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
-        return map;
-    }
-
-    @Override
-    public String getMemoryKey() {
-        return this.sideEffectKey;
-    }
-
-    @Override
-    public GroupMapReduce clone() throws CloneNotSupportedException {
-        final GroupMapReduce clone = (GroupMapReduce) super.clone();
-        if (null != clone.reduceFunction)
-            clone.reduceFunction = this.reduceFunction.clone();
-        return clone;
-    }
-
-    @Override
-    public String toString() {
-        return StringFactory.mapReduceString(this, this.getMemoryKey());
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
index 33a1f41..51c1c27 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
@@ -18,14 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter
 
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
+import org.apache.tinkerpop.gremlin.process.*
 import org.apache.tinkerpop.gremlin.structure.Vertex
 import org.junit.Test
 
@@ -56,8 +49,8 @@ public abstract class GroovyDedupTest {
         }
 
         @Override
-        Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX_cap() {
-            g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local)).cap()
+        Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+            g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local))
         }
     }
 
@@ -82,8 +75,8 @@ public abstract class GroovyDedupTest {
         }
 
         @Override
-        public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX_cap() {
-            ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local)).cap()", g);
+        public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+            ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(dedup(Scope.local))", g);
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
index 21da6f2..dbbc4ae 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
@@ -59,12 +59,12 @@ public abstract class GroovySampleTest {
 
         @Override
         Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
-            g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2)).cap()
+            g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2))
         }
 
         @Override
         Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
-            g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5)).cap()
+            g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5))
         }
     }
 
@@ -92,12 +92,12 @@ public abstract class GroovySampleTest {
 
         @Override
         Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
-            ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2)).cap()", g)
+            ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 2))", g)
         }
 
         @Override
         Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
-            ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5)).cap()", g)
+            ComputerTestHelper.compute("g.V().group().by(T.label).by(bothE().values('weight').fold()).by(sample(Scope.local, 5))", g)
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
index e5beac1..b66c2f6 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
@@ -49,7 +49,7 @@ public abstract class GroovyMaxTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
-            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local)).cap()
+            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local))
         }
     }
 
@@ -68,7 +68,7 @@ public abstract class GroovyMaxTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
-            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local)).cap()", g)
+            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(max(Scope.local))", g)
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
index 0cd0539..d291d1a 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
@@ -43,7 +43,7 @@ public abstract class GroovyMeanTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
-            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local)).cap()
+            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local))
         }
     }
 
@@ -57,7 +57,7 @@ public abstract class GroovyMeanTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
-            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local)).cap()", g)
+            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(mean(Scope.local))", g)
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
index bceb3eb..4f6f871 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
@@ -49,7 +49,7 @@ public abstract class GroovyMinTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
-            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local)).cap()
+            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local))
         }
     }
 
@@ -68,7 +68,7 @@ public abstract class GroovyMinTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
-            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local)).cap()", g)
+            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(min(Scope.local))", g)
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
index 16d030d..d953e72 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
@@ -67,8 +67,8 @@ public abstract class GroovySelectTest {
         }
 
         @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregate_asXbX_select_byXnameX() {
-            g.V.as('a').out.aggregate.as('b').select.by('name')
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
+            g.V.as('a').out.aggregate('x').as('b').select.by('name')
         }
 
         @Override
@@ -176,7 +176,7 @@ public abstract class GroovySelectTest {
         }
 
         @Override
-        Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregate_asXbX_select_byXnameX() {
+        Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
             // override with nothing until the test itself is supported
             return null
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
index 04aeeb1..03545a5 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
@@ -43,7 +43,7 @@ public abstract class GroovySumTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
-            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local)).cap()
+            g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local))
         }
     }
 
@@ -57,7 +57,7 @@ public abstract class GroovySumTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
-            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local)).cap()", g)
+            ComputerTestHelper.compute("g.V().hasLabel('software').group().by('name').by(bothE().values('weight').fold()).by(sum(Scope.local))", g)
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
index 140fbb4..3edd991 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
@@ -35,13 +35,13 @@ public abstract class GroovyAggregateTest {
     public static class StandardTraversals extends AggregateTest {
 
         @Override
-        public Traversal<Vertex, List<String>> get_g_V_name_aggregate() {
-            g.V.name.aggregate
+        public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
+            g.V.name.aggregate('x').cap('x')
         }
 
         @Override
-        public Traversal<Vertex, List<String>> get_g_V_aggregate_byXnameX() {
-            g.V.aggregate.by('name')
+        public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
+            g.V.aggregate('x').by('name').cap('x')
         }
 
         @Override
@@ -54,13 +54,13 @@ public abstract class GroovyAggregateTest {
     public static class ComputerTraversals extends AggregateTest {
 
         @Override
-        public Traversal<Vertex, List<String>> get_g_V_name_aggregate() {
-            ComputerTestHelper.compute("g.V.name.aggregate", g)
+        public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
+            ComputerTestHelper.compute("g.V.name.aggregate('x').cap('x')", g)
         }
 
         @Override
-        public Traversal<Vertex, List<String>> get_g_V_aggregate_byXnameX() {
-            ComputerTestHelper.compute("g.V.aggregate.by('name')", g)
+        public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
+            ComputerTestHelper.compute("g.V.aggregate('x').by('name').cap('x')", g)
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
index e50a171..2477c31 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
@@ -51,7 +51,7 @@ public abstract class DedupTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup();
 
-    public abstract Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX_cap();
+    public abstract Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
 
     @Test
     @LoadGraphWith(MODERN)
@@ -103,7 +103,7 @@ public abstract class DedupTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX_cap() {
         final Traversal<Vertex, Map<String, Set<Double>>> traversal =
-                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX_cap();
+                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
         printTraversalForm(traversal);
         assertTrue(traversal.hasNext());
         final Map<String, Set<Double>> map = traversal.next();
@@ -135,8 +135,8 @@ public abstract class DedupTest extends AbstractGremlinProcessTest {
         }
 
         @Override
-        public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX_cap() {
-            return g.V().group().by(T.label).by(bothE().values("weight").fold()).by(dedup(Scope.local)).cap();
+        public Traversal<Vertex, Map<String, Set<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+            return g.V().<String,Set<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(dedup(Scope.local));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
index bceefad..df65486 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
@@ -137,12 +137,12 @@ public abstract class SampleTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
-            return g.V().group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 2)).cap();
+            return g.V().<String,Collection<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 2));
         }
 
         @Override
         public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
-            return g.V().group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 5)).cap();
+            return g.V().<String,Collection<Double>>group().by(T.label).by(bothE().values("weight").fold()).by(sample(Scope.local, 5));
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
index 07b8aad..6db12d2 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
@@ -87,7 +87,7 @@ public abstract class MaxTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
-            return g.V().hasLabel("software").group().by("name").by(bothE().values("weight").fold()).by(max(Scope.local)).cap();
+            return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(max(Scope.local));
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
index 527510e..6cfb94f 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
@@ -82,7 +82,7 @@ public abstract class MeanTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
-            return g.V().hasLabel("software").group().by("name").by(bothE().values("weight").fold()).by(mean(Scope.local)).cap();
+            return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(mean(Scope.local));
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
index 62964bf..7dae819 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
@@ -87,7 +87,7 @@ public abstract class MinTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
-            return g.V().hasLabel("software").group().by("name").by(bothE().values("weight").fold()).by(min(Scope.local)).cap();
+            return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(min(Scope.local));
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
index 5acf947..a537ae3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
@@ -53,7 +53,7 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX();
 
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregate_asXbX_select_byXnameX();
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX();
 
     public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX();
 
@@ -132,7 +132,7 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
     public void g_V_asXaX_out_asXbX_select_byXnameX() {
         Arrays.asList(
                 get_g_V_asXaX_out_asXbX_select_byXnameX(),
-                get_g_V_asXaX_out_aggregate_asXbX_select_byXnameX()).forEach(traversal -> {
+                get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX()).forEach(traversal -> {
             printTraversalForm(traversal);
             final List<Map<String, String>> expected = makeMapList(2,
                     "a", "marko", "b", "lop",
@@ -278,8 +278,8 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
         }
 
         @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregate_asXbX_select_byXnameX() {
-            return g.V().as("a").out().aggregate().as("b").<String>select().by("name");
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_aggregateXxX_asXbX_select_byXnameX() {
+            return g.V().as("a").out().aggregate("x").as("b").<String>select().by("name");
         }
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/0d4f1d93/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
index 2dd2797..9a08519 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
@@ -77,7 +77,7 @@ public abstract class SumTest extends AbstractGremlinProcessTest {
 
         @Override
         public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
-            return g.V().hasLabel("software").group().by("name").by(bothE().values("weight").fold()).by(sum(Scope.local)).cap();
+            return g.V().hasLabel("software").<String, Number>group().by("name").by(bothE().values("weight").fold()).by(sum(Scope.local));
         }
     }
 }
\ No newline at end of file