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/03/19 19:26:19 UTC

[01/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master b563dc3d7 -> 4c97e9646


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.java
deleted file mode 100644
index 60f9221..0000000
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/strategy/TinkerGraphStepStrategy.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.tinkergraph.process.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.tinkergraph.process.graph.traversal.sideEffect.TinkerGraphStep;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
-
-    private static final TinkerGraphStepStrategy INSTANCE = new TinkerGraphStepStrategy();
-
-    private TinkerGraphStepStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getEngine().isComputer())
-            return;
-
-        final Step<?, ?> startStep = traversal.getStartStep();
-        if (startStep instanceof GraphStep) {
-            final GraphStep<?> originalGraphStep = (GraphStep) startStep;
-            final TinkerGraphStep<?> tinkerGraphStep = new TinkerGraphStep<>(originalGraphStep);
-            TraversalHelper.replaceStep(startStep, (Step) tinkerGraphStep, traversal);
-
-            Step<?, ?> currentStep = tinkerGraphStep.getNextStep();
-            while (true) {
-                if (currentStep instanceof HasContainerHolder) {
-                    tinkerGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
-                    if (currentStep.getLabel().isPresent()) {
-                        final IdentityStep identityStep = new IdentityStep<>(traversal);
-                        identityStep.setLabel(currentStep.getLabel().get());
-                        TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
-                    }
-                    traversal.removeStep(currentStep);
-                } else if (currentStep instanceof IdentityStep) {
-                    // do nothing
-                } else {
-                    break;
-                }
-                currentStep = currentStep.getNextStep();
-            }
-        }
-    }
-
-    public static TinkerGraphStepStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
new file mode 100644
index 0000000..4b3c389
--- /dev/null
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/sideEffect/TinkerGraphStep.java
@@ -0,0 +1,117 @@
+/*
+ * 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.tinkergraph.process.traversal.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
+import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerHelper;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TinkerGraphStep<S extends Element> extends GraphStep<S> implements HasContainerHolder {
+
+    public final List<HasContainer> hasContainers = new ArrayList<>();
+
+    public TinkerGraphStep(final GraphStep<S> originalGraphStep) {
+        super(originalGraphStep.getTraversal(), originalGraphStep.getReturnClass(), originalGraphStep.getIds());
+        if (originalGraphStep.getLabel().isPresent())
+            this.setLabel(originalGraphStep.getLabel().get());
+        this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
+    }
+
+    private Iterator<? extends Edge> edges() {
+        final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
+        final HasContainer indexedContainer = getIndexKey(Edge.class);
+        // ids are present, filter on them first
+        if (this.ids != null && this.ids.length > 0)
+            return this.iteratorList(graph.edges(this.ids));
+        else
+            return null == indexedContainer ?
+                    this.iteratorList(graph.edges()) :
+                    TinkerHelper.queryEdgeIndex(graph, indexedContainer.key, indexedContainer.value).stream()
+                            .filter(edge -> HasContainer.testAll(edge, this.hasContainers))
+                            .collect(Collectors.<Edge>toList()).iterator();
+    }
+
+    private Iterator<? extends Vertex> vertices() {
+        final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
+        final HasContainer indexedContainer = getIndexKey(Vertex.class);
+        // ids are present, filter on them first
+        if (this.ids != null && this.ids.length > 0)
+            return this.iteratorList(graph.vertices(this.ids));
+        else
+            return null == indexedContainer ?
+                    this.iteratorList(graph.vertices()) :
+                    TinkerHelper.queryVertexIndex(graph, indexedContainer.key, indexedContainer.value).stream()
+                            .filter(vertex -> HasContainer.testAll(vertex, this.hasContainers))
+                            .collect(Collectors.<Vertex>toList()).iterator();
+    }
+
+    private HasContainer getIndexKey(final Class<? extends Element> indexedClass) {
+        final Set<String> indexedKeys = ((TinkerGraph) this.getTraversal().getGraph().get()).getIndexedKeys(indexedClass);
+        return this.hasContainers.stream()
+                .filter(c -> indexedKeys.contains(c.key) && c.predicate.equals(Compare.eq))
+                .findAny()
+                .orElseGet(() -> null);
+    }
+
+    public String toString() {
+        if (this.hasContainers.isEmpty())
+            return super.toString();
+        else
+            return 0 == this.ids.length ?
+                    TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), this.hasContainers) :
+                    TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), Arrays.toString(this.ids), this.hasContainers);
+    }
+
+    private final <E extends Element> Iterator<E> iteratorList(final Iterator<E> iterator) {
+        final List<E> list = new ArrayList<>();
+        while (iterator.hasNext()) {
+            final E e = iterator.next();
+            if (HasContainer.testAll(e, this.hasContainers))
+                list.add(e);
+        }
+        return list.iterator();
+    }
+
+    @Override
+    public List<HasContainer> getHasContainers() {
+        return this.hasContainers;
+    }
+
+    @Override
+    public void addHasContainer(final HasContainer hasContainer) {
+        this.hasContainers.add(hasContainer);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
new file mode 100644
index 0000000..9a1832a
--- /dev/null
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/strategy/optimization/TinkerGraphStepStrategy.java
@@ -0,0 +1,74 @@
+/*
+ * 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.tinkergraph.process.traversal.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.step.sideEffect.TinkerGraphStep;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
+
+    private static final TinkerGraphStepStrategy INSTANCE = new TinkerGraphStepStrategy();
+
+    private TinkerGraphStepStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getEngine().isComputer())
+            return;
+
+        final Step<?, ?> startStep = traversal.getStartStep();
+        if (startStep instanceof GraphStep) {
+            final GraphStep<?> originalGraphStep = (GraphStep) startStep;
+            final TinkerGraphStep<?> tinkerGraphStep = new TinkerGraphStep<>(originalGraphStep);
+            TraversalHelper.replaceStep(startStep, (Step) tinkerGraphStep, traversal);
+
+            Step<?, ?> currentStep = tinkerGraphStep.getNextStep();
+            while (true) {
+                if (currentStep instanceof HasContainerHolder) {
+                    tinkerGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
+                    if (currentStep.getLabel().isPresent()) {
+                        final IdentityStep identityStep = new IdentityStep<>(traversal);
+                        identityStep.setLabel(currentStep.getLabel().get());
+                        TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
+                    }
+                    traversal.removeStep(currentStep);
+                } else if (currentStep instanceof IdentityStep) {
+                    // do nothing
+                } else {
+                    break;
+                }
+                currentStep = currentStep.getNextStep();
+            }
+        }
+    }
+
+    public static TinkerGraphStepStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
index a1916b4..47cc99a 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerEdge.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
index d630f8e..3179a40 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerFactory.java
@@ -18,12 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaFlatMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaFlatMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
index 75c2979..ea6e3cc 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraph.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
 import org.apache.commons.configuration.BaseConfiguration;
 import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
@@ -31,7 +31,7 @@ import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphComputer;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.computer.TinkerGraphView;
-import org.apache.tinkerpop.gremlin.tinkergraph.process.graph.traversal.strategy.TinkerGraphStepStrategy;
+import org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.strategy.optimization.TinkerGraphStepStrategy;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.util.Collections;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
index 58de000..aad20ea 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphComputerProvider.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.tinkergraph.process;
 
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphProvider;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
index bd24fab..7cab9ec 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphTest.java
@@ -20,9 +20,9 @@ package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
 import org.apache.commons.io.FileUtils;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategy;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
@@ -50,7 +50,7 @@ import java.util.List;
 import java.util.Set;
 import java.util.function.Supplier;
 
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 


[20/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java
deleted file mode 100644
index 213aa4d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/TraversalMetrics.java
+++ /dev/null
@@ -1,78 +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.util.metric;
-
-import org.apache.tinkerpop.gremlin.process.util.metric.Metrics;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.util.Collection;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Contains the Metrics gathered for a Traversal as the result of the .profile()-step.
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public interface TraversalMetrics {
-    /**
-     * The side-effect key used to store and retrieve the TraversalMetrics for a given Traversal.
-     */
-    public static final String METRICS_KEY = Graph.Hidden.hide("metrics");
-
-    /**
-     * The MetricsId used to obtain the element count via Metrics.getCount(String countKey)
-     */
-    public static final String ELEMENT_COUNT_ID = "elementCount";
-
-    /**
-     * The MetricsId used to obtain the traverser count via Metrics.getCount(String countKey)
-     */
-    public static final String TRAVERSER_COUNT_ID = "traverserCount";
-
-    /**
-     * The annotation key used to obtain the percent duration via Metrics.getAnnotation(String key)
-     */
-    public static final String PERCENT_DURATION_KEY = "percentDur";
-
-    /**
-     * Get the total duration taken by the Traversal.
-     *
-     * @param unit
-     * @return total duration taken by the Traversal.
-     */
-    public long getDuration(TimeUnit unit);
-
-    /**
-     * Get an individual Metrics object by the index of the profiled Step.
-     *
-     * @param stepIndex
-     * @return an individual Metrics object.
-     */
-    public Metrics getMetrics(final int stepIndex);
-
-    /**
-     * Get an individual Metrics object by the id of the profiled Step.
-     *
-     * @param id
-     * @return an individual Metrics object.
-     */
-    public Metrics getMetrics(final String id);
-
-    public Collection<? extends Metrics> getMetrics();
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java
deleted file mode 100644
index 41672f7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/EmptyPath.java
+++ /dev/null
@@ -1,102 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyPath implements Path, Serializable {
-
-    private static final EmptyPath INSTANCE = new EmptyPath();
-
-    private EmptyPath() {
-
-    }
-
-    @Override
-    public int size() {
-        return 0;
-    }
-
-    @Override
-    public Path extend(final Object object, final String... labels) {
-        return this;
-    }
-
-    @Override
-    public <A> A get(final String label) {
-        throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
-    }
-
-    @Override
-    public <A> A get(final int index) {
-        return (A) Collections.emptyList().get(index);
-    }
-
-    @Override
-    public boolean hasLabel(final String label) {
-        return false;
-    }
-
-    @Override
-    public void addLabel(final String label) {
-
-    }
-
-    @Override
-    public List<Object> objects() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public List<Set<String>> labels() {
-        return Collections.emptyList();
-    }
-
-    @Override
-    public boolean isSimple() {
-        return true;
-    }
-
-    @Override
-    public EmptyPath clone() {
-        return this;
-    }
-
-    public static Path instance() {
-        return INSTANCE;
-    }
-
-    @Override
-    public int hashCode() {
-        return -1424379551;
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return object instanceof EmptyPath;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java
deleted file mode 100644
index 20916f7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/ImmutablePath.java
+++ /dev/null
@@ -1,182 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class ImmutablePath implements Path, Serializable, Cloneable {
-
-    private Path previousPath = HeadPath.instance();
-    private Object currentObject;
-    private Set<String> currentLabels = new HashSet<>();
-
-    protected ImmutablePath() {
-
-    }
-
-    public static Path make() {
-        return HeadPath.instance();
-    }
-
-    @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
-    @Override
-    public ImmutablePath clone() {
-        return this;
-    }
-
-    private ImmutablePath(final Object currentObject, final String... currentLabels) {
-        this(HeadPath.instance(), currentObject, currentLabels);
-    }
-
-    private ImmutablePath(final Path previousPath, final Object currentObject, final String... currentLabels) {
-        this.previousPath = previousPath;
-        this.currentObject = currentObject;
-        if (currentLabels.length > 0)
-            Stream.of(currentLabels).forEach(this.currentLabels::add);
-    }
-
-    @Override
-    public int size() {
-        return this.previousPath.size() + 1;
-    }
-
-    @Override
-    public Path extend(final Object object, final String... labels) {
-        return new ImmutablePath(this, object, labels);
-    }
-
-    @Override
-    public <A> A get(final int index) {
-        return (this.size() - 1) == index ? (A) this.currentObject : this.previousPath.get(index);
-    }
-
-    @Override
-    public boolean hasLabel(final String label) {
-        return this.currentLabels.contains(label) || this.previousPath.hasLabel(label);
-    }
-
-    @Override
-    public void addLabel(final String label) {
-        this.currentLabels.add(label);
-    }
-
-    @Override
-    public List<Object> objects() {
-        final List<Object> objectPath = new ArrayList<>();
-        objectPath.addAll(this.previousPath.objects());
-        objectPath.add(this.currentObject);
-        return Collections.unmodifiableList(objectPath);
-    }
-
-    @Override
-    public List<Set<String>> labels() {
-        final List<Set<String>> labelPath = new ArrayList<>();
-        labelPath.addAll(this.previousPath.labels());
-        labelPath.add(this.currentLabels);
-        return Collections.unmodifiableList(labelPath);
-    }
-
-    @Override
-    public String toString() {
-        return this.objects().toString();
-    }
-
-    private static class HeadPath implements Path {
-        private static final HeadPath INSTANCE = new HeadPath();
-
-        private HeadPath() {
-
-        }
-
-        @Override
-        public int size() {
-            return 0;
-        }
-
-        @Override
-        public Path extend(final Object object, final String... labels) {
-            return new ImmutablePath(object, labels);
-        }
-
-        @Override
-        public <A> A get(final String label) {
-            throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
-        }
-
-        @Override
-        public <A> A get(final int index) {
-            return (A) Collections.emptyList().get(index);
-        }
-
-        @Override
-        public boolean hasLabel(final String label) {
-            return false;
-        }
-
-        @Override
-        public void addLabel(final String label) {
-            throw new UnsupportedOperationException("A head path can not have labels added to it");
-        }
-
-        @Override
-        public List<Object> objects() {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public List<Set<String>> labels() {
-            return Collections.emptyList();
-        }
-
-        @Override
-        public boolean isSimple() {
-            return true;
-        }
-
-        @Override
-        public HeadPath clone() {
-            return this;
-        }
-
-        public static Path instance() {
-            return INSTANCE;
-        }
-
-        @Override
-        public boolean equals(final Object object) {
-            return object instanceof HeadPath;
-        }
-
-        @Override
-        public String toString() {
-            return Collections.emptyList().toString();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java
deleted file mode 100644
index 2453497..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/MutablePath.java
+++ /dev/null
@@ -1,107 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class MutablePath implements Path, Serializable {
-
-    final protected List<Object> objects;
-    final protected List<Set<String>> labels;
-
-    protected MutablePath() {
-        this(0);
-    }
-
-    private MutablePath(final int capacity) {
-        this.objects = new ArrayList<>(capacity);
-        this.labels = new ArrayList<>(capacity);
-    }
-
-    public static Path make() {
-        return new MutablePath();
-    }
-
-    @Override
-    @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
-    public MutablePath clone() {
-        final MutablePath clone = new MutablePath(this.objects.size());
-        // TODO: Why is this not working Hadoop serialization-wise?... Its cause DetachedPath's clone needs to detach on clone.
-        /*final MutablePath clone = (MutablePath) super.clone();
-        clone.objects = new ArrayList<>();
-        clone.labels = new ArrayList<>();*/
-        clone.objects.addAll(this.objects);
-        clone.labels.addAll(this.labels);
-        return clone;
-    }
-
-
-    @Override
-    public int size() {
-        return this.objects.size();
-    }
-
-    @Override
-    public Path extend(final Object object, final String... labels) {
-        this.objects.add(object);
-        this.labels.add(Stream.of(labels).collect(Collectors.toSet()));
-        return this;
-    }
-
-    @Override
-    public <A> A get(int index) {
-        return (A) this.objects.get(index);
-    }
-
-    @Override
-    public boolean hasLabel(final String label) {
-        return this.labels.stream().filter(l -> l.contains(label)).findAny().isPresent();
-    }
-
-    @Override
-    public void addLabel(final String label) {
-        this.labels.get(this.labels.size() - 1).add(label);
-    }
-
-    @Override
-    public List<Object> objects() {
-        return Collections.unmodifiableList(this.objects);
-    }
-
-    @Override
-    public List<Set<String>> labels() {
-        return Collections.unmodifiableList(this.labels);
-    }
-
-    @Override
-    public String toString() {
-        return this.objects.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java
deleted file mode 100644
index e9e058e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/path/SparsePath.java
+++ /dev/null
@@ -1,95 +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.util.path;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class SparsePath implements Path, Serializable {
-
-    private final Map<String, Object> map = new HashMap<>();
-    private Object currentObject = null;
-
-    protected SparsePath() {
-
-    }
-
-    public static SparsePath make() {
-        return new SparsePath();
-    }
-
-    @Override
-    public Path extend(final Object object, final String... labels) {
-        this.currentObject = object;
-        if (labels.length > 0)
-            Stream.of(labels).forEach(label -> this.map.put(label, object));
-        return this;
-    }
-
-    @Override
-    public void addLabel(final String label) {
-        this.map.put(label, this.currentObject);
-    }
-
-    @Override
-    public List<Object> objects() {
-        return Collections.unmodifiableList(new ArrayList<>(this.map.values()));
-    }
-
-    @Override
-    public List<Set<String>> labels() {
-        final List<Set<String>> labels = new ArrayList<>();
-        this.map.forEach((k, v) -> labels.add(Collections.singleton(k)));
-        return Collections.unmodifiableList(labels);
-    }
-
-
-    public <A> A get(final String label) throws IllegalArgumentException {
-        final Object object = this.map.get(label);
-        if (null == object)
-            throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
-        return (A) object;
-    }
-
-    @Override
-    public boolean hasLabel(final String label) {
-        return this.map.containsKey(label);
-    }
-
-    @Override
-    public Path clone() {
-        return this;
-    }
-
-    @Override
-    public int size() {
-        return this.map.size();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
index 6e8b414..ea58bd5 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/Graph.java
@@ -19,11 +19,11 @@
 package org.apache.tinkerpop.gremlin.structure;
 
 import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.io.DefaultIo;
 import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLReader;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
index 013243b..f2066d2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphReader.java
@@ -71,7 +71,7 @@ public interface GraphReader {
 
     /**
      * Reads a set of vertices from an {@link InputStream} which were written by
-     * {@link GraphWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.Traversal)}.  This method
+     * {@link GraphWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.traversal.Traversal)}.  This method
      * will read vertex properties as well as edges given the direction supplied as an argument.
      *
      * @param inputStream a stream containing a single vertex as defined by the accompanying {@link GraphWriter}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
index c1dc379..d3075f3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/GraphWriter.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.io;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
index 6e0cfb7..e93b804 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.io.graphml;
 
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
index 036ac1d..87ee99d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.io.graphml;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
index 93f9c0d..ec620ea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java
@@ -26,9 +26,9 @@ import com.fasterxml.jackson.databind.jsontype.TypeSerializer;
 import com.fasterxml.jackson.databind.module.SimpleModule;
 import com.fasterxml.jackson.databind.ser.std.StdKeySerializer;
 import com.fasterxml.jackson.databind.ser.std.StdSerializer;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.util.metric.Metrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Property;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
index 16f43b1..3ce5445 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONReader.java
@@ -23,7 +23,7 @@ import com.fasterxml.jackson.core.JsonParser;
 import com.fasterxml.jackson.core.JsonToken;
 import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
index 16ade88..0a11d45 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONWriter.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.structure.io.graphson;
 
 import com.fasterxml.jackson.databind.ObjectMapper;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
index e89a3a6..0404fab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/LegacyGraphSONReader.java
@@ -24,7 +24,7 @@ import com.fasterxml.jackson.core.JsonToken;
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.module.SimpleModule;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
index aba9f97..7540d07 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GraphSerializer.java
@@ -22,8 +22,8 @@ import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.Serializer;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
index 449e8b9..fc82fce 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GremlinClassResolver.java
@@ -27,7 +27,7 @@ import com.esotericsoftware.kryo.io.Output;
 import com.esotericsoftware.kryo.util.IdentityObjectIntMap;
 import com.esotericsoftware.kryo.util.IntMap;
 import com.esotericsoftware.kryo.util.ObjectMap;
-import org.apache.tinkerpop.gremlin.process.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Property;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index 511891e..bb2d79f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
@@ -25,20 +25,20 @@ import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
 import com.esotericsoftware.kryo.util.DefaultStreamFactory;
 import com.esotericsoftware.kryo.util.MapReferenceResolver;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.util.MapMemory;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.O_Traverser;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.process.util.metric.DependantMutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
index 03bf58a..61d5ea3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoReader.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.structure.io.gryo;
 import com.esotericsoftware.kryo.Kryo;
 import com.esotericsoftware.kryo.io.Input;
 import com.esotericsoftware.kryo.io.Output;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
index 3544009..f1a5826 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/VertexByteArrayInputStream.java
@@ -28,7 +28,7 @@ import java.util.List;
 
 /**
  * An {@link InputStream} implementation that can independently process a Gryo file written with
- * {@link GryoWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.Traversal)}.
+ * {@link GryoWriter#writeVertices(java.io.OutputStream, org.apache.tinkerpop.gremlin.process.traversal.Traversal)}.
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
index adf6f06..cf711ac 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/GraphStrategy.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.strategy;
 
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
index 54be5e9..75e9245 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategy.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.structure.strategy;
 
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
index 7c76f13..3890e75 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/PartitionStrategy.java
@@ -18,14 +18,14 @@
  */
 package org.apache.tinkerpop.gremlin.structure.strategy;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.util.DefaultTraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
index 65ffda0..8b444d3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategy.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.strategy;
 
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
index 6056242..75d552a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraph.java
@@ -20,7 +20,6 @@ package org.apache.tinkerpop.gremlin.structure.strategy;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
index b2f17ff..b823fc1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategy.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.strategy;
 
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
index 403df97..e55c17c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/process/graph/step/sideEffect/StrategyGraphStep.java
@@ -18,9 +18,9 @@
  */
 package org.apache.tinkerpop.gremlin.structure.strategy.process.graph.step.sideEffect;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.strategy.StrategyEdge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
index a0da186..1d45492 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelper.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util;
 
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -122,11 +122,11 @@ public final class ElementHelper {
     }
 
     /**
-     * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.T#id} key from the list of arguments.
+     * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} key from the list of arguments.
      *
      * @param keyValues a list of key/value pairs
-     * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.T#id}
-     * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.T#id} key is {@code null}
+     * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.traversal.T#id}
+     * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} key is {@code null}
      */
     public static Optional<Object> getIdValue(final Object... keyValues) {
         for (int i = 0; i < keyValues.length; i = i + 2) {
@@ -216,12 +216,12 @@ public final class ElementHelper {
     }
 
     /**
-     * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.T#label} key from the list of arguments.
+     * Extracts the value of the {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} key from the list of arguments.
      *
      * @param keyValues a list of key/value pairs
-     * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.T#label}
+     * @return the value associated with {@link org.apache.tinkerpop.gremlin.process.traversal.T#label}
      * @throws ClassCastException   if the value of the label is not a {@link String}
-     * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.T#label} key is {@code null}
+     * @throws NullPointerException if the value for the {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} key is {@code null}
      */
     public static Optional<String> getLabelValue(final Object... keyValues) {
         for (int i = 0; i < keyValues.length; i = i + 2) {
@@ -234,8 +234,8 @@ public final class ElementHelper {
     }
 
     /**
-     * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Element}.  If the value of {@link org.apache.tinkerpop.gremlin.process.T#id} or
-     * {@link org.apache.tinkerpop.gremlin.process.T#label} is in the set of pairs, then they are ignored.
+     * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Element}.  If the value of {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} or
+     * {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} is in the set of pairs, then they are ignored.
      *
      * @param element           the graph element to assign the {@code propertyKeyValues}
      * @param propertyKeyValues the key/value pairs to assign to the {@code element}
@@ -253,8 +253,8 @@ public final class ElementHelper {
     }
 
     /**
-     * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Vertex}.  If the value of {@link org.apache.tinkerpop.gremlin.process.T#id} or
-     * {@link org.apache.tinkerpop.gremlin.process.T#label} is in the set of pairs, then they are ignored.
+     * Assign key/value pairs as properties to an {@link org.apache.tinkerpop.gremlin.structure.Vertex}.  If the value of {@link org.apache.tinkerpop.gremlin.process.traversal.T#id} or
+     * {@link org.apache.tinkerpop.gremlin.process.traversal.T#label} is in the set of pairs, then they are ignored.
      *
      * @param vertex            the vertex to assign the {@code propertyKeyValues}
      * @param propertyKeyValues the key/value pairs to assign to the {@code vertex}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
index e46fb70..18b2aea 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/StringFactory.java
@@ -18,11 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util;
 
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
index e1552b4..f33da9c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/batch/BatchGraph.java
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.gremlin.structure.util.batch;
 
 import org.apache.commons.configuration.BaseConfiguration;
 import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
index 07a9492..a3f60a8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedEdge.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util.detached;
 
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
index 12c3a73..31e7905 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedFactory.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util.detached;
 
-import org.apache.tinkerpop.gremlin.process.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Property;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
index 1709512..4f0aa2b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedPath.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util.detached;
 
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.util.path.MutablePath;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
index f3cf93d..cb2ca02 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/detached/DetachedVertex.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util.detached;
 
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
index a2b163a..98d43eb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/util/empty/EmptyGraph.java
@@ -20,8 +20,6 @@ package org.apache.tinkerpop.gremlin.structure.util.empty;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.util.EmptyGraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
index f524a3b..66b5c7b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/BulkSetSupplier.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.function;
 
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 
 import java.io.Serializable;
 import java.util.function.Supplier;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
index 56d64f5..dbc47eb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MeanNumberSupplier.java
@@ -22,7 +22,7 @@ package org.apache.tinkerpop.gremlin.util.function;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
 
 import java.io.Serializable;
 import java.util.function.Supplier;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
index 8373f5a..cd8ff58 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TraversableLambda.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.function;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
index 499b5c7..ff89763 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/TreeSupplier.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.function;
 
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
 
 import java.io.Serializable;
 import java.util.function.Supplier;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
index d28675c..7957f40 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIterator.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 
 import java.io.Serializable;
 import java.util.Arrays;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
index 5bd1d87..e0a1850 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIterator.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 
 import java.io.Serializable;
 import java.util.Iterator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
index 4d831a1..9175518 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIterator.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 
 import java.io.Serializable;
 import java.util.Iterator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
index c6537c4..ef9bd72 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/IteratorUtils.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 
 import java.util.ArrayList;
 import java.util.Collection;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
index 3640f26..82e4cdd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIterator.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 
 import java.io.Serializable;
 import java.util.ArrayList;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
index 8fc1fd8..fd30ee6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIterator.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 
 import java.io.Serializable;
 import java.util.Iterator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
index f18cba3..6abd200 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/TraversalStrategiesTest.java
@@ -18,7 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.process;
 
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.junit.Test;
 
 import java.util.Collections;
@@ -35,7 +38,7 @@ import static org.junit.Assert.*;
 public class TraversalStrategiesTest {
 
     /**
-     * Tests that {@link org.apache.tinkerpop.gremlin.process.TraversalStrategies#sortStrategies(java.util.List)}
+     * Tests that {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies#sortStrategies(java.util.List)}
      * works as advertised. This class defines a bunch of dummy strategies which define an order. It is verified
      * that the right order is being returned.
      */

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
index 541511f..b3ac93d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStepTest.java
@@ -18,14 +18,15 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter;
 
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionStep;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.junit.Test;
 
 import java.util.Iterator;
 
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
 import static org.junit.Assert.*;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
index 3513345..d44f197 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategyTest.java
@@ -18,13 +18,14 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal.strategy;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTraversalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTraversalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Contains;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
index 0deb80a..d5004e3 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategyTest.java
@@ -18,11 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.traversal.strategy;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.TimeLimitStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TimeLimitedStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.junit.Test;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
index abbeadb..9b7ef10 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/graph/util/TreeTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.graph.util;
 
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
 import org.junit.Test;
 
 import java.util.AbstractMap;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
index 15fd501..4dfaccc 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTest.java
@@ -18,16 +18,16 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Direction;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
index aa6a6e0..662be3d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyTest.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.junit.Test;
 import org.junit.runner.RunWith;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
index 5785dba..fe6967c 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyTest.java
@@ -18,33 +18,22 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.javatuples.Pair;
 import org.junit.Test;
 import org.junit.experimental.runners.Enclosed;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
index 74766ef..f340383 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/BulkSetTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.util;
 
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.junit.Test;
 
 import java.util.Iterator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
index 19f9d3f..6add61a 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/util/TraversalHelperTest.java
@@ -18,23 +18,20 @@
  */
 package org.apache.tinkerpop.gremlin.process.util;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.PropertyType;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.junit.Test;
 import org.mockito.Mockito;
 
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
 import static org.junit.Assert.*;
 
 /**


[09/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index a537ae3..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectTest.java
+++ /dev/null
@@ -1,310 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.*;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.values;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class SelectTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id);
-
-    public abstract Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id);
-
-    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_aggregateXxX_asXbX_select_byXnameX();
-
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_asXaX_outXknowsX_asXbX_select() {
-        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Map<String, Vertex> bindings = traversal.next();
-            assertEquals(2, bindings.size());
-            assertEquals(convertToVertexId("marko"), (bindings.get("a")).id());
-            assertTrue((bindings.get("b")).id().equals(convertToVertexId("vadas")) || bindings.get("b").id().equals(convertToVertexId("josh")));
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
-        final Traversal<Vertex, Map<String, String>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Map<String, String> bindings = traversal.next();
-            assertEquals(2, bindings.size());
-            assertEquals("marko", bindings.get("a"));
-            assertTrue(bindings.get("b").equals("josh") || bindings.get("b").equals("vadas"));
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            assertEquals(convertToVertexId("marko"), vertex.id());
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertEquals("marko", traversal.next());
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_asXaX_out_asXbX_select_byXnameX() {
-        Arrays.asList(
-                get_g_V_asXaX_out_asXbX_select_byXnameX(),
-                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",
-                    "a", "marko", "b", "vadas",
-                    "a", "marko", "b", "josh",
-                    "a", "josh", "b", "ripple",
-                    "a", "josh", "b", "lop",
-                    "a", "peter", "b", "lop");
-            checkResults(expected, traversal);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
-        Arrays.asList(
-                get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            final List<Map<String, String>> expected = makeMapList(2,
-                    "a", "marko", "b", "marko",
-                    "a", "vadas", "b", "vadas",
-                    "a", "josh", "b", "josh",
-                    "a", "ripple", "b", "ripple",
-                    "a", "lop", "b", "lop",
-                    "a", "peter", "b", "peter");
-            checkResults(expected, traversal);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(CREW)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
-        printTraversalForm(traversal);
-        final List<Map<String, Object>> expected = makeMapList(2,
-                "a", 3, "b", "matthias",
-                "a", 4, "b", "marko",
-                "a", 5, "b", "stephen",
-                "a", 5, "b", "daniel");
-        checkResults(expected, traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXname_isXmarkoXX_asXaX_select() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_isXmarkoXX_asXaX_select();
-        printTraversalForm(traversal);
-        final List<Map<String, Object>> expected = makeMapList(1, "a", g.V(convertToVertexId("marko")).next());
-        checkResults(expected, traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_label_groupCount_asXxX_select() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_label_groupCount_asXxX_select();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Object> map1 = traversal.next();
-        assertEquals(1, map1.size());
-        assertTrue(map1.containsKey("x"));
-        final Map<String, Long> map2 = (Map<String, Long>) map1.get("x");
-        assertEquals(2, map2.size());
-        assertTrue(map2.containsKey("person"));
-        assertTrue(map2.containsKey("software"));
-        assertEquals(2, map2.get("software").longValue());
-        assertEquals(4, map2.get("person").longValue());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @Ignore
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
-        printTraversalForm(traversal);
-        final Set<String> persons = new HashSet<>();
-        for (int i = 0; i < 4; i++) {
-            assertTrue(traversal.hasNext());
-            final Map<String, Object> map = traversal.next();
-            assertEquals(2, map.size());
-            assertTrue(map.containsKey("person"));
-            assertTrue(map.containsKey("relations"));
-            assertTrue(persons.add((String) map.get("person")));
-            final Map<String, Long> relations = (Map<String, Long>) map.get("relations");
-            switch ((String) map.get("person")) {
-                case "marko":
-                    assertEquals(2, relations.size());
-                    assertEquals(1, relations.get("created").longValue());
-                    assertEquals(2, relations.get("knows").longValue());
-                    break;
-                case "vadas":
-                    assertEquals(1, relations.size());
-                    assertEquals(1, relations.get("knows").longValue());
-                    break;
-                case "josh":
-                    assertEquals(2, relations.size());
-                    assertEquals(2, relations.get("created").longValue());
-                    assertEquals(1, relations.get("knows").longValue());
-                    break;
-                case "peter":
-                    assertEquals(1, relations.size());
-                    assertEquals(1, relations.get("created").longValue());
-                    break;
-                default:
-                    assertTrue(false);
-                    break;
-            }
-        }
-        assertFalse(traversal.hasNext());
-        assertEquals(4, persons.size());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends SelectTest {
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
-            return g.V(v1Id).as("a").out("knows").as("b").select();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id) {
-            return g.V(v1Id).as("a").out("knows").as("b").<String>select().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
-            return g.V(v1Id).as("a").out("knows").as("b").select("a");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id) {
-            return g.V(v1Id).as("a").out("knows").as("b").<String>select("a").by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
-            return g.V().as("a").out().as("b").<String>select().by("name");
-        }
-
-        @Override
-        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
-        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
-            return g.V().as("a").values("name").order().as("b").<String>select().by("name").by();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
-            return g.V().has("name", "gremlin").inE("uses").order().by("skill", Order.incr).as("a").outV().as("b").select().by("skill").by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
-            return g.V().has(values("name").is("marko")).as("a").select();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
-            return g.V().label().groupCount().as("x").select();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
-            return g.V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").select().by("name").by();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 9a08519..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumTest.java
+++ /dev/null
@@ -1,83 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.sum;
-import static org.junit.Assert.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class SumTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Double> get_g_V_valuesXageX_sum();
-
-    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_valuesXageX_sum() {
-        final Traversal<Vertex, Double> traversal = get_g_V_valuesXageX_sum();
-        printTraversalForm(traversal);
-        final Number sum = traversal.next();
-        assertEquals(123.0, sum);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXsumXlocalXX() {
-        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Number> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(1.0, map.get("ripple"));
-        assertEquals(1.0, map.get("lop"));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends SumTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
-            return g.V().values("age").sum();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
-            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

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java
deleted file mode 100644
index fe54d73..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldTest.java
+++ /dev/null
@@ -1,109 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class UnfoldTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold();
-
-    public abstract Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_localXoutE_foldX_unfold() {
-        final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_foldX_unfold();
-        printTraversalForm(traversal);
-        int counter = 0;
-        final Set<Edge> edges = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            edges.add(traversal.next());
-        }
-        assertEquals(6, counter);
-        assertEquals(6, edges.size());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_valueMap_unfold_mapXkeyX() {
-        final Traversal<Vertex, String> traversal = get_g_V_valueMap_unfold_mapXkeyX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        int ageCounter = 0;
-        int nameCounter = 0;
-        int langCounter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String key = traversal.next();
-            if (key.equals("name"))
-                nameCounter++;
-            else if (key.equals("age"))
-                ageCounter++;
-            else if (key.equals("lang"))
-                langCounter++;
-            else
-                fail("The provided key is not known: " + key);
-        }
-        assertEquals(12, counter);
-        assertEquals(4, ageCounter);
-        assertEquals(2, langCounter);
-        assertEquals(6, nameCounter);
-        assertEquals(counter, ageCounter + langCounter + nameCounter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends UnfoldTest {
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
-            return g.V().local(outE().fold()).unfold();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
-            return g.V().valueMap().<Map.Entry<String, List>>unfold().map(m -> m.get().getKey());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java
deleted file mode 100644
index a2e0107..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/ValueMapTest.java
+++ /dev/null
@@ -1,145 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Vertex;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class ValueMapTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMap();
-
-    public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX();
-
-    public abstract Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_valueMap() {
-        final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMap();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final Map<String, List> values = traversal.next();
-            final String name = (String) values.get("name").get(0);
-            assertEquals(2, values.size());
-            if (name.equals("marko")) {
-                assertEquals(29, values.get("age").get(0));
-            } else if (name.equals("josh")) {
-                assertEquals(32, values.get("age").get(0));
-            } else if (name.equals("peter")) {
-                assertEquals(35, values.get("age").get(0));
-            } else if (name.equals("vadas")) {
-                assertEquals(27, values.get("age").get(0));
-            } else if (name.equals("lop")) {
-                assertEquals("java", values.get("lang").get(0));
-            } else if (name.equals("ripple")) {
-                assertEquals("java", values.get("lang").get(0));
-            } else {
-                throw new IllegalStateException("It is not possible to reach here: " + values);
-            }
-        }
-        assertEquals(6, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_valueMapXname_ageX() {
-        final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMapXname_ageX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final Map<String, List> values = traversal.next();
-            final String name = (String) values.get("name").get(0);
-            if (name.equals("marko")) {
-                assertEquals(29, values.get("age").get(0));
-                assertEquals(2, values.size());
-            } else if (name.equals("josh")) {
-                assertEquals(32, values.get("age").get(0));
-                assertEquals(2, values.size());
-            } else if (name.equals("peter")) {
-                assertEquals(35, values.get("age").get(0));
-                assertEquals(2, values.size());
-            } else if (name.equals("vadas")) {
-                assertEquals(27, values.get("age").get(0));
-                assertEquals(2, values.size());
-            } else if (name.equals("lop")) {
-                assertNull(values.get("lang"));
-                assertEquals(1, values.size());
-            } else if (name.equals("ripple")) {
-                assertNull(values.get("lang"));
-                assertEquals(1, values.size());
-            } else {
-                throw new IllegalStateException("It is not possible to reach here: " + values);
-            }
-        }
-        assertEquals(6, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outXcreatedX_valueMap() {
-        final Traversal<Vertex, Map<String, List<String>>> traversal = get_g_VX1X_outXcreatedX_valueMap(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, List<String>> values = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals("lop", values.get("name").get(0));
-        assertEquals("java", values.get("lang").get(0));
-        assertEquals(2, values.size());
-
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends ValueMapTest {
-        @Override
-        public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
-            return g.V().valueMap();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
-            return g.V().valueMap("name", "age");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
-            return g.V(v1Id).out("created").valueMap();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java
deleted file mode 100644
index 7c19785..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexTest.java
+++ /dev/null
@@ -1,617 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://traversalhen.genoprime.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class VertexTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_V();
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id);
-
-    public abstract Traversal<Edge, Edge> get_g_E();
-
-    public abstract Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV();
-
-    public abstract Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name();
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_out_out();
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id);
-
-    // VERTEX ADJACENCY
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V();
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            vertices.add(traversal.next());
-        }
-        assertEquals(6, vertices.size());
-        assertEquals(6, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out(convertToVertexId("marko"));
-        assert_g_v1_out(traversal);
-    }
-
-    private void assert_g_v1_out(final Traversal<Vertex, Vertex> traversal) {
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("vadas") ||
-                    vertex.value("name").equals("josh") ||
-                    vertex.value("name").equals("lop"));
-        }
-        assertEquals(3, counter);
-        assertEquals(3, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX2X_in() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX2X_in(convertToVertexId("vadas"));
-        assert_g_v2_in(traversal);
-    }
-
-    private void assert_g_v2_in(final Traversal<Vertex, Vertex> traversal) {
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertEquals(traversal.next().value("name"), "marko");
-        }
-        assertEquals(1, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_both() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_both(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("marko") ||
-                    vertex.value("name").equals("ripple") ||
-                    vertex.value("name").equals("lop"));
-        }
-        assertEquals(3, counter);
-        assertEquals(3, vertices.size());
-    }
-
-    // EDGE ADJACENCY
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_E() {
-        final Traversal<Edge, Edge> traversal = get_g_E();
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Edge> edges = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            edges.add(traversal.next());
-        }
-        assertEquals(6, edges.size());
-        assertEquals(6, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outE() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Edge> edges = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Edge edge = traversal.next();
-            edges.add(edge);
-            assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
-        }
-        assertEquals(3, counter);
-        assertEquals(3, edges.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX2X_inE() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX2X_inE(convertToVertexId("vadas"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertEquals(traversal.next().label(), "knows");
-        }
-        assertEquals(1, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_bothEXcreatedX() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothEXcreatedX(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Edge> edges = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Edge edge = traversal.next();
-            edges.add(edge);
-            assertTrue(edge.label().equals("created"));
-            assertEquals(edge.outVertex().id(), convertToVertexId("josh"));
-        }
-        assertEquals(2, counter);
-        assertEquals(2, edges.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_bothE() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothE(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Edge> edges = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Edge edge = traversal.next();
-            edges.add(edge);
-            assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
-        }
-        assertEquals(3, counter);
-        assertEquals(3, edges.size());
-    }
-
-    // EDGE/VERTEX ADJACENCY
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outE_inV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_inV(convertToVertexId("marko"));
-        this.assert_g_v1_out(traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX2X_inE_outV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX2X_inE_outV(convertToVertexId("vadas"));
-        this.assert_g_v2_in(traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_outE_hasXweight_1X_outV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_outE_hasXweight_1X_outV();
-        printTraversalForm(traversal);
-        int counter = 0;
-        Map<Object, Integer> counts = new HashMap<>();
-        while (traversal.hasNext()) {
-            final Object id = traversal.next().id();
-            int previousCount = counts.getOrDefault(id, 0);
-            counts.put(id, previousCount + 1);
-            counter++;
-        }
-        assertEquals(2, counts.size());
-        assertEquals(1, counts.get(convertToVertexId("marko")).intValue());
-        assertEquals(1, counts.get(convertToVertexId("josh")).intValue());
-
-        assertEquals(2, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_outE_inV_inE_inV_both_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_out_outE_inV_inE_inV_both_name();
-        printTraversalForm(traversal);
-        int counter = 0;
-        Map<String, Integer> counts = new HashMap<>();
-        while (traversal.hasNext()) {
-            final String key = traversal.next();
-            int previousCount = counts.getOrDefault(key, 0);
-            counts.put(key, previousCount + 1);
-            counter++;
-        }
-        assertEquals(3, counts.size());
-        assertEquals(4, counts.get("josh").intValue());
-        assertEquals(3, counts.get("marko").intValue());
-        assertEquals(3, counts.get("peter").intValue());
-
-        assertEquals(10, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outEXknowsX_bothV_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_outEXknowsX_bothV_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(4, names.size());
-        assertTrue(names.contains("marko"));
-        assertTrue(names.contains("josh"));
-        assertTrue(names.contains("vadas"));
-        names.remove("marko");
-        assertEquals(3, names.size());
-        names.remove("marko");
-        assertEquals(2, names.size());
-        names.remove("josh");
-        assertEquals(1, names.size());
-        names.remove("vadas");
-        assertEquals(0, names.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outE_otherV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_otherV(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("vadas") ||
-                    vertex.value("name").equals("josh") ||
-                    vertex.value("name").equals("lop"));
-        }
-        assertEquals(3, counter);
-        assertEquals(3, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_bothE_otherV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_otherV(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(3, vertices.size());
-        assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("marko")));
-        assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("ripple")));
-        assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("lop")));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_bothE_hasXweight_lt_1X_otherV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_hasXweight_lt_1X_otherV(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(1, vertices.size());
-        assertEquals(vertices.get(0).value("name"), "lop");
-        assertFalse(traversal.hasNext());
-    }
-
-    // VERTEX EDGE LABEL ADJACENCY
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outXknowsX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX(convertToVertexId("marko"));
-        assert_g_v1_outXknowsX(traversal);
-    }
-
-    private void assert_g_v1_outXknowsX(Traversal<Vertex, Vertex> traversal) {
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("vadas") ||
-                    vertex.value("name").equals("josh"));
-        }
-        assertEquals(2, counter);
-        assertEquals(2, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outXknows_createdX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknows_createdX(convertToVertexId("marko"));
-        this.assert_g_v1_out(traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outEXknowsX_inV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknowsX_inV(convertToVertexId("marko"));
-        this.assert_g_v1_outXknowsX(traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outEXknows_createdX_inV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknows_createdX_inV(convertToVertexId("marko"));
-        this.assert_g_v1_out(traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out();
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("lop") ||
-                    vertex.value("name").equals("ripple"));
-        }
-        assertEquals(2, counter);
-        assertEquals(2, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_out_out() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_out_out(convertToVertexId("marko"));
-        assertFalse(traversal.hasNext());
-    }
-
-    // PROPERTY TESTING
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_out_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<String> names = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            String name = traversal.next();
-            names.add(name);
-            assertTrue(name.equals("vadas") ||
-                    name.equals("josh") ||
-                    name.equals("lop"));
-        }
-        assertEquals(3, counter);
-        assertEquals(3, names.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_to_XOUT_knowsX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_to_XOUT_knowsX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            String name = vertex.value("name");
-            assertTrue(name.equals("vadas") ||
-                    name.equals("josh"));
-        }
-        assertEquals(2, counter);
-        assertFalse(traversal.hasNext());
-
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends VertexTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V() {
-            return g.V();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
-            return g.V(v1Id).out();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
-            return g.V(v2Id).in();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
-            return g.V(v4Id).both();
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E() {
-            return g.E();
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
-            return g.V(v1Id).outE();
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
-            return g.V(v2Id).inE();
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
-            return g.V(v4Id).bothE();
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
-            return g.V(v4Id).bothE("created");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
-            return g.V(v1Id).outE().inV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
-            return g.V(v2Id).inE().outV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
-            return g.V().outE().has("weight", 1.0d).outV();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
-            return g.V().out().outE().inV().inE().inV().both().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
-            return g.V(v1Id).outE("knows").bothV().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
-            return g.V(v1Id).out("knows");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
-            return g.V(v1Id).out("knows", "created");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
-            return g.V(v1Id).outE("knows").inV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
-            return g.V(v1Id).outE("knows", "created").inV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
-            return g.V(v1Id).outE().otherV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
-            return g.V(v4Id).bothE().otherV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(Object v4Id) {
-            return g.V(v4Id).bothE().has("weight", Compare.lt, 1d).otherV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out() {
-            return g.V().out().out();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
-            return g.V(v1Id).out().out().out();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
-            return g.V(v1Id).out().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
-            return g.V(v1Id).to(Direction.OUT, "knows");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java
deleted file mode 100644
index 4439033..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateTest.java
+++ /dev/null
@@ -1,149 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class AggregateTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX();
-
-    public abstract Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX();
-
-    public abstract Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path();
-
-    //public abstract Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_valueXnameX_aggregateXxX_capXxX() {
-        Traversal<Vertex, List<String>> traversal = get_g_V_name_aggregateXxX_capXxX();
-        printTraversalForm(traversal);
-        final Collection<String> names = traversal.next();
-        assertFalse(traversal.hasNext());
-        checkListOfNames(names);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_aggregateXxX_byXnameX_capXxX() {
-        Traversal<Vertex, List<String>> traversal = get_g_V_aggregateXxX_byXnameX_capXxX();
-        printTraversalForm(traversal);
-        final Collection<String> names = traversal.next();
-        assertFalse(traversal.hasNext());
-        checkListOfNames(names);
-    }
-
-    private void checkListOfNames(Collection<String> names) {
-        assertEquals(6, names.size());
-        assertTrue(names.contains("marko"));
-        assertTrue(names.contains("josh"));
-        assertTrue(names.contains("peter"));
-        assertTrue(names.contains("lop"));
-        assertTrue(names.contains("vadas"));
-        assertTrue(names.contains("ripple"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_aggregateXaX_path() {
-        final Traversal<Vertex, Path> traversal = get_g_V_out_aggregateXaX_path();
-        printTraversalForm(traversal);
-        int count = 0;
-        final Map<String, Long> firstStepCounts = new HashMap<>();
-        final Map<String, Long> secondStepCounts = new HashMap<>();
-        while (traversal.hasNext()) {
-            count++;
-            Path path = traversal.next();
-            String first = path.get(0).toString();
-            String second = path.get(1).toString();
-            assertThat(first, not(second));
-            MapHelper.incr(firstStepCounts, first, 1l);
-            MapHelper.incr(secondStepCounts, second, 1l);
-        }
-        assertEquals(6, count);
-        assertEquals(3, firstStepCounts.size());
-        assertEquals(4, secondStepCounts.size());
-        assertTrue(firstStepCounts.values().contains(3l));
-        assertTrue(firstStepCounts.values().contains(2l));
-        assertTrue(firstStepCounts.values().contains(1l));
-        assertTrue(secondStepCounts.values().contains(3l));
-        assertTrue(secondStepCounts.values().contains(1l));
-    }
-
-    /*@Test
-    @LoadGraphWith(CLASSIC)
-    public void g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path() {
-        Iterator<Path> traversal = get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(convertToVertexId("marko"));
-        System.out.println("Testing: " + traversal);
-        final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
-        // for OLTP it's a roulette game; the result can change depending on which path is taken first by the traverser (this makes some cool real world use cases possible)
-        // Senzari use case: generate a random playlist without artist repetitions
-        assertEquals(4, paths.size());
-        assertEquals(3, paths.stream().filter(path -> path.size() == 3).count());
-        assertEquals(1, paths.stream().filter(path -> path.size() == 5).count());
-        assertFalse(traversal.hasNext());
-    }*/
-
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends AggregateTest {
-
-        @Override
-        public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
-            return g.V().values("name").aggregate("x").cap("x");
-        }
-
-        @Override
-        public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
-            return g.V().aggregate("x").by("name").cap("x");
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
-            return g.V().out().aggregate("a").path();
-        }
-
-        /*public Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id) {
-            return g.V(1).as("x").bothE().as("e").value("weight").except("w").aggregate("w").back("e").otherV().jump("x", t -> true, t -> true).path();
-        }*/
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java
deleted file mode 100644
index fbdd0c6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountTest.java
+++ /dev/null
@@ -1,177 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class GroupCountTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX();
-
-    public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount();
-
-    public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX();
-
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_outXcreatedX_groupCount_byXnameX() {
-        Arrays.asList(get_g_V_outXcreatedX_groupCount_byXnameX(), get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<String, Long> map = traversal.next();
-            assertEquals(map.size(), 2);
-            assertEquals(Long.valueOf(3l), map.get("lop"));
-            assertEquals(Long.valueOf(1l), map.get("ripple"));
-            assertFalse(traversal.hasNext());
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_outXcreatedX_name_groupCount() {
-        Arrays.asList(get_g_V_outXcreatedX_name_groupCount(), get_g_V_outXcreatedX_name_groupCountXaX_capXaX()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<String, Long> map = traversal.next();
-            assertEquals(map.size(), 2);
-            assertEquals(3l, map.get("lop").longValue());
-            assertEquals(1l, map.get("ripple").longValue());
-            assertFalse(traversal.hasNext());
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_filterXfalseX_groupCount() {
-        Arrays.asList(get_g_V_hasXnoX_groupCount(), get_g_V_hasXnoX_groupCountXaX_capXaX()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<Object, Long> map = traversal.next();
-            assertEquals(0, map.size());
-            assertFalse(traversal.hasNext());
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
-        List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
-        traversals.add(get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<String, Long> map = traversal.next();
-            assertFalse(traversal.hasNext());
-            assertEquals(4, map.size());
-            assertEquals(4l, map.get("lop").longValue());
-            assertEquals(2l, map.get("ripple").longValue());
-            assertEquals(1l, map.get("josh").longValue());
-            assertEquals(1l, map.get("vadas").longValue());
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
-        List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
-        traversals.add(get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<String, Long> map = traversal.next();
-            assertFalse(traversal.hasNext());
-            assertEquals(2, map.size());
-            assertEquals(2, map.get("marko").longValue());
-            assertEquals(2, map.get("java").longValue());
-        });
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends GroupCountTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
-            return g.V().out("created").<String>groupCount().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
-            return g.V().out("created").<String>groupCount("a").by("name").cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
-            return g.V().out("created").values("name").groupCount();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
-            return g.V().out("created").values("name").groupCount("a").cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
-            return g.V().has("no").groupCount();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
-            return g.V().has("no").groupCount("a").cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
-            return g.V().repeat(out().groupCount("a").by("name")).times(2).cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
-            return g.V().union(
-                    repeat(out()).times(2).groupCount("m").by("lang"),
-                    repeat(in()).times(2).groupCount("m").by("name")).cap("m");
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java
deleted file mode 100644
index a5dc7e2..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupTest.java
+++ /dev/null
@@ -1,171 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.*;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.*;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class GroupTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX();
-
-    public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX();
-
-    public abstract Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX();
-
-    public abstract Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_group_byXnameX() {
-        Arrays.asList(get_g_V_group_byXnameX(), get_g_V_groupXaX_byXnameX_capXaX()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<String, Collection<Vertex>> map = traversal.next();
-            assertEquals(6, map.size());
-            map.forEach((key, values) -> {
-                assertEquals(1, values.size());
-                assertEquals(convertToVertexId(key), values.iterator().next().id());
-            });
-            assertFalse(traversal.hasNext());
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
-        final Traversal<Vertex, Map<String, Collection<String>>> traversal = get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
-        printTraversalForm(traversal);
-        final Map<String, Collection<String>> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(1, map.size());
-        assertTrue(map.containsKey("java"));
-        assertEquals(2, map.get("java").size());
-        assertTrue(map.get("java").contains("ripple"));
-        assertTrue(map.get("java").contains("lop"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXlangX_group_byXlangX_byX1X_byXsizeX() {
-        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
-        printTraversalForm(traversal);
-        final Map<String, Long> map = traversal.next();
-        assertEquals(1, map.size());
-        assertTrue(map.containsKey("java"));
-        assertEquals(Long.valueOf(2), map.get("java"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXout_groupXaX_byXnameX_byXitX_byXsizeXX_timesX2X_capXaX() {
-        List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
-        traversals.add(get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<String, Long> map = traversal.next();
-            assertFalse(traversal.hasNext());
-            assertEquals(4, map.size());
-            assertTrue(map.containsKey("vadas"));
-            assertEquals(Long.valueOf(1), map.get("vadas"));
-            assertTrue(map.containsKey("josh"));
-            assertEquals(Long.valueOf(1), map.get("josh"));
-            assertTrue(map.containsKey("lop"));
-            assertEquals(Long.valueOf(4), map.get("lop"));
-            assertTrue(map.containsKey("ripple"));
-            assertEquals(Long.valueOf(2), map.get("ripple"));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_group_byXoutE_countX_byXnameX() {
-        final Traversal<Vertex, Map<Long, Collection<String>>> traversal = get_g_V_group_byXoutE_countX_byXnameX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<Long, Collection<String>> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(4, map.size());
-        assertTrue(map.containsKey(0l));
-        assertTrue(map.containsKey(1l));
-        assertTrue(map.containsKey(2l));
-        assertTrue(map.containsKey(3l));
-        assertEquals(3, map.get(0l).size());
-        assertEquals(1, map.get(1l).size());
-        assertEquals(1, map.get(2l).size());
-        assertEquals(1, map.get(3l).size());
-        assertTrue(map.get(0l).contains("lop"));
-        assertTrue(map.get(0l).contains("ripple"));
-        assertTrue(map.get(0l).contains("vadas"));
-        assertTrue(map.get(1l).contains("peter"));
-        assertTrue(map.get(2l).contains("josh"));
-        assertTrue(map.get(3l).contains("marko"));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends GroupTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
-            return g.V().<String, Collection<Vertex>>group().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
-            return g.V().<String, Collection<Vertex>>group("a").by("name").cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
-            return g.V().has("lang").group("a").by("lang").by("name").out().cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
-            return g.V().has("lang").<String, Long>group().by("lang").by(inject(1)).<Collection>by(count(Scope.local));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
-            return g.V().repeat(out().group("a").by("name").by().<Collection>by(count(Scope.local))).times(2).cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
-            return g.V().<Long, Collection<String>>group().by(outE().count()).by("name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java
deleted file mode 100644
index f63697e..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectTest.java
+++ /dev/null
@@ -1,100 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class InjectTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id);
-
-    public abstract Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_out_injectXv2X_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_out_injectXv2X_name(convertToVertexId("marko"), convertToVertexId("vadas"));
-        printTraversalForm(traversal);
-        Map<String, Long> counter = new HashMap<>();
-        while (traversal.hasNext()) {
-            MapHelper.incr(counter, traversal.next(), 1l);
-        }
-        assertEquals(3, counter.size());
-        assertEquals(1l, counter.get("josh").longValue());
-        assertEquals(1l, counter.get("lop").longValue());
-        assertEquals(2l, counter.get("vadas").longValue());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
-        final Traversal<Vertex, Path> traversal = get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final Path path = traversal.next();
-            if (path.get("a").equals("daniel")) {
-                assertEquals(2, path.size());
-                assertEquals(6, (int) path.get(1));
-            } else {
-                assertEquals(4, path.size());
-                assertEquals(path.<String>get("a").length(), (int) path.get(3));
-            }
-        }
-        assertEquals(4, counter);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends InjectTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
-            return g.V(v1Id).out().inject(g.V(v2Id).next()).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
-            return g.V(v1Id).out().<String>values("name").inject("daniel").as("a").map(t -> t.get().length()).path();
-        }
-    }
-}


[03/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
new file mode 100644
index 0000000..f7b4d2a
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
@@ -0,0 +1,274 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.*;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.concurrent.TimeUnit;
+import java.util.function.Consumer;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
+import static org.junit.Assert.*;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ProfileTest extends AbstractGremlinProcessTest {
+    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile();
+
+    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile();
+
+    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile();
+
+    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_modern_profile() {
+        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        metrics = traversalMetrics.getMetrics(2);
+        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_out_out_grateful_profile() {
+        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        metrics = traversalMetrics.getMetrics(2);
+        assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_sleep_sleep_profile() {
+        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_sleep_sleep_profile();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
+
+        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        // Grab the second (sideEffect{sleep}) step and check the times.
+        Metrics metrics = traversalMetrics.getMetrics(1);
+        // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation
+        assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) >= 60);
+        assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
+
+        // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
+        metrics = traversalMetrics.getMetrics(2);
+        assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) >= 30);
+        assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_repeat_both_modern_profile() {
+        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_repeat_both_profile();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        // Test the nested global metrics of the repeat step
+        Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
+        assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+        Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
+        assertEquals(72, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+        assertNotEquals(0, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Count should be greater than traversers.", repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
+
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
+        assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
+
+        assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends ProfileTest {
+
+        @Override
+        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
+            return (Traversal) g.V().out().out().profile();
+        }
+
+        @Override
+        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
+            return (Traversal) g.V().repeat(both()).times(3).profile();
+        }
+
+        @Override
+        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
+            return (Traversal) g.V().sideEffect(new Consumer<Traverser<Vertex>>() {
+                @Override
+                public void accept(final Traverser<Vertex> vertexTraverser) {
+                    try {
+                        Thread.sleep(10);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }).sideEffect(new Consumer<Traverser<Vertex>>() {
+                @Override
+                public void accept(final Traverser<Vertex> vertexTraverser) {
+                    try {
+                        Thread.sleep(5);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }).profile();
+        }
+
+        @Override
+        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+            return (Traversal) g.V().has(__.in("created").count().is(1l)).values("name").profile();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
new file mode 100644
index 0000000..0149831
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackTest.java
@@ -0,0 +1,103 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Operator;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SackTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
+
+    public abstract Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
+
+    public abstract Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+        final Traversal<Vertex, Double> traversal = get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
+        assertEquals(3.5d, traversal.next(), 0.00001d);
+        assertFalse(traversal.hasNext());
+    }
+
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+        final Traversal<Vertex, Float> traversal = get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
+        super.checkResults(Arrays.asList(2.0f, 1.4f), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+        final Traversal<Vertex, Map> traversal = get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
+        int counter = 0;
+        while (traversal.hasNext()) {
+            final Map map = traversal.next();
+            assertEquals(1, map.size());
+            assertTrue(map.containsKey("a"));
+            assertTrue(map.get("a").equals("ripple") || map.get("a").equals("lop"));
+            counter++;
+        }
+        assertEquals(2, counter);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends SackTest {
+        @Override
+        public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+            return g.V().withSack(0.0f).outE().sack(Operator.sum, "weight").inV().sack().sum();
+        }
+
+        @Override
+        public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+            return g.V().withSack(0.0f).repeat(outE().sack(Operator.sum, "weight").inV()).times(2).sack();
+        }
+
+        @Override
+        public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+            return g.V().<HashMap>withSack(HashMap::new, m -> (HashMap) m.clone()).out().out().<Map>sack((map, vertex) -> {
+                map.put("a", vertex.value("name"));
+                return map;
+            }).sack();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java
new file mode 100644
index 0000000..b7b0fd0
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapTest.java
@@ -0,0 +1,95 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SideEffectCapTest extends AbstractGremlinProcessTest {
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
+
+    public abstract Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
+        printTraversalForm(traversal);
+        Map<String, Long> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(map.get("marko"), new Long(1l));
+        assertEquals(map.get("vadas"), new Long(1l));
+        assertEquals(map.get("peter"), new Long(1l));
+        assertEquals(map.get("josh"), new Long(1l));
+        assertEquals(map.size(), 4);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+        final Traversal<Vertex, Map<String, Map<Object, Long>>> traversal = get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        Map<String, Map<Object, Long>> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertTrue(map.containsKey("a"));
+        assertTrue(map.containsKey("b"));
+        assertEquals(4, map.get("a").size());
+        assertEquals(2, map.get("b").size());
+        assertEquals(1l, map.get("a").get(27).longValue());
+        assertEquals(1l, map.get("a").get(29).longValue());
+        assertEquals(1l, map.get("a").get(32).longValue());
+        assertEquals(1l, map.get("a").get(35).longValue());
+        assertEquals(1l, map.get("b").get("ripple").longValue());
+        assertEquals(1l, map.get("b").get("lop").longValue());
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends SideEffectCapTest {
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+            return g.V().has("age").groupCount("a").by("name").out().cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+            return g.V().choose(has(T.label, "person"),
+                    values("age").groupCount("a"),
+                    values("name").groupCount("b")).cap("a", "b");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java
new file mode 100644
index 0000000..0929f89
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class SideEffectTest extends AbstractGremlinTest {
+    public abstract Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_sideEffectXstore_aX_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_sideEffectXstore_aX_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertEquals(traversal.next(), "marko");
+        assertFalse(traversal.hasNext());
+        assertEquals(convertToVertexId("marko"), traversal.asAdmin().getSideEffects().<List<Vertex>>get("a").get(0).id());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_sideEffectXincr_cX_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXincr_cX_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
+        assertEquals(new Integer(3), traversal.asAdmin().getSideEffects().<List<Integer>>get("c").get(0));
+    }
+
+    private void assert_g_v1_out_sideEffectXincr_cX_valueXnameX(final Iterator<String> traversal) {
+        final List<String> names = new ArrayList<>();
+        while (traversal.hasNext()) {
+            names.add(traversal.next());
+        }
+        assertEquals(3, names.size());
+        assertTrue(names.contains("josh"));
+        assertTrue(names.contains("lop"));
+        assertTrue(names.contains("vadas"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_sideEffectXX_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXX_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class Traversals extends SideEffectTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
+            return g.V(v1Id).withSideEffect("a", ArrayList::new).sideEffect(traverser -> {
+                traverser.<List>sideEffects("a").clear();
+                traverser.<List<Vertex>>sideEffects("a").add(traverser.get());
+            }).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
+            return g.V(v1Id).withSideEffect("c", () -> {
+                final List<Integer> list = new ArrayList<>();
+                list.add(0);
+                return list;
+            }).out().sideEffect(traverser -> {
+                Integer temp = traverser.<List<Integer>>sideEffects("c").get(0);
+                traverser.<List<Integer>>sideEffects("c").clear();
+                traverser.<List<Integer>>sideEffects("c").add(temp + 1);
+            }).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
+            return g.V(v1Id).out().sideEffect(traverser -> {
+            }).values("name");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java
new file mode 100644
index 0000000..27a376b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.HashSetSupplier;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class StoreTest extends AbstractGremlinProcessTest {
+    public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX();
+
+    public abstract Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
+
+    public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_storeXa_nameX_out_capXaX() {
+        final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXnameX_out_capXaX();
+        printTraversalForm(traversal);
+        Collection names = traversal.next();
+        assertEquals(6, names.size());
+        assertTrue(names.contains("marko"));
+        assertTrue(names.contains("josh"));
+        assertTrue(names.contains("peter"));
+        assertTrue(names.contains("lop"));
+        assertTrue(names.contains("ripple"));
+        assertTrue(names.contains("vadas"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX() {
+        final Traversal<Vertex, Collection> traversal = get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        Collection names = traversal.next();
+        assertEquals(4, names.size());
+        assertTrue(names.contains("marko"));
+        assertTrue(names.contains("josh"));
+        assertTrue(names.contains("vadas"));
+        assertTrue(names.contains("lop"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_withXa_setX_both_name_storeXaX() {
+        final Traversal<Vertex, Set<String>> traversal = get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
+        printTraversalForm(traversal);
+        final Set<String> names = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertFalse(names instanceof BulkSet);
+        assertEquals(6, names.size());
+        assertTrue(names.contains("marko"));
+        assertTrue(names.contains("vadas"));
+        assertTrue(names.contains("josh"));
+        assertTrue(names.contains("lop"));
+        assertTrue(names.contains("ripple"));
+        assertTrue(names.contains("peter"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX() {
+        final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Collection store = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(8, store.size());
+        assertTrue(store.contains(0L));
+        assertTrue(store.contains(1L));
+        assertTrue(store.contains(2L));
+        assertTrue(store.contains(1.0d));
+        assertFalse(store.isEmpty());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends StoreTest {
+        @Override
+        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
+            return g.V().store("a").by("name").out().cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id) {
+            return g.V(v1Id).store("a").by("name").out().store("a").by("name").values("name").cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
+            return g.V().withSideEffect("a", HashSetSupplier.instance()).both().<String>values("name").store("a").cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
+            return g.V().store("a").by(outE("created").count()).out().out().store("a").by(inE("created").values("weight").sum()).cap("a");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java
new file mode 100644
index 0000000..14f905b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphTest.java
@@ -0,0 +1,116 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.FeatureRequirement;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.commons.configuration.Configuration;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES;
+import static org.apache.tinkerpop.gremlin.structure.Graph.Features.ElementFeatures.FEATURE_USER_SUPPLIED_IDS;
+import static org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
+
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class SubgraphTest extends AbstractGremlinProcessTest {
+    public abstract Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph);
+
+    public abstract Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+    public void g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX() throws Exception {
+        final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
+        graphProvider.clear(config);
+        Graph subgraph = graphProvider.openTestGraph(config);
+        /////
+        Traversal<Vertex, Graph> traversal = get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(convertToVertexId("marko"), subgraph);
+        printTraversalForm(traversal);
+        subgraph = traversal.next();
+        assertVertexEdgeCounts(3, 2).accept(subgraph);
+        subgraph.edges().forEachRemaining(e -> {
+            assertEquals("knows", e.label());
+            assertEquals("marko", e.outVertex().values("name").next());
+            assertEquals(new Integer(29), e.outVertex().<Integer>values("age").next());
+            assertEquals("person", e.outVertex().label());
+
+            final String name = e.inVertex().<String>values("name").next();
+            if (name.equals("vadas"))
+                assertEquals(0.5d, e.value("weight"), 0.0001d);
+            else if (name.equals("josh"))
+                assertEquals(1.0d, e.value("weight"), 0.0001d);
+            else
+                fail("There's a vertex present that should not be in the subgraph");
+        });
+        graphProvider.clear(subgraph, config);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
+    public void g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup() throws Exception {
+        final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
+        graphProvider.clear(config);
+        final Graph subgraph = graphProvider.openTestGraph(config);
+        /////
+        Traversal<Vertex, String> traversal = get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(subgraph);
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
+        final Graph subGraph = traversal.asAdmin().getSideEffects().get("sg");
+        assertVertexEdgeCounts(5, 4).accept(subGraph);
+
+        graphProvider.clear(subgraph, config);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class Traversals extends SubgraphTest {
+
+        @Override
+        public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph) {
+            return g.V(v1Id).withSideEffect("sg", () -> subgraph).outE("knows").subgraph("sg").values("name").cap("sg");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph) {
+            return g.V().withSideEffect("sg", () -> subgraph).repeat(bothE("created").subgraph("sg").outV()).times(5).<String>values("name").dedup();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java
new file mode 100644
index 0000000..a801c71
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeTest.java
@@ -0,0 +1,142 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.*;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class TreeTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX();
+
+    public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX();
+
+    public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree();
+
+    public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX();
+
+    public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id);
+
+    @Test
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_out_tree_byXnameX() {
+        List<Traversal<Vertex, Tree>> traversals = Arrays.asList(
+                get_g_VX1X_out_out_tree_byXnameX(convertToVertexId("marko")),
+                get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(convertToVertexId("marko")));
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Tree tree = traversal.next();
+            assertFalse(traversal.hasNext());
+            assertEquals(1, tree.size());
+            assertTrue(tree.containsKey("marko"));
+            assertEquals(1, ((Map) tree.get("marko")).size());
+            assertTrue(((Map) tree.get("marko")).containsKey("josh"));
+            assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("lop"));
+            assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("ripple"));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_tree_byXidX() {
+        List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree_byXidX(), get_g_V_out_out_treeXaX_byXidX_capXaX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Tree tree = traversal.next();
+            assertFalse(traversal.hasNext());
+            assertEquals(1, tree.size());
+            assertTrue(tree.containsKey(convertToVertexId("marko")));
+            assertEquals(1, ((Map) tree.get(convertToVertexId("marko"))).size());
+            assertTrue(((Map) tree.get(convertToVertexId("marko"))).containsKey(convertToVertexId("josh")));
+            assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("lop")));
+            assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("ripple")));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_treeXaX_capXaX() {
+        List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree(), get_g_V_out_out_treeXaX_capXaX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Tree tree = traversal.next();
+            assertFalse(traversal.hasNext());
+            assertEquals(1, tree.size());
+            assertTrue(tree.containsKey(convertToVertex(graph, "marko")));
+            assertEquals(1, ((Map) tree.get(convertToVertex(graph, "marko"))).size());
+            assertTrue(((Map) tree.get(convertToVertex(graph, "marko"))).containsKey(convertToVertex(graph, "josh")));
+            assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "lop")));
+            assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "ripple")));
+        });
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends TreeTest {
+        @Override
+        public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
+            return (Traversal) g.V(v1Id).out().out().tree().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
+            return g.V(v1Id).out().out().tree("a").by("name").both().both().cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
+            return (Traversal) g.V().out().out().tree().by(T.id);
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
+            return (Traversal) g.V().out().out().tree("a").by(T.id).cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
+            return (Traversal) g.V().out().out().tree();
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
+            return (Traversal) g.V().out().out().tree("a").cap("a");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
new file mode 100644
index 0000000..752d2e2
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathTest.java
@@ -0,0 +1,122 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@UseEngine(TraversalEngine.Type.STANDARD)
+public class PathTest extends AbstractGremlinProcessTest {
+
+    @Test
+    public void shouldHaveStandardSemanticsImplementedCorrectly() {
+        Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
+            assertTrue(path.isSimple());
+            assertEquals(0, path.size());
+            path = path.extend(1, "a");
+            path = path.extend(2, "b");
+            path = path.extend(3, "c");
+            assertEquals(3, path.size());
+            assertEquals(Integer.valueOf(1), path.get("a"));
+            assertEquals(Integer.valueOf(2), path.get("b"));
+            assertEquals(Integer.valueOf(3), path.get("c"));
+            path.addLabel("d");
+            assertEquals(3, path.size());
+            assertEquals(Integer.valueOf(1), path.get("a"));
+            assertEquals(Integer.valueOf(2), path.get("b"));
+            assertEquals(Integer.valueOf(3), path.get("c"));
+            assertEquals(Integer.valueOf(3), path.get("d"));
+            assertTrue(path.hasLabel("a"));
+            assertTrue(path.hasLabel("b"));
+            assertTrue(path.hasLabel("c"));
+            assertTrue(path.hasLabel("d"));
+            assertFalse(path.hasLabel("e"));
+            assertTrue(path.isSimple());
+            path = path.extend(3, "e");
+            assertFalse(path.isSimple());
+            assertTrue(path.hasLabel("e"));
+            assertEquals(4, path.size());
+            assertEquals(Integer.valueOf(1), path.get(0));
+            assertEquals(Integer.valueOf(2), path.get(1));
+            assertEquals(Integer.valueOf(3), path.get(2));
+            assertEquals(Integer.valueOf(3), path.get(3));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
+    public void shouldHandleMultiLabelPaths() {
+        Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
+            path = path.extend("marko", "a");
+            path = path.extend("stephen", "b");
+            path = path.extend("matthias", "a");
+            assertEquals(3, path.size());
+            assertEquals(3, path.objects().size());
+            assertEquals(3, path.labels().size());
+            assertEquals(2, new HashSet<>(path.labels()).size());
+            assertTrue(path.get("a") instanceof List);
+            assertTrue(path.get("b") instanceof String);
+            assertEquals(2, path.<List<String>>get("a").size());
+            assertTrue(path.<List<String>>get("a").contains("marko"));
+            assertTrue(path.<List<String>>get("a").contains("matthias"));
+        });
+
+        final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
+        assertEquals(3, path.size());
+        assertEquals(3, path.labels().size());
+        assertEquals(2, new HashSet<>(path.labels()).size());
+        assertTrue(path.get("x") instanceof String);
+        assertTrue(path.get("y") instanceof List);
+        assertEquals(2, path.<List<String>>get("y").size());
+        assertTrue(path.<List<String>>get("y").contains("josh"));
+        assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
+    }
+
+    @Test
+    public void shouldExcludeUnlabeledLabelsFromPath() {
+        Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
+            path = path.extend("marko", "a");
+            path = path.extend("stephen", "b");
+            path = path.extend("matthias", "c", "d");
+            assertEquals(3, path.size());
+            assertEquals(3, path.objects().size());
+            assertEquals(3, path.labels().size());
+            assertEquals(1, path.labels().get(0).size());
+            assertEquals(1, path.labels().get(1).size());
+            assertEquals("b", path.labels().get(1).iterator().next());
+            assertEquals(2, path.labels().get(2).size());
+            assertTrue(path.labels().get(2).contains("c"));
+            assertTrue(path.labels().get(2).contains("d"));
+        });
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
index cd0e219..61e149b 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyProcessTest.java
@@ -20,9 +20,9 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
index b031db7..a28dac2 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategyProcessTest.java
@@ -20,10 +20,10 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
index 11d3bcc..2ecffc3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
@@ -20,10 +20,10 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
@@ -32,8 +32,8 @@ import java.util.NoSuchElementException;
 import java.util.function.Predicate;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java
new file mode 100644
index 0000000..1b8252e
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategyTest.java
@@ -0,0 +1,129 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class TraversalVerificationStrategyTest extends AbstractGremlinProcessTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends TraversalVerificationStrategyTest {
+        @Test
+        @LoadGraphWith(MODERN)
+        public void shouldAllowNestedGlobalTraversalToHaveBarriers() {
+            try {
+                g.V().values("age").union(max(), min(), sum()).iterate();
+            } catch (IllegalStateException e) {
+                fail("Nested global traversals can have barrier steps on STANDARD:" + e.getMessage());
+            }
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void shouldAllowMidTraversalBarriersOnComputer() {
+            try {
+                g.V().count().sum().iterate();
+            } catch (IllegalStateException e) {
+                fail("Mid-traversal barrier steps are OK on STANDARD: " + e.getMessage());
+            }
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void shouldAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
+            try {
+                g.V().local(out().out()).iterate();
+            } catch (IllegalStateException e) {
+                fail("Local traversals leaving the star-graph are OK on STANDARD: " + e.getMessage());
+            }
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends TraversalVerificationStrategyTest {
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void shouldNotAllowNestedGlobalTraversalToHaveBarriers() {
+            try {
+                final GraphTraversal t = g.V().values("age").union(max(), min(), sum()).iterate();
+                fail("Nested global traversals should not be allowed to contain barriers (COMPUTER): " + t);
+            } catch (IllegalStateException e) {
+               assertTrue(true);
+            }
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void shouldNotAllowMidTraversalBarriersOnComputer() {
+            try {
+                final GraphTraversal t = g.V().count().sum().iterate();
+                fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
+            } catch (IllegalStateException e) {
+                assertTrue(true);
+            }
+
+            try {
+                final GraphTraversal t = g.V().count().sum().map(x -> x.get() * 19).iterate();
+                fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
+            } catch (IllegalStateException e) {
+                assertTrue(true);
+            }
+        }
+
+        @Test
+        @LoadGraphWith(MODERN)
+        public void shouldNotAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
+            try {
+                final GraphTraversal t = g.V().local(out().out()).iterate();
+                fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
+            } catch (IllegalStateException e) {
+                assertTrue(true);
+            }
+
+            try {
+                final GraphTraversal t = g.V().local(out().values("name")).iterate();
+                fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
+            } catch (IllegalStateException e) {
+                assertTrue(true);
+            }
+
+            try {
+                g.V().local(outE().values("weight")).iterate();
+                g.V().local(out().id()).iterate();
+                g.V().local(outE().inV()).iterate();
+            } catch (IllegalStateException e) {
+                fail("Local traversals on the star-graph are OK on COMPUTER: " + e.getMessage());
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java
new file mode 100644
index 0000000..5827b8f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalTest.java
@@ -0,0 +1,48 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversalTest {
+
+    @Test
+    public void shouldCloneTraversalCorrectly() throws CloneNotSupportedException {
+        final DefaultGraphTraversal<?, ?> original = new DefaultGraphTraversal<>(EmptyGraph.instance());
+        original.out().groupCount("m").values("name").count();
+        final DefaultTraversal<?, ?> clone = (DefaultTraversal) original.clone();
+        assertNotEquals(original.hashCode(), clone.hashCode());
+        assertEquals(original.getSteps().size(), clone.getSteps().size());
+
+        for (int i = 0; i < original.steps.size(); i++) {
+            assertNotEquals(original.getSteps().get(i), clone.getSteps().get(i));
+        }
+        assertNotEquals(original.sideEffects, clone.sideEffects);
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java
deleted file mode 100644
index 5aab83a..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/util/PathTest.java
+++ /dev/null
@@ -1,124 +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.util;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.util.path.ImmutablePath;
-import org.apache.tinkerpop.gremlin.process.util.path.MutablePath;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-@UseEngine(TraversalEngine.Type.STANDARD)
-public class PathTest extends AbstractGremlinProcessTest {
-
-    @Test
-    public void shouldHaveStandardSemanticsImplementedCorrectly() {
-        Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
-            assertTrue(path.isSimple());
-            assertEquals(0, path.size());
-            path = path.extend(1, "a");
-            path = path.extend(2, "b");
-            path = path.extend(3, "c");
-            assertEquals(3, path.size());
-            assertEquals(Integer.valueOf(1), path.get("a"));
-            assertEquals(Integer.valueOf(2), path.get("b"));
-            assertEquals(Integer.valueOf(3), path.get("c"));
-            path.addLabel("d");
-            assertEquals(3, path.size());
-            assertEquals(Integer.valueOf(1), path.get("a"));
-            assertEquals(Integer.valueOf(2), path.get("b"));
-            assertEquals(Integer.valueOf(3), path.get("c"));
-            assertEquals(Integer.valueOf(3), path.get("d"));
-            assertTrue(path.hasLabel("a"));
-            assertTrue(path.hasLabel("b"));
-            assertTrue(path.hasLabel("c"));
-            assertTrue(path.hasLabel("d"));
-            assertFalse(path.hasLabel("e"));
-            assertTrue(path.isSimple());
-            path = path.extend(3, "e");
-            assertFalse(path.isSimple());
-            assertTrue(path.hasLabel("e"));
-            assertEquals(4, path.size());
-            assertEquals(Integer.valueOf(1), path.get(0));
-            assertEquals(Integer.valueOf(2), path.get(1));
-            assertEquals(Integer.valueOf(3), path.get(2));
-            assertEquals(Integer.valueOf(3), path.get(3));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
-    public void shouldHandleMultiLabelPaths() {
-        Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
-            path = path.extend("marko", "a");
-            path = path.extend("stephen", "b");
-            path = path.extend("matthias", "a");
-            assertEquals(3, path.size());
-            assertEquals(3, path.objects().size());
-            assertEquals(3, path.labels().size());
-            assertEquals(2, new HashSet<>(path.labels()).size());
-            assertTrue(path.get("a") instanceof List);
-            assertTrue(path.get("b") instanceof String);
-            assertEquals(2, path.<List<String>>get("a").size());
-            assertTrue(path.<List<String>>get("a").contains("marko"));
-            assertTrue(path.<List<String>>get("a").contains("matthias"));
-        });
-
-        final Path path = g.V().as("x").repeat(out().as("y")).times(2).path().by("name").next();
-        assertEquals(3, path.size());
-        assertEquals(3, path.labels().size());
-        assertEquals(2, new HashSet<>(path.labels()).size());
-        assertTrue(path.get("x") instanceof String);
-        assertTrue(path.get("y") instanceof List);
-        assertEquals(2, path.<List<String>>get("y").size());
-        assertTrue(path.<List<String>>get("y").contains("josh"));
-        assertTrue(path.<List<String>>get("y").contains("ripple") || path.<List<String>>get("y").contains("lop"));
-    }
-
-    @Test
-    public void shouldExcludeUnlabeledLabelsFromPath() {
-        Arrays.asList(MutablePath.make(), ImmutablePath.make()).forEach(path -> {
-            path = path.extend("marko", "a");
-            path = path.extend("stephen", "b");
-            path = path.extend("matthias", "c", "d");
-            assertEquals(3, path.size());
-            assertEquals(3, path.objects().size());
-            assertEquals(3, path.labels().size());
-            assertEquals(1, path.labels().get(0).size());
-            assertEquals(1, path.labels().get(1).size());
-            assertEquals("b", path.labels().get(1).iterator().next());
-            assertEquals(2, path.labels().get(2).size());
-            assertTrue(path.labels().get(2).contains("c"));
-            assertTrue(path.labels().get(2).contains("d"));
-        });
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
index c8bcdbd..c5eaf15 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/BatchTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.util.batch.BatchGraph;
 import org.apache.tinkerpop.gremlin.structure.util.batch.Exists;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
index 69dea3c..706c363 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/FeatureSupportTest.java
@@ -23,7 +23,7 @@ import org.apache.tinkerpop.gremlin.ExceptionCoverage;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgeFeatures;
 import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
 import org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
index 15c799c..996c116 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/GraphTest.java
@@ -24,7 +24,7 @@ import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.GraphManager;
 import org.apache.tinkerpop.gremlin.GraphProvider;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.util.StreamFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
index dc69dbb..b99c2f3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/IoTest.java
@@ -35,7 +35,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.TestHelper;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgePropertyFeatures;
 import org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexPropertyFeatures;
 import org.apache.tinkerpop.gremlin.structure.io.GraphMigrator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
index c0593d0..2d7571a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
@@ -25,8 +25,8 @@ import com.fasterxml.jackson.core.type.TypeReference;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.io.graphson.GraphSONTokens;
 import org.apache.tinkerpop.gremlin.structure.io.gryo.GryoMapper;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
index 92f448b..37a0ac7 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexPropertyTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.ExceptionCoverage;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.util.function.FunctionUtils;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
index 79f4b9c..cafcbbd 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/VertexTest.java
@@ -24,7 +24,7 @@ import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.GraphManager;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures;
 import org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexPropertyFeatures;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
index b24e517..7f7ce37 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/IdStrategyTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;


[35/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index c6990cc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxGlobalStep.java
+++ /dev/null
@@ -1,133 +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.map;
-
-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.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 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 MapReducer {
-
-    public MaxGlobalStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier(new ConstantSupplier<>(null));
-        this.setBiFunction(MaxGlobalBiFunction.<S>instance());
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
-        return MaxGlobalMapReduce.instance();
-    }
-
-    /////
-
-    private static class MaxGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
-
-        private static final MaxGlobalBiFunction INSTANCE = new MaxGlobalBiFunction();
-
-        private MaxGlobalBiFunction() {
-
-        }
-
-        @Override
-        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
-            return mutatingSeed != null && mutatingSeed.doubleValue() >= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
-        }
-
-        public final static <S extends Number> MaxGlobalBiFunction<S> instance() {
-            return INSTANCE;
-        }
-    }
-
-    ///////////
-
-    private static class MaxGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
-
-        private static final MaxGlobalMapReduce INSTANCE = new MaxGlobalMapReduce();
-
-        private MaxGlobalMapReduce() {
-
-        }
-
-        @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) {
-            if (values.hasNext()) {
-                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 Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
-            return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
-        }
-
-        public static final MaxGlobalMapReduce instance() {
-            return INSTANCE;
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java
deleted file mode 100644
index dcafe1a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxLocalStep.java
+++ /dev/null
@@ -1,59 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
-
-    public MaxLocalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<S> traverser) {
-        Number result;
-        final Iterator<E> iterator = traverser.get().iterator();
-        if (iterator.hasNext()) {
-            result = iterator.next();
-            while (iterator.hasNext()) {
-                final Number curr = iterator.next();
-                if (result.doubleValue() < curr.doubleValue()) result = curr;
-            }
-        } else {
-            result = Double.NaN;
-        }
-        return (E) result;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 51fc509..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanGlobalStep.java
+++ /dev/null
@@ -1,218 +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.map;
-
-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.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.MeanNumberSupplier;
-
-import java.io.Serializable;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> implements MapReducer {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT, TraverserRequirement.BULK);
-
-    public MeanGlobalStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier((Supplier) MeanNumberSupplier.instance());
-        this.setBiFunction((BiFunction) MeanGlobalBiFunction.instance());
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-
-    @Override
-    public MapReduce<Number, Long, Number, Long, Double> getMapReduce() {
-        return MeanGlobalMapReduce.instance();
-    }
-
-    /////
-
-    private static class MeanGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
-
-        private static final MeanGlobalBiFunction INSTANCE = new MeanGlobalBiFunction();
-
-        private MeanGlobalBiFunction() {
-
-        }
-
-        @Override
-        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
-            return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
-        }
-
-        public final static <S extends Number> MeanGlobalBiFunction<S> instance() {
-            return INSTANCE;
-        }
-    }
-
-    ///////////
-
-    private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Double> {
-
-        private static final MeanGlobalMapReduce INSTANCE = new MeanGlobalMapReduce();
-
-        private MeanGlobalMapReduce() {
-
-        }
-
-        @Override
-        public boolean doStage(final MapReduce.Stage stage) {
-            return true;
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<Number, Long> emitter) {
-            vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
-        }
-
-        @Override
-        public void combine(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
-            this.reduce(key, values, emitter);
-        }
-
-        @Override
-        public void reduce(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
-            long counter = 0;
-            while (values.hasNext()) {
-                counter = counter + values.next();
-            }
-            emitter.emit(key, counter);
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return REDUCING;
-        }
-
-        @Override
-        public Double generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
-            if (keyValues.hasNext()) {
-                KeyValue<Number, Long> pair = keyValues.next();
-                double result = pair.getKey().doubleValue() * pair.getValue();
-                long counter = pair.getValue();
-                while (keyValues.hasNext()) {
-                    pair = keyValues.next();
-                    result += pair.getKey().doubleValue() * pair.getValue();
-                    counter += pair.getValue();
-                }
-                return result / counter;
-            }
-            return Double.NaN;
-        }
-
-        public static final MeanGlobalMapReduce instance() {
-            return INSTANCE;
-        }
-    }
-
-    ///
-
-    public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
-
-        private long count;
-        private double sum;
-
-        public MeanNumber() {
-            this(0.0d, 0l);
-        }
-
-        public MeanNumber(final double number, final long count) {
-            this.count = count;
-            this.sum = number * count;
-        }
-
-        public MeanNumber add(final Number amount, final long count) {
-            this.count += count;
-            this.sum += amount.doubleValue() * count;
-            return this;
-        }
-
-        public MeanNumber add(final MeanNumber other) {
-            this.count += other.count;
-            this.sum += other.sum;
-            return this;
-        }
-
-        @Override
-        public int intValue() {
-            return (int) (this.sum / this.count);
-        }
-
-        @Override
-        public long longValue() {
-            return (long) (this.sum / this.count);
-        }
-
-        @Override
-        public float floatValue() {
-            return (float) (this.sum / this.count);
-        }
-
-        @Override
-        public double doubleValue() {
-            return this.sum / this.count;
-        }
-
-        @Override
-        public String toString() {
-            return Double.toString(this.doubleValue());
-        }
-
-        @Override
-        public int compareTo(final Number number) {
-            return Double.valueOf(this.doubleValue()).compareTo(number.doubleValue());
-        }
-
-        @Override
-        public boolean equals(final Object object) {
-            return object instanceof Number && Double.valueOf(this.doubleValue()).equals(((Number) object).doubleValue());
-        }
-
-        @Override
-        public int hashCode() {
-            return Double.valueOf(this.doubleValue()).hashCode();
-        }
-
-        @Override
-        public Double getFinal() {
-            return this.doubleValue();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java
deleted file mode 100644
index 6953334..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanLocalStep.java
+++ /dev/null
@@ -1,59 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MeanLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, Double> {
-
-    public MeanLocalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Double map(final Traverser.Admin<S> traverser) {
-        final Iterator<E> iterator = traverser.get().iterator();
-        if (iterator.hasNext()) {
-            Long counter = 1L;
-            Double result = iterator.next().doubleValue();
-            while (iterator.hasNext()) {
-                result += iterator.next().doubleValue();
-                counter++;
-            }
-            return result / counter;
-        } else {
-            return Double.NaN;
-        }
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 999ed5e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinGlobalStep.java
+++ /dev/null
@@ -1,133 +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.map;
-
-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.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 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 MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
-
-    public MinGlobalStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier(new ConstantSupplier<>(null));
-        this.setBiFunction(MinGlobalBiFunction.instance());
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
-        return MinGlobalMapReduce.instance();
-    }
-
-    /////
-
-    private static class MinGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
-
-        private static final MinGlobalBiFunction INSTANCE = new MinGlobalBiFunction();
-
-        private MinGlobalBiFunction() {
-
-        }
-
-        @Override
-        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
-            return mutatingSeed != null && mutatingSeed.doubleValue() <= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
-        }
-
-        public final static <S extends Number> MinGlobalBiFunction<S> instance() {
-            return INSTANCE;
-        }
-    }
-
-    ///////////
-
-    private static class MinGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
-
-        private static final MinGlobalMapReduce INSTANCE = new MinGlobalMapReduce();
-
-        private MinGlobalMapReduce() {
-
-        }
-
-        @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) {
-            if (values.hasNext()) {
-                Number min = Double.MAX_VALUE;
-                while (values.hasNext()) {
-                    final Number value = values.next();
-                    if (value.doubleValue() < min.doubleValue())
-                        min = value;
-                }
-                emitter.emit(min);
-            }
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return REDUCING;
-        }
-
-        @Override
-        public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
-            return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
-        }
-
-        public static final MinGlobalMapReduce instance() {
-            return INSTANCE;
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java
deleted file mode 100644
index 2dc970f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinLocalStep.java
+++ /dev/null
@@ -1,59 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
-
-    public MinLocalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<S> traverser) {
-        Number result;
-        final Iterator<E> iterator = traverser.get().iterator();
-        if (iterator.hasNext()) {
-            result = iterator.next();
-            while (iterator.hasNext()) {
-                final Number curr = iterator.next();
-                if (result.doubleValue() > curr.doubleValue()) result = curr;
-            }
-        } else {
-            result = Double.NaN;
-        }
-        return (E) result;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
deleted file mode 100644
index acd1f9a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderGlobalStep.java
+++ /dev/null
@@ -1,95 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.util.function.ChainedComparator;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S> {
-
-    private final List<Comparator<S>> comparators = new ArrayList<>();
-
-    public OrderGlobalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    public void barrierConsumer(final TraverserSet<S> traverserSet) {
-        traverserSet.sort(this.comparators.isEmpty() ? new ComparatorTraverser(Order.incr) : new ChainedComparator(ComparatorTraverser.convertComparator((List) this.comparators)));
-    }
-
-    @Override
-    public void addComparator(final Comparator<S> comparator) {
-        this.comparators.add(comparator);
-    }
-
-    @Override
-    public List<Comparator<S>> getComparators() {
-        return this.comparators.isEmpty() ? Arrays.asList((Comparator) Order.incr) : this.comparators;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.comparators);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-
-    /////
-
-    private static class ComparatorTraverser<S> implements Comparator<Traverser<S>>, Serializable {
-
-        private final Comparator<S> comparator;
-
-        public ComparatorTraverser(final Comparator<S> comparator) {
-            this.comparator = comparator;
-        }
-
-        @Override
-        public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
-            return this.comparator.compare(traverserA.get(), traverserB.get());
-        }
-
-        public static <S> List<ComparatorTraverser<S>> convertComparator(final List<Comparator<S>> comparators) {
-            return comparators.stream().map(comparator -> new ComparatorTraverser<>(comparator)).collect(Collectors.toList());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java
deleted file mode 100644
index 1bcb26f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderLocalStep.java
+++ /dev/null
@@ -1,100 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class OrderLocalStep<S, M> extends MapStep<S, S> implements ComparatorHolder<M> {
-
-    private final List<Comparator<M>> comparators = new ArrayList<>();
-    private Comparator<M> chainedComparator = null;
-
-    public OrderLocalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected S map(final Traverser.Admin<S> traverser) {
-        final S start = traverser.get();
-        if (start instanceof Collection)
-            return (S) OrderLocalStep.sortCollection((List) start, this.chainedComparator);
-        else if (start instanceof Map)
-            return (S) OrderLocalStep.sortMap((Map) start, this.chainedComparator);
-        else
-            return start;
-    }
-
-    @Override
-    public void addComparator(final Comparator<M> comparator) {
-        this.comparators.add(comparator);
-        this.chainedComparator = this.comparators.stream().reduce((a, b) -> a.thenComparing(b)).get();
-    }
-
-    @Override
-    public List<Comparator<M>> getComparators() {
-        return this.comparators;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.comparators);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-
-    /////////////
-
-    private static final <A> List<A> sortCollection(final Collection<A> collection, final Comparator<?> comparator) {
-        if (collection instanceof List) {
-            Collections.sort((List) collection, (Comparator) comparator);
-            return (List<A>) collection;
-        } else {
-            final List<A> list = new ArrayList<>(collection);
-            Collections.sort(list, (Comparator) comparator);
-            return list;
-        }
-    }
-
-    private static final <K, V> Map<K, V> sortMap(final Map<K, V> map, final Comparator<?> comparator) {
-        final List<Map.Entry<K, V>> entries = new ArrayList<>(map.entrySet());
-        Collections.sort(entries, (Comparator) comparator);
-        final LinkedHashMap<K, V> sortedMap = new LinkedHashMap<>();
-        entries.forEach(entry -> sortedMap.put(entry.getKey(), entry.getValue()));
-        return sortedMap;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java
deleted file mode 100644
index 0f03fab..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathStep.java
+++ /dev/null
@@ -1,95 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-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.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.path.MutablePath;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PathStep<S> extends MapStep<S, Path> implements TraversalParent {
-
-    private TraversalRing<Object, Object> traversalRing;
-
-    public PathStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.traversalRing = new TraversalRing<>();
-    }
-
-    @Override
-    protected Path map(final Traverser.Admin<S> traverser) {
-        final Path path;
-        if (this.traversalRing.isEmpty())
-            path = traverser.path();
-        else {
-            path = MutablePath.make();
-            traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels.toArray(new String[labels.size()])));
-        }
-        this.traversalRing.reset();
-        return path;
-    }
-
-    @Override
-    public PathStep<S> clone() {
-        final PathStep<S> clone = (PathStep<S>) super.clone();
-        clone.traversalRing = new TraversalRing<>();
-        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
-            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
-        }
-        return clone;
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.traversalRing.reset();
-    }
-
-    @Override
-    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
-        return this.traversalRing.getTraversals();
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> pathTraversal) {
-        this.traversalRing.addTraversal(this.integrateChild(pathTraversal));
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.traversalRing);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java
deleted file mode 100644
index f1360bc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesStep.java
+++ /dev/null
@@ -1,71 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.PropertyType;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PropertiesStep<E> extends FlatMapStep<Element, E> {
-
-    protected final String[] propertyKeys;
-    protected final PropertyType returnType;
-
-    public PropertiesStep(final Traversal.Admin traversal, final PropertyType propertyType, final String... propertyKeys) {
-        super(traversal);
-        this.returnType = propertyType;
-        this.propertyKeys = propertyKeys;
-    }
-
-    @Override
-    protected Iterator<E> flatMap(final Traverser.Admin<Element> traverser) {
-        return this.returnType.equals(PropertyType.VALUE) ?
-                traverser.get().values(this.propertyKeys) :
-                (Iterator) traverser.get().properties(this.propertyKeys);
-    }
-
-    public PropertyType getReturnType() {
-        return this.returnType;
-    }
-
-    public String[] getPropertyKeys() {
-        return this.propertyKeys;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java
deleted file mode 100644
index 2d425d6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyElementStep.java
+++ /dev/null
@@ -1,50 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Property;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PropertyElementStep<E> extends MapStep<Property<E>, Element> {
-
-    public PropertyElementStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Element map(final Traverser.Admin<Property<E>> traverser) {
-        return traverser.get().element();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-
-    // TODO: reverse()
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java
deleted file mode 100644
index dcef117..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyMapStep.java
+++ /dev/null
@@ -1,91 +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.map;
-
-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.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.PropertyType;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class PropertyMapStep<E> extends MapStep<Element, Map<String, E>> {   // TODO: Map<Object,E> cause of T.
-
-    protected final String[] propertyKeys;
-    protected final PropertyType returnType;
-    protected final boolean includeTokens;
-
-    public PropertyMapStep(final Traversal.Admin traversal, final boolean includeTokens, final PropertyType propertyType, final String... propertyKeys) {
-        super(traversal);
-        this.includeTokens = includeTokens;
-        this.propertyKeys = propertyKeys;
-        this.returnType = propertyType;
-    }
-
-    @Override
-    protected Map<String, E> map(final Traverser.Admin<Element> traverser) {
-        if (this.returnType.equals(PropertyType.VALUE)) {
-            final Element element = traverser.get();
-            final Map map = traverser.get() instanceof Vertex ?
-                    (Map) ElementHelper.vertexPropertyValueMap((Vertex) element, propertyKeys) :
-                    (Map) ElementHelper.propertyValueMap(element, propertyKeys);
-            if (includeTokens) {
-                if (element instanceof VertexProperty) {
-                    map.put(T.id, element.id());
-                    map.put(T.key, ((VertexProperty) element).key());
-                    map.put(T.value, ((VertexProperty) element).value());
-                } else {
-                    map.put(T.id, element.id());
-                    map.put(T.label, element.label());
-                }
-            }
-            return map;
-
-        } else {
-            return traverser.get() instanceof Vertex ?
-                    (Map) ElementHelper.vertexPropertyMap((Vertex) traverser.get(), propertyKeys) :
-                    (Map) ElementHelper.propertyMap(traverser.get(), propertyKeys);
-        }
-    }
-
-    public PropertyType getReturnType() {
-        return this.returnType;
-    }
-
-    public String toString() {
-        return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java
deleted file mode 100644
index 63957cf..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertyValueStep.java
+++ /dev/null
@@ -1,47 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Property;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PropertyValueStep<E> extends MapStep<Property<E>, E> {
-
-    public PropertyValueStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<Property<E>> traverser) {
-        return traverser.get().value();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java
deleted file mode 100644
index 86f0cb9..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/RangeLocalStep.java
+++ /dev/null
@@ -1,84 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class RangeLocalStep<S> extends MapStep<S, S> {
-
-    private final long low;
-    private final long high;
-
-    public RangeLocalStep(final Traversal.Admin traversal, final long low, final long high) {
-        super(traversal);
-        if (low != -1 && high != -1 && low > high) {
-            throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
-        }
-        this.low = low;
-        this.high = high;
-    }
-
-    @Override
-    protected S map(final Traverser.Admin<S> traverser) {
-        final S start = traverser.get();
-        if (start instanceof Map) {
-            final Map map = (Map) start;
-            final long capacity = (this.high != -1 ? this.high : map.size()) - this.low;
-            final Map result = new LinkedHashMap((int) Math.min(capacity, map.size()));
-            long c = 0L;
-            for (final Object obj : map.entrySet()) {
-                final Map.Entry entry = (Map.Entry) obj;
-                if (c >= this.low) {
-                    if (c < this.high || this.high == -1) {
-                        result.put(entry.getKey(), entry.getValue());
-                    } else break;
-                }
-                c++;
-            }
-            return (S) result;
-        } else if (start instanceof Collection) {
-            final Collection collection = (Collection) start;
-            final Collection result = (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
-            long c = 0L;
-            for (final Object item : collection) {
-                if (c >= this.low) {
-                    if (c < this.high || this.high == -1) {
-                        result.add(item);
-                    } else break;
-                }
-                c++;
-            }
-            return (S) result;
-        }
-        return start;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java
deleted file mode 100644
index d24cbc4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SackStep.java
+++ /dev/null
@@ -1,46 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SackStep<S, E> extends MapStep<S, E> {
-
-    public SackStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<S> traverser) {
-        return traverser.sack();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.SACK);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java
deleted file mode 100644
index 6bf09fb..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SampleLocalStep.java
+++ /dev/null
@@ -1,112 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class SampleLocalStep<S> extends MapStep<S, S> {
-
-    private static final Random RANDOM = new Random();
-
-    private final int amountToSample;
-
-    public SampleLocalStep(final Traversal.Admin traversal, final int amountToSample) {
-        super(traversal);
-        this.amountToSample = amountToSample;
-    }
-
-    @Override
-    protected S map(final Traverser.Admin<S> traverser) {
-        final S start = traverser.get();
-        if (start instanceof Map) {
-            return mapMap((Map) start);
-        } else if (start instanceof Collection) {
-            return mapCollection((Collection) start);
-        } else if (RANDOM.nextDouble() > 0.5d) {
-            throw FastNoSuchElementException.instance();
-        }
-        return start;
-    }
-
-    private S mapCollection(final Collection collection) {
-        final int size = collection.size();
-        if (size <= this.amountToSample) {
-            return (S) collection;
-        }
-        final double individualWeight = 1.0d / size;
-        final Collection result = new BulkSet();
-        double runningWeight = 0.0d;
-        int runningAmountToSample = 0;
-        while (runningAmountToSample < this.amountToSample) {
-            for (final Object item : collection) {
-                runningWeight = runningWeight + individualWeight;
-                if (RANDOM.nextDouble() <= (runningWeight / size)) {
-                    result.add(item);
-                    if (++runningAmountToSample == this.amountToSample) {
-                        break;
-                    }
-                }
-            }
-        }
-        return (S) result;
-    }
-
-    private S mapMap(final Map map) {
-        final int size = map.size();
-        if (size <= this.amountToSample) {
-            return (S) map;
-        }
-        final double individualWeight = 1.0d / size;
-        final Map result = new HashMap(this.amountToSample);
-        double runningWeight = 0.0d;
-        while (result.size() < this.amountToSample) {
-            for (final Object obj : map.entrySet()) {
-                runningWeight = runningWeight + individualWeight;
-                final Map.Entry entry = (Map.Entry) obj;
-                if (RANDOM.nextDouble() <= (runningWeight / size)) {
-                    result.put(entry.getKey(), entry.getValue());
-                    if (result.size() == this.amountToSample) {
-                        break;
-                    }
-                }
-            }
-        }
-        return (S) result;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
deleted file mode 100644
index 0e4f8d5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectOneStep.java
+++ /dev/null
@@ -1,103 +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.map;
-
-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.graph.traversal.step.util.CollectingBarrierStep;
-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.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 java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SelectOneStep<S, E> extends MapStep<S, E> implements TraversalParent, EngineDependent {
-
-    private final String selectLabel;
-    private Traversal.Admin<Object, Object> selectTraversal = new IdentityTraversal<>();
-    private boolean requiresPaths = false;
-
-    public SelectOneStep(final Traversal.Admin traversal, final String selectLabel) {
-        super(traversal);
-        this.selectLabel = selectLabel;
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<S> traverser) {
-        final S start = traverser.get();
-        if (start instanceof Map && ((Map) start).containsKey(this.selectLabel))
-            return (E) TraversalUtil.apply(((Map) start).get(this.selectLabel), this.selectTraversal);
-        else
-            return (E) TraversalUtil.apply(traverser.path().<Object>get(this.selectLabel), this.selectTraversal);
-    }
-
-    @Override
-    public void onEngine(final TraversalEngine traversalEngine) {
-        this.requiresPaths = traversalEngine.isComputer() ?
-                TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent() :
-                TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
-                        .filter(step -> step instanceof CollectingBarrierStep)
-                        .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent()
-                                || (step.getLabel().isPresent() && this.selectLabel.equals(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
-                        .findAny().isPresent() ||
-                        TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
-                                filter(step -> step instanceof TraversalParent).findAny().isPresent();
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.selectLabel, this.selectTraversal);
-    }
-
-    @Override
-    public SelectOneStep<S, E> clone() {
-        final SelectOneStep<S, E> clone = (SelectOneStep<S, E>) super.clone();
-        clone.selectTraversal = this.selectTraversal.clone();
-        return clone;
-    }
-
-    @Override
-    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
-        return Collections.singletonList(this.selectTraversal);
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
-        this.selectTraversal = this.integrateChild(selectTraversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
-        if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
-        return requirements;
-    }
-}
-
-

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
deleted file mode 100644
index 707950e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SelectStep.java
+++ /dev/null
@@ -1,130 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-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.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-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.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Arrays;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implements TraversalParent, EngineDependent {
-
-    protected TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
-    private final List<String> selectLabels;
-    private boolean requiresPaths = false;
-
-    public SelectStep(final Traversal.Admin traversal, final String... selectLabels) {
-        super(traversal);
-        this.selectLabels = selectLabels.length == 0 ? TraversalHelper.getLabelsUpTo(this, this.traversal) : Arrays.asList(selectLabels);
-    }
-
-    @Override
-    protected Map<String, E> map(final Traverser.Admin<S> traverser) {
-        final S start = traverser.get();
-        final Map<String, E> bindings = new LinkedHashMap<>();
-
-        ////// PROCESS STEP BINDINGS
-        final Path path = traverser.path();
-        this.selectLabels.forEach(label -> {
-            if (path.hasLabel(label))
-                bindings.put(label, (E) TraversalUtil.apply(path.<Object>get(label), this.traversalRing.next()));
-        });
-
-        ////// PROCESS MAP BINDINGS
-        if (start instanceof Map) {
-            if (this.selectLabels.isEmpty())
-                ((Map<String, Object>) start).forEach((k, v) -> bindings.put(k, (E) TraversalUtil.apply(v, this.traversalRing.next())));
-            else
-                this.selectLabels.forEach(label -> {
-                    if (((Map) start).containsKey(label))
-                        bindings.put(label, (E) TraversalUtil.apply(((Map) start).get(label), this.traversalRing.next()));
-                });
-        }
-
-        this.traversalRing.reset();
-        return bindings;
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.traversalRing.reset();
-    }
-
-    @Override
-    public void onEngine(final TraversalEngine traversalEngine) {
-        this.requiresPaths = traversalEngine.isComputer() ?
-                TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent() :
-                TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
-                        .filter(step -> step instanceof CollectingBarrierStep)
-                        .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent()
-                                || (step.getLabel().isPresent() && this.selectLabels.contains(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
-                        .findAny().isPresent() ||
-                        TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
-                                filter(step -> step instanceof TraversalParent).findAny().isPresent();
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.selectLabels, this.traversalRing);
-    }
-
-    @Override
-    public SelectStep<S, E> clone() {
-        final SelectStep<S, E> clone = (SelectStep<S, E>) super.clone();
-        clone.traversalRing = new TraversalRing<>();
-        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
-            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
-        }
-        return clone;
-    }
-
-    @Override
-    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
-        return this.traversalRing.getTraversals();
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
-        this.traversalRing.addTraversal(this.integrateChild(selectTraversal));
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
-        if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
-        return requirements;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 920c18c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumGlobalStep.java
+++ /dev/null
@@ -1,137 +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.map;
-
-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.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 java.io.Serializable;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> implements MapReducer {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.BULK,
-            TraverserRequirement.OBJECT
-    );
-
-    public SumGlobalStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier(new ConstantSupplier<>(0.0d));
-        this.setBiFunction(SumGlobalBiFunction.instance());
-    }
-
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
-        return SumGlobalMapReduce.instance();
-    }
-
-    /////
-
-    private static class SumGlobalBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {
-
-        private static final SumGlobalBiFunction INSTANCE = new SumGlobalBiFunction();
-
-        private SumGlobalBiFunction() {
-
-        }
-
-        @Override
-        public Double apply(final Double mutatingSeed, final Traverser<S> traverser) {
-            return mutatingSeed + (traverser.get().doubleValue() * traverser.bulk());
-        }
-
-        public final static <S extends Number> SumGlobalBiFunction<S> instance() {
-            return INSTANCE;
-        }
-    }
-
-    ///////////
-
-    private static class SumGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
-
-        private static final SumGlobalMapReduce INSTANCE = new SumGlobalMapReduce();
-
-        private SumGlobalMapReduce() {
-
-        }
-
-        @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().doubleValue() * traverser.bulk())));
-        }
-
-        @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) {
-            if (values.hasNext()) {
-                Number sum = values.next();
-                while (values.hasNext()) {
-                    sum = sum.doubleValue() + values.next().doubleValue();
-                }
-                emitter.emit(sum);
-            }
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return REDUCING;
-        }
-
-        @Override
-        public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
-            return keyValues.hasNext() ? keyValues.next().getValue() : 0.0d;
-        }
-
-        public static final SumGlobalMapReduce instance() {
-            return INSTANCE;
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java
deleted file mode 100644
index d88a209..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/SumLocalStep.java
+++ /dev/null
@@ -1,58 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class SumLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
-
-    public SumLocalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<S> traverser) {
-        Number result;
-        final Iterator<E> iterator = traverser.get().iterator();
-        if (iterator.hasNext()) {
-            result = iterator.next();
-            while (iterator.hasNext()) {
-                result = result.doubleValue() + iterator.next().doubleValue();
-            }
-        } else {
-            result = 0.0d;
-        }
-        return (E) result;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}


[04/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java
new file mode 100644
index 0000000..cf90191
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesTest.java
@@ -0,0 +1,65 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class PropertiesTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value();
+
+    public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXageX_propertiesXname_ageX_value() {
+        Arrays.asList(get_g_V_hasXageX_propertiesXage_nameX_value(), get_g_V_hasXageX_propertiesXname_ageX_value()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            checkResults(Arrays.asList("marko", 29, "vadas", 27, "josh", 32, "peter", 35), traversal);
+        });
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends PropertiesTest {
+        @Override
+        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
+            return g.V().has("age").properties("name", "age").value();
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
+            return g.V().has("age").properties("age", "name").value();
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
new file mode 100644
index 0000000..cc6de20
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
@@ -0,0 +1,310 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.*;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.values;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class SelectTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id);
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id);
+
+    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_aggregateXxX_asXbX_select_byXnameX();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_asXaX_outXknowsX_asXbX_select() {
+        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Map<String, Vertex> bindings = traversal.next();
+            assertEquals(2, bindings.size());
+            assertEquals(convertToVertexId("marko"), (bindings.get("a")).id());
+            assertTrue((bindings.get("b")).id().equals(convertToVertexId("vadas")) || bindings.get("b").id().equals(convertToVertexId("josh")));
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Map<String, String> bindings = traversal.next();
+            assertEquals(2, bindings.size());
+            assertEquals("marko", bindings.get("a"));
+            assertTrue(bindings.get("b").equals("josh") || bindings.get("b").equals("vadas"));
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            assertEquals(convertToVertexId("marko"), vertex.id());
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertEquals("marko", traversal.next());
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_asXaX_out_asXbX_select_byXnameX() {
+        Arrays.asList(
+                get_g_V_asXaX_out_asXbX_select_byXnameX(),
+                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",
+                    "a", "marko", "b", "vadas",
+                    "a", "marko", "b", "josh",
+                    "a", "josh", "b", "ripple",
+                    "a", "josh", "b", "lop",
+                    "a", "peter", "b", "lop");
+            checkResults(expected, traversal);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
+        Arrays.asList(
+                get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final List<Map<String, String>> expected = makeMapList(2,
+                    "a", "marko", "b", "marko",
+                    "a", "vadas", "b", "vadas",
+                    "a", "josh", "b", "josh",
+                    "a", "ripple", "b", "ripple",
+                    "a", "lop", "b", "lop",
+                    "a", "peter", "b", "peter");
+            checkResults(expected, traversal);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(CREW)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX();
+        printTraversalForm(traversal);
+        final List<Map<String, Object>> expected = makeMapList(2,
+                "a", 3, "b", "matthias",
+                "a", 4, "b", "marko",
+                "a", 5, "b", "stephen",
+                "a", 5, "b", "daniel");
+        checkResults(expected, traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXname_isXmarkoXX_asXaX_select() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXname_isXmarkoXX_asXaX_select();
+        printTraversalForm(traversal);
+        final List<Map<String, Object>> expected = makeMapList(1, "a", g.V(convertToVertexId("marko")).next());
+        checkResults(expected, traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_label_groupCount_asXxX_select() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_label_groupCount_asXxX_select();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Object> map1 = traversal.next();
+        assertEquals(1, map1.size());
+        assertTrue(map1.containsKey("x"));
+        final Map<String, Long> map2 = (Map<String, Long>) map1.get("x");
+        assertEquals(2, map2.size());
+        assertTrue(map2.containsKey("person"));
+        assertTrue(map2.containsKey("software"));
+        assertEquals(2, map2.get("software").longValue());
+        assertEquals(4, map2.get("person").longValue());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @Ignore
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by();
+        printTraversalForm(traversal);
+        final Set<String> persons = new HashSet<>();
+        for (int i = 0; i < 4; i++) {
+            assertTrue(traversal.hasNext());
+            final Map<String, Object> map = traversal.next();
+            assertEquals(2, map.size());
+            assertTrue(map.containsKey("person"));
+            assertTrue(map.containsKey("relations"));
+            assertTrue(persons.add((String) map.get("person")));
+            final Map<String, Long> relations = (Map<String, Long>) map.get("relations");
+            switch ((String) map.get("person")) {
+                case "marko":
+                    assertEquals(2, relations.size());
+                    assertEquals(1, relations.get("created").longValue());
+                    assertEquals(2, relations.get("knows").longValue());
+                    break;
+                case "vadas":
+                    assertEquals(1, relations.size());
+                    assertEquals(1, relations.get("knows").longValue());
+                    break;
+                case "josh":
+                    assertEquals(2, relations.size());
+                    assertEquals(2, relations.get("created").longValue());
+                    assertEquals(1, relations.get("knows").longValue());
+                    break;
+                case "peter":
+                    assertEquals(1, relations.size());
+                    assertEquals(1, relations.get("created").longValue());
+                    break;
+                default:
+                    assertTrue(false);
+                    break;
+            }
+        }
+        assertFalse(traversal.hasNext());
+        assertEquals(4, persons.size());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends SelectTest {
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
+            return g.V(v1Id).as("a").out("knows").as("b").select();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(final Object v1Id) {
+            return g.V(v1Id).as("a").out("knows").as("b").<String>select().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
+            return g.V(v1Id).as("a").out("knows").as("b").select("a");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(final Object v1Id) {
+            return g.V(v1Id).as("a").out("knows").as("b").<String>select("a").by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
+            return g.V().as("a").out().as("b").<String>select().by("name");
+        }
+
+        @Override
+        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
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
+            return g.V().as("a").values("name").order().as("b").<String>select().by("name").by();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+            return g.V().has("name", "gremlin").inE("uses").order().by("skill", Order.incr).as("a").outV().as("b").select().by("skill").by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
+            return g.V().has(values("name").is("marko")).as("a").select();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
+            return g.V().label().groupCount().as("x").select();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+            return g.V().hasLabel("person").as("person").local(__.bothE().label().groupCount()).as("relations").select().by("name").by();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
new file mode 100644
index 0000000..e3f1912
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.sum;
+import static org.junit.Assert.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class SumTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Double> get_g_V_valuesXageX_sum();
+
+    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_valuesXageX_sum() {
+        final Traversal<Vertex, Double> traversal = get_g_V_valuesXageX_sum();
+        printTraversalForm(traversal);
+        final Number sum = traversal.next();
+        assertEquals(123.0, sum);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXsumXlocalXX() {
+        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Number> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertEquals(1.0, map.get("ripple"));
+        assertEquals(1.0, map.get("lop"));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends SumTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
+            return g.V().values("age").sum();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXsumXlocalXX() {
+            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

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
new file mode 100644
index 0000000..e15089d
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldTest.java
@@ -0,0 +1,109 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class UnfoldTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold();
+
+    public abstract Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_localXoutE_foldX_unfold() {
+        final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_foldX_unfold();
+        printTraversalForm(traversal);
+        int counter = 0;
+        final Set<Edge> edges = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            edges.add(traversal.next());
+        }
+        assertEquals(6, counter);
+        assertEquals(6, edges.size());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_valueMap_unfold_mapXkeyX() {
+        final Traversal<Vertex, String> traversal = get_g_V_valueMap_unfold_mapXkeyX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        int ageCounter = 0;
+        int nameCounter = 0;
+        int langCounter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String key = traversal.next();
+            if (key.equals("name"))
+                nameCounter++;
+            else if (key.equals("age"))
+                ageCounter++;
+            else if (key.equals("lang"))
+                langCounter++;
+            else
+                fail("The provided key is not known: " + key);
+        }
+        assertEquals(12, counter);
+        assertEquals(4, ageCounter);
+        assertEquals(2, langCounter);
+        assertEquals(6, nameCounter);
+        assertEquals(counter, ageCounter + langCounter + nameCounter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends UnfoldTest {
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
+            return g.V().local(outE().fold()).unfold();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
+            return g.V().valueMap().<Map.Entry<String, List>>unfold().map(m -> m.get().getKey());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java
new file mode 100644
index 0000000..774aa50
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ValueMapTest.java
@@ -0,0 +1,144 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class ValueMapTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMap();
+
+    public abstract Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX();
+
+    public abstract Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_valueMap() {
+        final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMap();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Map<String, List> values = traversal.next();
+            final String name = (String) values.get("name").get(0);
+            assertEquals(2, values.size());
+            if (name.equals("marko")) {
+                assertEquals(29, values.get("age").get(0));
+            } else if (name.equals("josh")) {
+                assertEquals(32, values.get("age").get(0));
+            } else if (name.equals("peter")) {
+                assertEquals(35, values.get("age").get(0));
+            } else if (name.equals("vadas")) {
+                assertEquals(27, values.get("age").get(0));
+            } else if (name.equals("lop")) {
+                assertEquals("java", values.get("lang").get(0));
+            } else if (name.equals("ripple")) {
+                assertEquals("java", values.get("lang").get(0));
+            } else {
+                throw new IllegalStateException("It is not possible to reach here: " + values);
+            }
+        }
+        assertEquals(6, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_valueMapXname_ageX() {
+        final Traversal<Vertex, Map<String, List>> traversal = get_g_V_valueMapXname_ageX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Map<String, List> values = traversal.next();
+            final String name = (String) values.get("name").get(0);
+            if (name.equals("marko")) {
+                assertEquals(29, values.get("age").get(0));
+                assertEquals(2, values.size());
+            } else if (name.equals("josh")) {
+                assertEquals(32, values.get("age").get(0));
+                assertEquals(2, values.size());
+            } else if (name.equals("peter")) {
+                assertEquals(35, values.get("age").get(0));
+                assertEquals(2, values.size());
+            } else if (name.equals("vadas")) {
+                assertEquals(27, values.get("age").get(0));
+                assertEquals(2, values.size());
+            } else if (name.equals("lop")) {
+                assertNull(values.get("lang"));
+                assertEquals(1, values.size());
+            } else if (name.equals("ripple")) {
+                assertNull(values.get("lang"));
+                assertEquals(1, values.size());
+            } else {
+                throw new IllegalStateException("It is not possible to reach here: " + values);
+            }
+        }
+        assertEquals(6, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outXcreatedX_valueMap() {
+        final Traversal<Vertex, Map<String, List<String>>> traversal = get_g_VX1X_outXcreatedX_valueMap(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, List<String>> values = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals("lop", values.get("name").get(0));
+        assertEquals("java", values.get("lang").get(0));
+        assertEquals(2, values.size());
+
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends ValueMapTest {
+        @Override
+        public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
+            return g.V().valueMap();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
+            return g.V().valueMap("name", "age");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
+            return g.V(v1Id).out("created").valueMap();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java
new file mode 100644
index 0000000..a542a37
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexTest.java
@@ -0,0 +1,617 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://traversalhen.genoprime.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class VertexTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_V();
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id);
+
+    public abstract Traversal<Edge, Edge> get_g_E();
+
+    public abstract Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV();
+
+    public abstract Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name();
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_out_out();
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id);
+
+    // VERTEX ADJACENCY
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V();
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            vertices.add(traversal.next());
+        }
+        assertEquals(6, vertices.size());
+        assertEquals(6, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out(convertToVertexId("marko"));
+        assert_g_v1_out(traversal);
+    }
+
+    private void assert_g_v1_out(final Traversal<Vertex, Vertex> traversal) {
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("vadas") ||
+                    vertex.value("name").equals("josh") ||
+                    vertex.value("name").equals("lop"));
+        }
+        assertEquals(3, counter);
+        assertEquals(3, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX2X_in() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX2X_in(convertToVertexId("vadas"));
+        assert_g_v2_in(traversal);
+    }
+
+    private void assert_g_v2_in(final Traversal<Vertex, Vertex> traversal) {
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertEquals(traversal.next().value("name"), "marko");
+        }
+        assertEquals(1, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_both() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_both(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("marko") ||
+                    vertex.value("name").equals("ripple") ||
+                    vertex.value("name").equals("lop"));
+        }
+        assertEquals(3, counter);
+        assertEquals(3, vertices.size());
+    }
+
+    // EDGE ADJACENCY
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_E() {
+        final Traversal<Edge, Edge> traversal = get_g_E();
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Edge> edges = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            edges.add(traversal.next());
+        }
+        assertEquals(6, edges.size());
+        assertEquals(6, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outE() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Edge> edges = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Edge edge = traversal.next();
+            edges.add(edge);
+            assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
+        }
+        assertEquals(3, counter);
+        assertEquals(3, edges.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX2X_inE() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX2X_inE(convertToVertexId("vadas"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertEquals(traversal.next().label(), "knows");
+        }
+        assertEquals(1, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_bothEXcreatedX() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothEXcreatedX(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Edge> edges = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Edge edge = traversal.next();
+            edges.add(edge);
+            assertTrue(edge.label().equals("created"));
+            assertEquals(edge.outVertex().id(), convertToVertexId("josh"));
+        }
+        assertEquals(2, counter);
+        assertEquals(2, edges.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_bothE() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX4X_bothE(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Edge> edges = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Edge edge = traversal.next();
+            edges.add(edge);
+            assertTrue(edge.label().equals("knows") || edge.label().equals("created"));
+        }
+        assertEquals(3, counter);
+        assertEquals(3, edges.size());
+    }
+
+    // EDGE/VERTEX ADJACENCY
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outE_inV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_inV(convertToVertexId("marko"));
+        this.assert_g_v1_out(traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX2X_inE_outV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX2X_inE_outV(convertToVertexId("vadas"));
+        this.assert_g_v2_in(traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_outE_hasXweight_1X_outV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_outE_hasXweight_1X_outV();
+        printTraversalForm(traversal);
+        int counter = 0;
+        Map<Object, Integer> counts = new HashMap<>();
+        while (traversal.hasNext()) {
+            final Object id = traversal.next().id();
+            int previousCount = counts.getOrDefault(id, 0);
+            counts.put(id, previousCount + 1);
+            counter++;
+        }
+        assertEquals(2, counts.size());
+        assertEquals(1, counts.get(convertToVertexId("marko")).intValue());
+        assertEquals(1, counts.get(convertToVertexId("josh")).intValue());
+
+        assertEquals(2, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_outE_inV_inE_inV_both_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_out_outE_inV_inE_inV_both_name();
+        printTraversalForm(traversal);
+        int counter = 0;
+        Map<String, Integer> counts = new HashMap<>();
+        while (traversal.hasNext()) {
+            final String key = traversal.next();
+            int previousCount = counts.getOrDefault(key, 0);
+            counts.put(key, previousCount + 1);
+            counter++;
+        }
+        assertEquals(3, counts.size());
+        assertEquals(4, counts.get("josh").intValue());
+        assertEquals(3, counts.get("marko").intValue());
+        assertEquals(3, counts.get("peter").intValue());
+
+        assertEquals(10, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outEXknowsX_bothV_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_outEXknowsX_bothV_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(4, names.size());
+        assertTrue(names.contains("marko"));
+        assertTrue(names.contains("josh"));
+        assertTrue(names.contains("vadas"));
+        names.remove("marko");
+        assertEquals(3, names.size());
+        names.remove("marko");
+        assertEquals(2, names.size());
+        names.remove("josh");
+        assertEquals(1, names.size());
+        names.remove("vadas");
+        assertEquals(0, names.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outE_otherV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_otherV(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("vadas") ||
+                    vertex.value("name").equals("josh") ||
+                    vertex.value("name").equals("lop"));
+        }
+        assertEquals(3, counter);
+        assertEquals(3, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_bothE_otherV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_otherV(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(3, vertices.size());
+        assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("marko")));
+        assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("ripple")));
+        assertTrue(vertices.stream().anyMatch(v -> v.value("name").equals("lop")));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_bothE_hasXweight_lt_1X_otherV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_bothE_hasXweight_lt_1X_otherV(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(1, vertices.size());
+        assertEquals(vertices.get(0).value("name"), "lop");
+        assertFalse(traversal.hasNext());
+    }
+
+    // VERTEX EDGE LABEL ADJACENCY
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outXknowsX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX(convertToVertexId("marko"));
+        assert_g_v1_outXknowsX(traversal);
+    }
+
+    private void assert_g_v1_outXknowsX(Traversal<Vertex, Vertex> traversal) {
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("vadas") ||
+                    vertex.value("name").equals("josh"));
+        }
+        assertEquals(2, counter);
+        assertEquals(2, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outXknows_createdX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknows_createdX(convertToVertexId("marko"));
+        this.assert_g_v1_out(traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outEXknowsX_inV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknowsX_inV(convertToVertexId("marko"));
+        this.assert_g_v1_outXknowsX(traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outEXknows_createdX_inV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outEXknows_createdX_inV(convertToVertexId("marko"));
+        this.assert_g_v1_out(traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out();
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("lop") ||
+                    vertex.value("name").equals("ripple"));
+        }
+        assertEquals(2, counter);
+        assertEquals(2, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_out_out() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_out_out(convertToVertexId("marko"));
+        assertFalse(traversal.hasNext());
+    }
+
+    // PROPERTY TESTING
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_out_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<String> names = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            String name = traversal.next();
+            names.add(name);
+            assertTrue(name.equals("vadas") ||
+                    name.equals("josh") ||
+                    name.equals("lop"));
+        }
+        assertEquals(3, counter);
+        assertEquals(3, names.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_to_XOUT_knowsX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_to_XOUT_knowsX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            String name = vertex.value("name");
+            assertTrue(name.equals("vadas") ||
+                    name.equals("josh"));
+        }
+        assertEquals(2, counter);
+        assertFalse(traversal.hasNext());
+
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends VertexTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V() {
+            return g.V();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
+            return g.V(v1Id).out();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
+            return g.V(v2Id).in();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
+            return g.V(v4Id).both();
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E() {
+            return g.E();
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
+            return g.V(v1Id).outE();
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
+            return g.V(v2Id).inE();
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
+            return g.V(v4Id).bothE();
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
+            return g.V(v4Id).bothE("created");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
+            return g.V(v1Id).outE().inV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
+            return g.V(v2Id).inE().outV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
+            return g.V().outE().has("weight", 1.0d).outV();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
+            return g.V().out().outE().inV().inE().inV().both().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
+            return g.V(v1Id).outE("knows").bothV().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
+            return g.V(v1Id).out("knows");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
+            return g.V(v1Id).out("knows", "created");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
+            return g.V(v1Id).outE("knows").inV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
+            return g.V(v1Id).outE("knows", "created").inV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
+            return g.V(v1Id).outE().otherV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
+            return g.V(v4Id).bothE().otherV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(Object v4Id) {
+            return g.V(v4Id).bothE().has("weight", Compare.lt, 1d).otherV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_out_out() {
+            return g.V().out().out();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
+            return g.V(v1Id).out().out().out();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
+            return g.V(v1Id).out().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
+            return g.V(v1Id).to(Direction.OUT, "knows");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java
new file mode 100644
index 0000000..19e632f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateTest.java
@@ -0,0 +1,149 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.hamcrest.CoreMatchers.not;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class AggregateTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX();
+
+    public abstract Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX();
+
+    public abstract Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path();
+
+    //public abstract Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_valueXnameX_aggregateXxX_capXxX() {
+        Traversal<Vertex, List<String>> traversal = get_g_V_name_aggregateXxX_capXxX();
+        printTraversalForm(traversal);
+        final Collection<String> names = traversal.next();
+        assertFalse(traversal.hasNext());
+        checkListOfNames(names);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_aggregateXxX_byXnameX_capXxX() {
+        Traversal<Vertex, List<String>> traversal = get_g_V_aggregateXxX_byXnameX_capXxX();
+        printTraversalForm(traversal);
+        final Collection<String> names = traversal.next();
+        assertFalse(traversal.hasNext());
+        checkListOfNames(names);
+    }
+
+    private void checkListOfNames(Collection<String> names) {
+        assertEquals(6, names.size());
+        assertTrue(names.contains("marko"));
+        assertTrue(names.contains("josh"));
+        assertTrue(names.contains("peter"));
+        assertTrue(names.contains("lop"));
+        assertTrue(names.contains("vadas"));
+        assertTrue(names.contains("ripple"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_aggregateXaX_path() {
+        final Traversal<Vertex, Path> traversal = get_g_V_out_aggregateXaX_path();
+        printTraversalForm(traversal);
+        int count = 0;
+        final Map<String, Long> firstStepCounts = new HashMap<>();
+        final Map<String, Long> secondStepCounts = new HashMap<>();
+        while (traversal.hasNext()) {
+            count++;
+            Path path = traversal.next();
+            String first = path.get(0).toString();
+            String second = path.get(1).toString();
+            assertThat(first, not(second));
+            MapHelper.incr(firstStepCounts, first, 1l);
+            MapHelper.incr(secondStepCounts, second, 1l);
+        }
+        assertEquals(6, count);
+        assertEquals(3, firstStepCounts.size());
+        assertEquals(4, secondStepCounts.size());
+        assertTrue(firstStepCounts.values().contains(3l));
+        assertTrue(firstStepCounts.values().contains(2l));
+        assertTrue(firstStepCounts.values().contains(1l));
+        assertTrue(secondStepCounts.values().contains(3l));
+        assertTrue(secondStepCounts.values().contains(1l));
+    }
+
+    /*@Test
+    @LoadGraphWith(CLASSIC)
+    public void g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path() {
+        Iterator<Path> traversal = get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(convertToVertexId("marko"));
+        System.out.println("Testing: " + traversal);
+        final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
+        // for OLTP it's a roulette game; the result can change depending on which path is taken first by the traverser (this makes some cool real world use cases possible)
+        // Senzari use case: generate a random playlist without artist repetitions
+        assertEquals(4, paths.size());
+        assertEquals(3, paths.stream().filter(path -> path.size() == 3).count());
+        assertEquals(1, paths.stream().filter(path -> path.size() == 5).count());
+        assertFalse(traversal.hasNext());
+    }*/
+
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends AggregateTest {
+
+        @Override
+        public Traversal<Vertex, List<String>> get_g_V_name_aggregateXxX_capXxX() {
+            return g.V().values("name").aggregate("x").cap("x");
+        }
+
+        @Override
+        public Traversal<Vertex, List<String>> get_g_V_aggregateXxX_byXnameX_capXxX() {
+            return g.V().aggregate("x").by("name").cap("x");
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
+            return g.V().out().aggregate("a").path();
+        }
+
+        /*public Traversal<Vertex, Path> get_g_v1_asXxX_bothE_asXeX_valueXweightX_exceptXwX_aggregateXwX_backXeX_otherV_jumpXx_true_trueX_path(final Object v1Id) {
+            return g.V(1).as("x").bothE().as("e").value("weight").except("w").aggregate("w").back("e").otherV().jump("x", t -> true, t -> true).path();
+        }*/
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java
new file mode 100644
index 0000000..eda73f7
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountTest.java
@@ -0,0 +1,177 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class GroupCountTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX();
+
+    public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount();
+
+    public abstract Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX();
+
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_outXcreatedX_groupCount_byXnameX() {
+        Arrays.asList(get_g_V_outXcreatedX_groupCount_byXnameX(), get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<String, Long> map = traversal.next();
+            assertEquals(map.size(), 2);
+            assertEquals(Long.valueOf(3l), map.get("lop"));
+            assertEquals(Long.valueOf(1l), map.get("ripple"));
+            assertFalse(traversal.hasNext());
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_outXcreatedX_name_groupCount() {
+        Arrays.asList(get_g_V_outXcreatedX_name_groupCount(), get_g_V_outXcreatedX_name_groupCountXaX_capXaX()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<String, Long> map = traversal.next();
+            assertEquals(map.size(), 2);
+            assertEquals(3l, map.get("lop").longValue());
+            assertEquals(1l, map.get("ripple").longValue());
+            assertFalse(traversal.hasNext());
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_filterXfalseX_groupCount() {
+        Arrays.asList(get_g_V_hasXnoX_groupCount(), get_g_V_hasXnoX_groupCountXaX_capXaX()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<Object, Long> map = traversal.next();
+            assertEquals(0, map.size());
+            assertFalse(traversal.hasNext());
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+        List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
+        traversals.add(get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<String, Long> map = traversal.next();
+            assertFalse(traversal.hasNext());
+            assertEquals(4, map.size());
+            assertEquals(4l, map.get("lop").longValue());
+            assertEquals(2l, map.get("ripple").longValue());
+            assertEquals(1l, map.get("josh").longValue());
+            assertEquals(1l, map.get("vadas").longValue());
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+        List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
+        traversals.add(get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<String, Long> map = traversal.next();
+            assertFalse(traversal.hasNext());
+            assertEquals(2, map.size());
+            assertEquals(2, map.get("marko").longValue());
+            assertEquals(2, map.get("java").longValue());
+        });
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends GroupCountTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
+            return g.V().out("created").<String>groupCount().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
+            return g.V().out("created").<String>groupCount("a").by("name").cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
+            return g.V().out("created").values("name").groupCount();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
+            return g.V().out("created").values("name").groupCount("a").cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
+            return g.V().has("no").groupCount();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
+            return g.V().has("no").groupCount("a").cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+            return g.V().repeat(out().groupCount("a").by("name")).times(2).cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+            return g.V().union(
+                    repeat(out()).times(2).groupCount("m").by("lang"),
+                    repeat(in()).times(2).groupCount("m").by("name")).cap("m");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
new file mode 100644
index 0000000..3b59720
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupTest.java
@@ -0,0 +1,174 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.*;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.*;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class GroupTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX();
+
+    public abstract Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX();
+
+    public abstract Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX();
+
+    public abstract Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_group_byXnameX() {
+        Arrays.asList(get_g_V_group_byXnameX(), get_g_V_groupXaX_byXnameX_capXaX()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<String, Collection<Vertex>> map = traversal.next();
+            assertEquals(6, map.size());
+            map.forEach((key, values) -> {
+                assertEquals(1, values.size());
+                assertEquals(convertToVertexId(key), values.iterator().next().id());
+            });
+            assertFalse(traversal.hasNext());
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+        final Traversal<Vertex, Map<String, Collection<String>>> traversal = get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX();
+        printTraversalForm(traversal);
+        final Map<String, Collection<String>> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(1, map.size());
+        assertTrue(map.containsKey("java"));
+        assertEquals(2, map.get("java").size());
+        assertTrue(map.get("java").contains("ripple"));
+        assertTrue(map.get("java").contains("lop"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXlangX_group_byXlangX_byX1X_byXsizeX() {
+        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX();
+        printTraversalForm(traversal);
+        final Map<String, Long> map = traversal.next();
+        assertEquals(1, map.size());
+        assertTrue(map.containsKey("java"));
+        assertEquals(Long.valueOf(2), map.get("java"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXout_groupXaX_byXnameX_byXitX_byXsizeXX_timesX2X_capXaX() {
+        List<Traversal<Vertex, Map<String, Long>>> traversals = new ArrayList<>();
+        traversals.add(get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<String, Long> map = traversal.next();
+            assertFalse(traversal.hasNext());
+            assertEquals(4, map.size());
+            assertTrue(map.containsKey("vadas"));
+            assertEquals(Long.valueOf(1), map.get("vadas"));
+            assertTrue(map.containsKey("josh"));
+            assertEquals(Long.valueOf(1), map.get("josh"));
+            assertTrue(map.containsKey("lop"));
+            assertEquals(Long.valueOf(4), map.get("lop"));
+            assertTrue(map.containsKey("ripple"));
+            assertEquals(Long.valueOf(2), map.get("ripple"));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_group_byXoutE_countX_byXnameX() {
+        final Traversal<Vertex, Map<Long, Collection<String>>> traversal = get_g_V_group_byXoutE_countX_byXnameX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<Long, Collection<String>> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(4, map.size());
+        assertTrue(map.containsKey(0l));
+        assertTrue(map.containsKey(1l));
+        assertTrue(map.containsKey(2l));
+        assertTrue(map.containsKey(3l));
+        assertEquals(3, map.get(0l).size());
+        assertEquals(1, map.get(1l).size());
+        assertEquals(1, map.get(2l).size());
+        assertEquals(1, map.get(3l).size());
+        assertTrue(map.get(0l).contains("lop"));
+        assertTrue(map.get(0l).contains("ripple"));
+        assertTrue(map.get(0l).contains("vadas"));
+        assertTrue(map.get(1l).contains("peter"));
+        assertTrue(map.get(2l).contains("josh"));
+        assertTrue(map.get(3l).contains("marko"));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends GroupTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
+            return g.V().<String, Collection<Vertex>>group().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
+            return g.V().<String, Collection<Vertex>>group("a").by("name").cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+            return g.V().has("lang").group("a").by("lang").by("name").out().cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
+            return g.V().has("lang").<String, Long>group().by("lang").by(inject(1)).<Collection>by(count(Scope.local));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
+            return g.V().repeat(out().group("a").by("name").by().<Collection>by(count(Scope.local))).times(2).cap("a");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
+            return g.V().<Long, Collection<String>>group().by(outE().count()).by("name");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java
new file mode 100644
index 0000000..6c67d72
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java
@@ -0,0 +1,100 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class InjectTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id);
+
+    public abstract Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_out_injectXv2X_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_out_injectXv2X_name(convertToVertexId("marko"), convertToVertexId("vadas"));
+        printTraversalForm(traversal);
+        Map<String, Long> counter = new HashMap<>();
+        while (traversal.hasNext()) {
+            MapHelper.incr(counter, traversal.next(), 1l);
+        }
+        assertEquals(3, counter.size());
+        assertEquals(1l, counter.get("josh").longValue());
+        assertEquals(1l, counter.get("lop").longValue());
+        assertEquals(2l, counter.get("vadas").longValue());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
+        final Traversal<Vertex, Path> traversal = get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Path path = traversal.next();
+            if (path.get("a").equals("daniel")) {
+                assertEquals(2, path.size());
+                assertEquals(6, (int) path.get(1));
+            } else {
+                assertEquals(4, path.size());
+                assertEquals(path.<String>get("a").length(), (int) path.get(3));
+            }
+        }
+        assertEquals(4, counter);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends InjectTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
+            return g.V(v1Id).out().inject(g.V(v2Id).next()).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
+            return g.V(v1Id).out().<String>values("name").inject("daniel").as("a").map(t -> t.get().length()).path();
+        }
+    }
+}


[36/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java
deleted file mode 100644
index de505ec..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/TimeLimitStep.java
+++ /dev/null
@@ -1,80 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Randall Barnhart (random pi)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public final class TimeLimitStep<S> extends FilterStep<S> {
-
-    private AtomicLong startTime = new AtomicLong(-1);
-    private final long timeLimit;
-    private AtomicBoolean timedOut = new AtomicBoolean(false);
-
-
-    public TimeLimitStep(final Traversal.Admin traversal, final long timeLimit) {
-        super(traversal);
-        this.timeLimit = timeLimit;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        if (this.startTime.get() == -1l)
-            this.startTime.set(System.currentTimeMillis());
-        if ((System.currentTimeMillis() - this.startTime.get()) >= this.timeLimit) {
-            this.timedOut.set(true);
-            throw FastNoSuchElementException.instance();
-        }
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.timeLimit);
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.startTime.set(-1l);
-        this.timedOut.set(false);
-    }
-
-    public boolean getTimedOut() {
-        return this.timedOut.get();
-    }
-
-    @Override
-    public TimeLimitStep<S> clone() {
-        final TimeLimitStep<S> clone = (TimeLimitStep<S>) super.clone();
-        clone.timedOut = new AtomicBoolean(this.timedOut.get());
-        clone.startTime = new AtomicLong(this.startTime.get());
-        return clone;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java
deleted file mode 100644
index 1477d11..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereStep.java
+++ /dev/null
@@ -1,132 +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.filter;
-
-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.graph.traversal.step.util.MarkerIdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiPredicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class WhereStep<E> extends FilterStep<Map<String, E>> implements TraversalParent {
-
-    private final String firstKey;
-    private final String secondKey;
-    private final BiPredicate biPredicate;
-    private Traversal.Admin constraint;
-
-
-    public WhereStep(final Traversal.Admin traversal, final String firstKey, final String secondKey, final BiPredicate<E, E> biPredicate) {
-        super(traversal);
-        this.firstKey = firstKey;
-        this.secondKey = secondKey;
-        this.biPredicate = biPredicate;
-        this.constraint = null;
-    }
-
-    public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
-        super(traversal);
-        this.firstKey = null;
-        this.secondKey = null;
-        this.biPredicate = null;
-        this.constraint = this.integrateChild(constraint);
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
-        if (null == this.constraint) {
-            final Map<String, E> map = traverser.get();
-            if (!map.containsKey(this.firstKey))
-                throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
-            if (!map.containsKey(this.secondKey))
-                throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
-            return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
-        } else {
-            final Step<?, ?> startStep = this.constraint.getStartStep();
-            Step<?, ?> endStep = this.constraint.getEndStep();
-            if (endStep instanceof MarkerIdentityStep) // DAH!
-                endStep = endStep.getPreviousStep();
-
-            final Map<String, E> map = traverser.get();
-            if (!map.containsKey(startStep.getLabel().get()))
-                throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabel().get());
-            final Object startObject = map.get(startStep.getLabel().get());
-            final Object endObject;
-            if (endStep.getLabel().isPresent()) {
-                if (!map.containsKey(endStep.getLabel().get()))
-                    throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabel().get());
-                endObject = map.get(endStep.getLabel().get());
-            } else
-                endObject = null;
-
-            startStep.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, (Step) startStep, traverser.bulk()));
-            if (null == endObject) {
-                if (this.constraint.hasNext()) {
-                    this.constraint.reset();
-                    return true;
-                } else {
-                    return false;
-                }
-
-            } else {
-                while (this.constraint.hasNext()) {
-                    if (this.constraint.next().equals(endObject)) {
-                        this.constraint.reset();
-                        return true;
-                    }
-                }
-                return false;
-            }
-        }
-    }
-
-    @Override
-    public List<Traversal.Admin> getLocalChildren() {
-        return null == this.constraint ? Collections.emptyList() : Collections.singletonList(this.constraint);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.constraint);
-    }
-
-    @Override
-    public WhereStep<E> clone() {
-        final WhereStep<E> clone = (WhereStep<E>) super.clone();
-        if (null != this.constraint)
-            clone.constraint = clone.integrateChild(this.constraint.clone());
-        return clone;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java
deleted file mode 100644
index 6f493d1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeByPathStep.java
+++ /dev/null
@@ -1,95 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddEdgeByPathStep extends MapStep<Vertex, Edge> implements Mutating {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.PATH,
-            TraverserRequirement.OBJECT
-    );
-
-    // TODO: Weight key based on Traverser.getCount() ?
-
-    private final Direction direction;
-    private final String edgeLabel;
-    private final String stepLabel;
-    private final Object[] keyValues;
-
-    public AddEdgeByPathStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final String stepLabel, final Object... keyValues) {
-        super(traversal);
-        this.direction = direction;
-        if (this.direction.equals(Direction.BOTH))
-            throw new IllegalArgumentException("Only in- and out- directions are supported by " + AddEdgeByPathStep.class.getSimpleName());
-        this.edgeLabel = edgeLabel;
-        this.stepLabel = stepLabel;
-        this.keyValues = keyValues;
-    }
-
-    public Direction getDirection() {
-        return direction;
-    }
-
-    public String getEdgeLabel() {
-        return edgeLabel;
-    }
-
-    public String getStepLabel() {
-        return stepLabel;
-    }
-
-    public Object[] getKeyValues() {
-        return keyValues;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.direction.name(), this.edgeLabel, this.stepLabel);
-    }
-
-    @Override
-    protected Edge map(Traverser.Admin<Vertex> traverser) {
-        final Vertex currentVertex = traverser.get();
-        final Vertex otherVertex = traverser.path().get(this.stepLabel);
-        if (this.direction.equals(Direction.IN))
-            return otherVertex.addEdge(this.edgeLabel, currentVertex, this.keyValues);
-        else
-            return currentVertex.addEdge(this.edgeLabel, otherVertex, this.keyValues);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java
deleted file mode 100644
index 6c5dc6d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeStep.java
+++ /dev/null
@@ -1,86 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddEdgeStep extends FlatMapStep<Vertex, Edge> implements Mutating {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
-
-    private final String edgeLabel;
-    private final Object[] keyValues;
-    private final List<Vertex> vertices;
-    private final Direction direction;
-
-    public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Vertex vertex, final Object... keyValues) {
-        this(traversal, direction, edgeLabel, IteratorUtils.of(vertex), keyValues);
-    }
-
-    public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Iterator<Vertex> vertices, final Object... keyValues) {
-        super(traversal);
-        this.direction = direction;
-        this.edgeLabel = edgeLabel;
-        this.vertices = IteratorUtils.list(vertices);
-        this.keyValues = keyValues;
-    }
-
-    public Direction getDirection() {
-        return direction;
-    }
-
-    public String getEdgeLabel() {
-        return edgeLabel;
-    }
-
-    public Object[] getKeyValues() {
-        return keyValues;
-    }
-
-    public List<Vertex> getVertices() {
-        return vertices;
-    }
-
-    @Override
-    protected Iterator<Edge> flatMap(final Traverser.Admin<Vertex> traverser) {
-        return IteratorUtils.map(this.vertices.iterator(), this.direction.equals(Direction.OUT) ?
-                vertex -> traverser.get().addEdge(this.edgeLabel, vertex, this.keyValues) :
-                vertex -> vertex.addEdge(this.edgeLabel, traverser.get(), this.keyValues));
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
deleted file mode 100644
index 363a4bc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStartStep.java
+++ /dev/null
@@ -1,53 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> implements Mutating {
-
-    private final Object[] keyValues;
-    private boolean first = true;
-
-    public AddVertexStartStep(final Traversal.Admin traversal, final Object... keyValues) {
-        super(traversal);
-        this.keyValues = keyValues;
-    }
-
-    public Object[] getKeyValues() {
-        return keyValues;
-    }
-
-    @Override
-    protected Traverser<Vertex> processNextStart() {
-        if (this.first) {
-            this.first = false;
-            return this.getTraversal().getTraverserGenerator().generate(this.getTraversal().getGraph().get().addVertex(this.keyValues), this, 1l);
-        } else
-            throw FastNoSuchElementException.instance();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
deleted file mode 100644
index 363a3e6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexStep.java
+++ /dev/null
@@ -1,49 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddVertexStep<S> extends MapStep<S, Vertex> implements Mutating {
-
-    private final Object[] keyValues;
-    private final transient Graph graph;
-
-    public AddVertexStep(final Traversal.Admin traversal, final Object... keyValues) {
-        super(traversal);
-        this.keyValues = keyValues;
-        this.graph = this.getTraversal().getGraph().get();
-    }
-
-    public Object[] getKeyValues() {
-        return keyValues;
-    }
-
-    @Override
-    protected Vertex map(final Traverser.Admin<S> traverser) {
-        return this.graph.addVertex(this.keyValues);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
deleted file mode 100644
index 6a4c4c1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackStep.java
+++ /dev/null
@@ -1,64 +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.map;
-
-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.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class BackStep<S, E> extends MapStep<S, E> implements EngineDependent {
-
-    private final String stepLabel;
-    private boolean requiresPaths = false;
-
-    public BackStep(final Traversal.Admin traversal, final String stepLabel) {
-        super(traversal);
-        this.stepLabel = stepLabel;
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<S> traverser) {
-        return traverser.path(this.stepLabel);
-    }
-
-    @Override
-    public void onEngine(final TraversalEngine traversalEngine) {
-        this.requiresPaths = traversalEngine.isComputer();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        //return this.requiresPaths ? Collections.singleton(TraverserRequirement.PATH) : Collections.singleton(TraverserRequirement.PATH_ACCESS);
-        return Collections.singleton(TraverserRequirement.PATH); // TODO: if the traversal isn't nested, path access works
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.stepLabel);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
deleted file mode 100644
index 26f8488..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceStep.java
+++ /dev/null
@@ -1,86 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class CoalesceStep<S, E> extends FlatMapStep<S, E> implements TraversalParent {
-
-    private List<Traversal.Admin<S, E>> coalesceTraversals;
-
-    @SafeVarargs
-    public CoalesceStep(final Traversal.Admin traversal, final Traversal.Admin<S, E>... coalesceTraversals) {
-        super(traversal);
-        this.coalesceTraversals = Arrays.asList(coalesceTraversals);
-        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
-            this.integrateChild(conjunctionTraversal);
-        }
-    }
-
-    @Override
-    protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
-        for (final Traversal.Admin<S, E> coalesceTraversal : this.coalesceTraversals) {
-            coalesceTraversal.reset();
-            coalesceTraversal.addStart(traverser.asAdmin().split());
-            if (coalesceTraversal.hasNext())
-                return coalesceTraversal;
-        }
-        return EmptyIterator.instance();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements();
-    }
-
-    @Override
-    public List<Traversal.Admin<S, E>> getLocalChildren() {
-        return Collections.unmodifiableList(this.coalesceTraversals);
-    }
-
-    @Override
-    public CoalesceStep<S, E> clone() {
-        final CoalesceStep<S, E> clone = (CoalesceStep<S, E>) super.clone();
-        clone.coalesceTraversals = new ArrayList<>();
-        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
-            clone.coalesceTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
-        }
-        return clone;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.coalesceTraversals);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index e54c96f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountGlobalStep.java
+++ /dev/null
@@ -1,134 +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.map;
-
-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.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 java.io.Serializable;
-import java.util.EnumSet;
-import java.util.Iterator;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements MapReducer {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.BULK);
-
-    public CountGlobalStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier(new ConstantSupplier<>(0L));
-        this.setBiFunction(CountBiFunction.<S>instance());
-    }
-
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> getMapReduce() {
-        return CountGlobalMapReduce.instance();
-    }
-
-    ///////////
-
-    private static class CountBiFunction<S> implements BiFunction<Long, Traverser<S>, Long>, Serializable {
-
-        private static final CountBiFunction INSTANCE = new CountBiFunction();
-
-        private CountBiFunction() {
-
-        }
-
-        @Override
-        public Long apply(final Long mutatingSeed, final Traverser<S> traverser) {
-            return mutatingSeed + traverser.bulk();
-        }
-
-        public final static <S> CountBiFunction<S> instance() {
-            return INSTANCE;
-        }
-    }
-
-    ///////////
-
-    private static class CountGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> {
-
-        private static CountGlobalMapReduce INSTANCE = new CountGlobalMapReduce();
-
-        private CountGlobalMapReduce() {
-
-        }
-
-        @Override
-        public boolean doStage(final MapReduce.Stage stage) {
-            return true;
-        }
-
-        @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())));
-        }
-
-        @Override
-        public void combine(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
-            this.reduce(key, values, emitter);
-        }
-
-        @Override
-        public void reduce(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
-            long count = 0l;
-            while (values.hasNext()) {
-                count = count + values.next();
-            }
-            emitter.emit(count);
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return REDUCING;
-        }
-
-        @Override
-        public Long generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
-            return keyValues.hasNext() ? keyValues.next().getValue() : 0L;
-        }
-
-        public static final CountGlobalMapReduce instance() {
-            return INSTANCE;
-        }
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java
deleted file mode 100644
index 14c2a8c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountLocalStep.java
+++ /dev/null
@@ -1,51 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class CountLocalStep<S> extends MapStep<S, Long> {
-
-    public CountLocalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Long map(final Traverser.Admin<S> traverser) {
-        final S item = traverser.get();
-        return (item instanceof Collection) ? ((Collection) item).size()
-                : (item instanceof Map) ? ((Map) item).size() : 1L;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java
deleted file mode 100644
index bfff34e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/DedupLocalStep.java
+++ /dev/null
@@ -1,51 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.LinkedHashSet;
-import java.util.Set;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class DedupLocalStep<E, S extends Iterable<E>> extends MapStep<S, Set<E>> {
-
-    public DedupLocalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Set<E> map(final Traverser.Admin<S> traverser) {
-        final Set<E> result = new LinkedHashSet<>();
-        for (final E item : traverser.get()) {
-            result.add(item);
-        }
-        return result;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java
deleted file mode 100644
index 7afc504..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeOtherVertexStep.java
+++ /dev/null
@@ -1,58 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EdgeOtherVertexStep extends MapStep<Edge, Vertex> {
-
-    public EdgeOtherVertexStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Vertex map(final Traverser.Admin<Edge> traverser) {
-        final List<Object> objects = traverser.path().objects();
-        for (int i = objects.size() - 2; i >= 0; i--) {
-            if (objects.get(i) instanceof Vertex) {
-                return ElementHelper.areEqual((Vertex) objects.get(i), traverser.get().outVertex()) ?
-                        traverser.get().inVertex() :
-                        traverser.get().outVertex();
-            }
-        }
-        throw new IllegalStateException("The path history of the traverser does not contain a previous vertex: " + traverser.path());
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java
deleted file mode 100644
index 5281999..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/EdgeVertexStep.java
+++ /dev/null
@@ -1,67 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EdgeVertexStep extends FlatMapStep<Edge, Vertex> {
-
-    private Direction direction;
-
-    public EdgeVertexStep(final Traversal.Admin traversal, final Direction direction) {
-        super(traversal);
-        this.direction = direction;
-    }
-
-    @Override
-    protected Iterator<Vertex> flatMap(final Traverser.Admin<Edge> traverser) {
-        return traverser.get().vertices(this.direction);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.direction);
-    }
-
-    public Direction getDirection() {
-        return this.direction;
-    }
-
-    public void reverseDirection() {
-        this.direction = this.direction.opposite();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
deleted file mode 100644
index 60ea9e3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FlatMapStep.java
+++ /dev/null
@@ -1,60 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.Collections;
-import java.util.Iterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
-
-    private Traverser.Admin<S> head = null;
-    private Iterator<E> iterator = EmptyIterator.instance();
-
-    public FlatMapStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<E> processNextStart() {
-        while (true) {
-            if (this.iterator.hasNext()) {
-                return this.head.split(this.iterator.next(), this);
-            } else {
-                this.head = this.starts.next();
-                this.iterator = this.flatMap(this.head);
-            }
-        }
-    }
-
-    protected abstract Iterator<E> flatMap(final Traverser.Admin<S> traverser);
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.iterator = EmptyIterator.instance();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 885c2fe..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldStep.java
+++ /dev/null
@@ -1,93 +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.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.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
-
-    public FoldStep(final Traversal.Admin traversal) {
-        this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) ArrayListBiFunction.instance());
-    }
-
-    public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
-        super(traversal);
-        this.setSeedSupplier(seed);
-        this.setBiFunction(new FoldBiFunction<>(foldFunction));
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-
-    /////////
-
-    private static class ArrayListBiFunction<S> implements BiFunction<ArrayList<S>, S, ArrayList<S>>, Serializable {
-
-        private static final ArrayListBiFunction INSTANCE = new ArrayListBiFunction();
-
-        private ArrayListBiFunction() {
-
-        }
-
-        @Override
-        public ArrayList<S> apply(final ArrayList<S> mutatingSeed, final S traverser) {
-            mutatingSeed.add(traverser);
-            return mutatingSeed;
-        }
-
-        public final static <S> ArrayListBiFunction<S> instance() {
-            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/4c97e964/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
deleted file mode 100644
index 852869b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupCountStep.java
+++ /dev/null
@@ -1,170 +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.map;
-
-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.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.MapHelper;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-
-import java.io.Serializable;
-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.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements MapReducer, TraversalParent {
-
-    private Traversal.Admin<S, E> groupTraversal = null;
-
-    public GroupCountStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier(HashMapSupplier.instance());
-        this.setBiFunction(new GroupCountBiFunction());
-    }
-
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
-        this.groupTraversal = this.integrateChild(groupTraversal);
-    }
-
-    @Override
-    public List<Traversal.Admin<S, E>> getLocalChildren() {
-        return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
-    }
-
-    @Override
-    public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
-        return GroupCountMapReduce.instance();
-    }
-
-    @Override
-    public GroupCountStep<S, E> clone() {
-        final GroupCountStep<S, E> clone = (GroupCountStep<S, E>) super.clone();
-        if (null != this.groupTraversal)
-            clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
-        return clone;
-    }
-
-    @Override
-    public Traverser<Map<E, Long>> processNextStart() {
-        if (this.byPass) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            return traverser.asAdmin().split(TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map<E, Long>>) this.groupTraversal), this);
-        } else {
-            return super.processNextStart();
-        }
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.groupTraversal);
-    }
-
-    ///////////
-
-    private class GroupCountBiFunction implements BiFunction<Map<E, Long>, Traverser<S>, Map<E, Long>>, Serializable {
-
-        private GroupCountBiFunction() {
-
-        }
-
-        @Override
-        public Map<E, Long> apply(final Map<E, Long> mutatingSeed, final Traverser<S> traverser) {
-            MapHelper.incr(mutatingSeed, TraversalUtil.applyNullable(traverser.asAdmin(), GroupCountStep.this.groupTraversal), traverser.bulk());
-            return mutatingSeed;
-        }
-    }
-
-    ///////////
-
-    public static final class GroupCountMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
-
-        private static final GroupCountMapReduce INSTANCE = new GroupCountMapReduce();
-
-        private GroupCountMapReduce() {
-
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return true;
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
-            vertex.<TraverserSet<E>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
-        }
-
-        @Override
-        public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
-            long counter = 0;
-            while (values.hasNext()) {
-                counter = counter + values.next();
-            }
-            emitter.emit(key, counter);
-        }
-
-        @Override
-        public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
-            reduce(key, values, emitter);
-        }
-
-        @Override
-        public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
-            final Map<E, Long> map = new HashMap<>();
-            keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
-            return map;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return REDUCING;
-        }
-
-        public static final <E> GroupCountMapReduce<E> instance() {
-            return INSTANCE;
-        }
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 5d26384..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroupStep.java
+++ /dev/null
@@ -1,277 +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.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.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
-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.ArrayList;
-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;
-import java.util.function.Supplier;
-
-/**
- * @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 = null;
-    private Traversal.Admin<S, V> valueTraversal = null;
-    private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
-
-    public GroupStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier((Supplier) new GroupMapSupplier());
-        this.setBiFunction((BiFunction) new GroupBiFunction());
-    }
-
-    @Override
-    public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
-        final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
-        if (null != this.keyTraversal)
-            children.add((Traversal.Admin) this.keyTraversal);
-        if (null != this.valueTraversal)
-            children.add((Traversal.Admin) this.valueTraversal);
-        if (null != this.reduceTraversal)
-            children.add((Traversal.Admin) this.reduceTraversal);
-        return children;
-    }
-
-    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() {
-        final GroupStep<S, K, V, R> clone = (GroupStep<S, K, V, R>) super.clone();
-        if (null != this.keyTraversal)
-            clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
-        if (null != this.valueTraversal)
-            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 GroupMapReduce<>(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.applyNullable(traverser, (Traversal.Admin<S, Map>) this.keyTraversal), TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.valueTraversal)};
-            return traverser.asAdmin().split(kvPair, (Step) this);
-        } else {
-            return super.processNextStart();
-        }
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
-    }
-
-    ///////////
-
-    private class GroupBiFunction implements BiFunction<Map<K, Collection<V>>, Traverser.Admin<S>, Map<K, Collection<V>>>, Serializable {
-
-        private GroupBiFunction() {
-
-        }
-
-        @Override
-        public Map<K, Collection<V>> apply(final Map<K, Collection<V>> mutatingSeed, final Traverser.Admin<S> traverser) {
-            final K key = TraversalUtil.applyNullable(traverser, GroupStep.this.keyTraversal);
-            final V value = TraversalUtil.applyNullable(traverser, GroupStep.this.valueTraversal);
-            Collection<V> values = mutatingSeed.get(key);
-            if (null == values) {
-                values = new BulkSet<>();
-                mutatingSeed.put(key, values);
-            }
-            TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
-            return mutatingSeed;
-        }
-    }
-
-    //////////
-
-    private class GroupMap extends HashMap<K, Collection<V>> implements FinalGet<Map<K, R>> {
-
-        @Override
-        public Map<K, R> getFinal() {
-            if (null == GroupStep.this.reduceTraversal)
-                return (Map<K, R>) this;
-            else {
-                final Map<K, R> reduceMap = new HashMap<>();
-                this.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, GroupStep.this.reduceTraversal)));
-                return reduceMap;
-            }
-        }
-    }
-
-    private class GroupMapSupplier implements Supplier<GroupMap>, Serializable {
-
-        private GroupMapSupplier() {
-        }
-
-        @Override
-        public GroupMap get() {
-            return new GroupMap();
-        }
-    }
-
-    ///////////
-
-    public static final class GroupMapReduce<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 GroupMapReduce() {
-
-        }
-
-        public GroupMapReduce(final GroupStep<?, K, V, R> 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 GroupStep groupStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
-            this.reduceTraversal = groupStep.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();
-                if (objects[1] instanceof Collection)
-                    emitter.emit((K) objects[0], (Collection<V>) objects[1]);
-                else {
-                    final List<V> collection = new ArrayList<>();
-                    collection.add((V) objects[1]);
-                    emitter.emit((K) objects[0], collection);
-                }
-            }));
-        }
-
-        @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, TraversalUtil.applyNullable(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 GroupMapReduce<K, V, R> clone() {
-            try {
-                final GroupMapReduce<K, V, R> clone = (GroupMapReduce<K, V, R>) super.clone();
-                if (null != clone.reduceTraversal)
-                    clone.reduceTraversal = this.reduceTraversal.clone();
-                return clone;
-            } catch (final CloneNotSupportedException e) {
-                throw new IllegalStateException(e.getMessage(), e);
-            }
-        }
-
-        @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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java
deleted file mode 100644
index 17d0fe6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/IdStep.java
+++ /dev/null
@@ -1,47 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class IdStep<S extends Element> extends MapStep<S, Object> {
-
-    public IdStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Object map(final Traverser.Admin<S> traverser) {
-        return traverser.get().id();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java
deleted file mode 100644
index 74460a5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/KeyStep.java
+++ /dev/null
@@ -1,47 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Property;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class KeyStep extends MapStep<Property, String> {
-
-    public KeyStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected String map(final Traverser.Admin<Property> traverser) {
-        return traverser.get().key();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java
deleted file mode 100644
index e54c07f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LabelStep.java
+++ /dev/null
@@ -1,47 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LabelStep<S extends Element> extends MapStep<S, String> {
-
-    public LabelStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected String map(final Traverser.Admin<S> traverser) {
-        return traverser.get().label();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java
deleted file mode 100644
index acd6416..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaFlatMapStep.java
+++ /dev/null
@@ -1,49 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Iterator;
-import java.util.function.Function;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaFlatMapStep<S, E> extends FlatMapStep<S, E> {
-
-    private final Function<Traverser<S>, Iterator<E>> function;
-
-    public LambdaFlatMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, Iterator<E>> function) {
-        super(traversal);
-        this.function = function;
-    }
-
-    @Override
-    protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
-        return this.function.apply(traverser);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.function);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java
deleted file mode 100644
index d22e630..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/LambdaMapStep.java
+++ /dev/null
@@ -1,48 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.function.Function;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaMapStep<S, E> extends MapStep<S, E> {
-
-    private final Function<Traverser<S>, E> function;
-
-    public LambdaMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, E> function) {
-        super(traversal);
-        this.function = function;
-    }
-
-    @Override
-    protected E map(final Traverser.Admin<S> traverser) {
-        return this.function.apply(traverser);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.function);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java
deleted file mode 100644
index 8f5c0f2..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapStep.java
+++ /dev/null
@@ -1,53 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MapStep<S, E> extends AbstractStep<S, E> {
-
-    public MapStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<E> processNextStart() {
-        while (true) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            return traverser.split(this.map(traverser), this);
-        }
-    }
-
-    protected abstract E map(final Traverser.Admin<S> traverser);
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH_ACCESS); // TODO: this is bad -- just a hack right now.
-    }
-}
-


[31/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
new file mode 100644
index 0000000..642a4ea
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Step.java
@@ -0,0 +1,158 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * A {@link Step} denotes a unit of computation within a {@link Traversal}.
+ * A step takes an incoming object and yields an outgoing object.
+ * Steps are chained together in a {@link Traversal} to yield a lazy function chain of computation.
+ * <p/>
+ * In the constructor of a Step, never store explicit sideEffect objects in {@link TraversalSideEffects}.
+ * If a sideEffect needs to be registered with the {@link Traversal}, use SideEffects.registerSupplier().
+ *
+ * @param <S> The incoming object type of the step
+ * @param <E> The outgoing object type of the step
+ */
+public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Cloneable {
+
+    /**
+     * Add a iterator of {@link Traverser} objects of type S to the step.
+     *
+     * @param starts The iterator of objects to add
+     */
+    public void addStarts(final Iterator<Traverser<S>> starts);
+
+    /**
+     * Add a single {@link Traverser} to the step.
+     *
+     * @param start The traverser to add
+     */
+    public void addStart(final Traverser<S> start);
+
+    /**
+     * Set the step that is previous to the current step.
+     * Used for linking steps together to form a function chain.
+     *
+     * @param step the previous step of this step
+     */
+    public void setPreviousStep(final Step<?, S> step);
+
+    /**
+     * Get the step prior to the current step.
+     *
+     * @return The previous step
+     */
+    public Step<?, S> getPreviousStep();
+
+    /**
+     * Set the step that is next to the current step.
+     * Used for linking steps together to form a function chain.
+     *
+     * @param step the next step of this step
+     */
+    public void setNextStep(final Step<E, ?> step);
+
+    /**
+     * Get the next step to the current step.
+     *
+     * @return The next step
+     */
+    public Step<E, ?> getNextStep();
+
+    /**
+     * Get the {@link Traversal.Admin} that this step is contained within.
+     *
+     * @param <A> The incoming object type of the traversal
+     * @param <B> The outgoing object type of the traversal
+     * @return The traversal of this step
+     */
+    public <A, B> Traversal.Admin<A, B> getTraversal();
+
+    /**
+     * Set the {@link Traversal} that this step is contained within.
+     *
+     * @param traversal the new traversal for this step
+     */
+    public void setTraversal(final Traversal.Admin<?, ?> traversal);
+
+    /**
+     * Reset the state of the step such that it has no incoming starts.
+     * Internal states are to be reset, but any sideEffect data structures are not to be recreated.
+     */
+    public void reset();
+
+    /**
+     * Cloning is used to duplicate steps for the purpose of traversal optimization and OLTP replication.
+     * When cloning a step, it is important that the steps, the cloned step is equivalent to the state of the step when reset() is called.
+     * Moreover, the previous and next steps should be set to {@link org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep}.
+     *
+     * @return The cloned step
+     */
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public Step<S, E> clone();
+
+    /**
+     * Get the label of this step.
+     * If the step is  not labeled, then an {@link Optional#empty} is returned.
+     *
+     * @return the optional label of the step
+     */
+    public Optional<String> getLabel();
+
+    /**
+     * Set the label of this step.
+     *
+     * @param label the label for this step
+     */
+    public void setLabel(final String label);
+
+    /**
+     * Get the unique id of the step.
+     * These ids can change when strategies are applied and anonymous traversals are embedded in the parent traversal.
+     * A developer should typically not need to call this method.
+     *
+     * @param id the unique id of the step
+     */
+    public void setId(final String id);
+
+    /**
+     * Get the unique id of this step.
+     *
+     * @return the unique id of the step
+     */
+    public String getId();
+
+    /**
+     * Provide the necessary {@link org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement} that must be met by the traverser in order for the step to function properly.
+     * The provided default implements returns an empty set.
+     *
+     * @return the set of requirements
+     */
+    public default Set<TraverserRequirement> getRequirements() {
+        return Collections.emptySet();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java
deleted file mode 100644
index 350dbb1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/StepPosition.java
+++ /dev/null
@@ -1,57 +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;
-
-import java.io.Serializable;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class StepPosition implements Serializable {
-
-    public int x; // step in traversal length
-    public int y; // depth in traversal nested tree
-    public int z; // breadth in traversal siblings
-    public String parentId; // the traversal holder id
-
-    private static final String DOT = ".";
-    private static final String LEFT_PARENTHESES = "(";
-    private static final String RIGHT_PARENTHESES = ")";
-    private static final String EMPTY_STRING = "";
-
-    private StepPosition(final int x, final int y, final int z, final String parentId) {
-        this.x = x;
-        this.y = y;
-        this.z = z;
-        this.parentId = parentId;
-    }
-
-    public StepPosition() {
-        this(0, 0, 0, EMPTY_STRING);
-    }
-
-    public String nextXId() {
-        return this.x++ + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
-    }
-
-    @Override
-    public String toString() {
-        return this.x + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java
new file mode 100644
index 0000000..9b13759
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/T.java
@@ -0,0 +1,114 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+
+import java.util.function.Function;
+
+/**
+ * A collection of (T)okens which allows for more concise Traversal definitions.
+ * T implements {@link Function} can be used to map an element to its token value.
+ * For example, <code>T.id.apply(element)</code>.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum T implements Function<Element, Object> {
+    /**
+     * Label (representing Element.label())
+     */
+    label {
+        @Override
+        public String getAccessor() {
+            return LABEL;
+        }
+
+        @Override
+        public String apply(final Element element) {
+            return element.label();
+        }
+    },
+    /**
+     * Id (representing Element.id())
+     */
+    id {
+        @Override
+        public String getAccessor() {
+            return ID;
+        }
+
+        @Override
+        public Object apply(final Element element) {
+            return element.id();
+        }
+    },
+    /**
+     * Key (representing Property.key())
+     */
+    key {
+        @Override
+        public String getAccessor() {
+            return KEY;
+        }
+
+        @Override
+        public String apply(final Element element) {
+            return ((VertexProperty) element).key();
+        }
+    },
+    /**
+     * Value (representing Property.value())
+     */
+    value {
+        @Override
+        public String getAccessor() {
+            return VALUE;
+        }
+
+        @Override
+        public Object apply(final Element element) {
+            return ((VertexProperty) element).value();
+        }
+    };
+
+    private static final String LABEL = Graph.Hidden.hide("label");
+    private static final String ID = Graph.Hidden.hide("id");
+    private static final String KEY = Graph.Hidden.hide("key");
+    private static final String VALUE = Graph.Hidden.hide("value");
+
+    public abstract String getAccessor();
+
+    @Override
+    public abstract Object apply(final Element element);
+
+    public static T fromString(final String accessor) {
+        if (accessor.equals(LABEL))
+            return label;
+        else if (accessor.equals(ID))
+            return id;
+        else if (accessor.equals(KEY))
+            return key;
+        else if (accessor.equals(VALUE))
+            return value;
+        else
+            throw new IllegalArgumentException("The following token string is unknown: " + accessor);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
new file mode 100644
index 0000000..e6e6285
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -0,0 +1,429 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+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.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+/**
+ * A {@link Traversal} represents a directed walk over a {@link Graph}.
+ * This is the base interface for all traversal's, where each extending interface is seen as a domain specific language.
+ * For example, {@link GraphTraversal} is a domain specific language for traversing a graph using "graph concepts" (e.g. vertices, edges).
+ * Another example may represent the graph using "social concepts" (e.g. people, cities, artifacts).
+ * A {@link Traversal} is evaluated in one of two ways: {@link StandardTraversalEngine} (OLTP) and {@link ComputerTraversalEngine} (OLAP).
+ * OLTP traversals leverage an iterator and are executed within a single JVM (with data access allowed to be remote).
+ * OLAP traversals leverage {@link GraphComputer} and are executed between multiple JVMs (and/or cores).
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
+
+    /**
+     * Used for reflection based access to the static "of" method of a Traversal.
+     */
+    public static final String OF = "of";
+
+    /**
+     * Get access to administrative methods of the traversal via its accompanying {@link Traversal.Admin}.
+     *
+     * @return the admin of this traversal
+     */
+    public default Traversal.Admin<S, E> asAdmin() {
+        return (Traversal.Admin<S, E>) this;
+    }
+
+    /**
+     * Return an {@link Optional} of the next E object in the traversal.
+     * If the traversal is empty, then an {@link Optional#empty()} is returned.
+     *
+     * @return an optional of the next object in the traversal
+     */
+    public default Optional<E> tryNext() {
+        return this.hasNext() ? Optional.of(this.next()) : Optional.empty();
+    }
+
+    /**
+     * Get the next n-number of results from the traversal.
+     * If the traversal has less than n-results, then only that number of results are returned.
+     *
+     * @param amount the number of results to get
+     * @return the n-results in a {@link List}
+     */
+    public default List<E> next(final int amount) {
+        final List<E> result = new ArrayList<>();
+        int counter = 0;
+        while (counter++ < amount && this.hasNext()) {
+            result.add(this.next());
+        }
+        return result;
+    }
+
+    /**
+     * Put all the results into an {@link ArrayList}.
+     *
+     * @return the results in a list
+     */
+    public default List<E> toList() {
+        return this.fill(new ArrayList<>());
+    }
+
+    /**
+     * Put all the results into a {@link HashSet}.
+     *
+     * @return the results in a set
+     */
+    public default Set<E> toSet() {
+        return this.fill(new HashSet<>());
+    }
+
+    /**
+     * Put all the results into a {@link BulkSet}.
+     * This can reduce both time and space when aggregating results by ensuring a weighted set.
+     *
+     * @return the results in a bulk set
+     */
+    public default BulkSet<E> toBulkSet() {
+        return this.fill(new BulkSet<>());
+    }
+
+    /**
+     * Add all the results of the traversal to the provided collection.
+     *
+     * @param collection the collection to fill
+     * @return the collection now filled
+     */
+    public default <C extends Collection<E>> C fill(final C collection) {
+        try {
+            if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
+            // use the end step so the results are bulked
+            final Step<?, E> endStep = this.asAdmin().getEndStep();
+            while (true) {
+                final Traverser<E> traverser = endStep.next();
+                TraversalHelper.addToCollection(collection, traverser.get(), traverser.bulk());
+            }
+        } catch (final NoSuchElementException ignored) {
+        }
+        return collection;
+    }
+
+    /**
+     * Iterate all the {@link Traverser} instances in the traversal.
+     * What is returned is the empty traversal.
+     * It is assumed that what is desired from the computation is are the sideEffects yielded by the traversal.
+     *
+     * @return the fully drained traversal
+     */
+    public default <A, B> Traversal<A, B> iterate() {
+        try {
+            if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
+            // use the end step so the results are bulked
+            final Step<?, E> endStep = this.asAdmin().getEndStep();
+            while (true) {
+                endStep.next();
+            }
+        } catch (final NoSuchElementException ignored) {
+        }
+        return (Traversal<A, B>) this;
+    }
+
+    /**
+     * A traversal can be rewritten such that its defined end type E may yield objects of a different type.
+     * This helper method allows for the casting of the output to the known the type.
+     *
+     * @param endType  the true output type of the traversal
+     * @param consumer a {@link Consumer} to process each output
+     * @param <E2>     the known output type of the traversal
+     */
+    public default <E2> void forEachRemaining(final Class<E2> endType, final Consumer<E2> consumer) {
+        try {
+            while (true) {
+                consumer.accept((E2) next());
+            }
+        } catch (final NoSuchElementException ignore) {
+
+        }
+    }
+
+    @Override
+    public default void forEachRemaining(final Consumer<? super E> action) {
+        try {
+            while (true) {
+                action.accept(next());
+            }
+        } catch (final NoSuchElementException ignore) {
+
+        }
+    }
+
+    /**
+     * A collection of {@link Exception} types associated with Traversal execution.
+     */
+    public static class Exceptions {
+
+        public static IllegalStateException traversalIsLocked() {
+            return new IllegalStateException("The traversal strategies are complete and the traversal can no longer be modulated");
+        }
+
+        public static IllegalStateException traversalIsNotReversible() {
+            return new IllegalStateException("The traversal is not reversible as it contains steps that are not reversible");
+        }
+    }
+
+    public interface Admin<S, E> extends Traversal<S, E> {
+
+        /**
+         * Add an iterator of {@link Traverser} objects to the head/start of the traversal.
+         * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep}.
+         *
+         * @param starts an iterators of traversers
+         */
+        public default void addStarts(final Iterator<Traverser<S>> starts) {
+            if (!this.isLocked()) this.applyStrategies();
+            this.getStartStep().addStarts(starts);
+        }
+
+        /**
+         * Add a single {@link Traverser} object to the head of the traversal.
+         * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep}.
+         *
+         * @param start a traverser to add to the traversal
+         */
+        public default void addStart(final Traverser<S> start) {
+            if (!this.isLocked()) this.applyStrategies();
+            this.getStartStep().addStart(start);
+        }
+
+        /**
+         * Get the {@link Step} instances associated with this traversal.
+         * The steps are ordered according to their linked list structure as defined by {@link Step#getPreviousStep()} and {@link Step#getNextStep()}.
+         *
+         * @return the ordered steps of the traversal
+         */
+        public List<Step> getSteps();
+
+        /**
+         * Add a {@link Step} to the end of the traversal. This method should link the step to its next and previous step accordingly.
+         *
+         * @param step the step to add
+         * @param <E2> the output of the step
+         * @return the updated traversal
+         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+         */
+        public default <E2> Traversal.Admin<S, E2> addStep(final Step<?, E2> step) throws IllegalStateException {
+            return this.addStep(this.getSteps().size(), step);
+        }
+
+        /**
+         * Add a {@link Step} to an arbitrary point in the traversal.
+         *
+         * @param index the location in the traversal to insert the step
+         * @param step  the step to add
+         * @param <S2>  the new start type of the traversal (if the added step was a start step)
+         * @param <E2>  the new end type of the traversal (if the added step was an end step)
+         * @return the newly modulated traversal
+         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+         */
+        public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException;
+
+        /**
+         * Remove a {@link Step} from the traversal.
+         *
+         * @param step the step to remove
+         * @param <S2> the new start type of the traversal (if the removed step was a start step)
+         * @param <E2> the new end type of the traversal (if the removed step was an end step)
+         * @return the newly modulated traversal
+         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+         */
+        public default <S2, E2> Traversal.Admin<S2, E2> removeStep(final Step<?, ?> step) throws IllegalStateException {
+            return this.removeStep(this.getSteps().indexOf(step));
+        }
+
+        /**
+         * Remove a {@link Step} from the traversal.
+         *
+         * @param index the location in the traversal of the step to be evicted
+         * @param <S2>  the new start type of the traversal (if the removed step was a start step)
+         * @param <E2>  the new end type of the traversal (if the removed step was an end step)
+         * @return the newly modulated traversal
+         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+         */
+        public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException;
+
+        /**
+         * Get the start/head of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
+         *
+         * @return the start step of the traversal
+         */
+        public default Step<S, ?> getStartStep() {
+            final List<Step> steps = this.getSteps();
+            return steps.isEmpty() ? EmptyStep.instance() : steps.get(0);
+        }
+
+        /**
+         * Get the end/tail of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
+         *
+         * @return the end step of the traversal
+         */
+        public default Step<?, E> getEndStep() {
+            final List<Step> steps = this.getSteps();
+            return steps.isEmpty() ? EmptyStep.instance() : steps.get(steps.size() - 1);
+        }
+
+        /**
+         * Apply the registered {@link TraversalStrategies} to the traversal.
+         * Once the strategies are applied, the traversal is "locked" and can no longer have steps added to it.
+         * The order of operations for strategy applications should be: globally id steps, apply strategies to root traversal, then to nested traversals.
+         *
+         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
+         */
+        public void applyStrategies() throws IllegalStateException;
+
+        /**
+         * Get the {@link TraversalEngine} that will be used to execute this traversal.
+         *
+         * @return get the traversal engine associated with this traversal.
+         */
+        public TraversalEngine getEngine();
+
+        /**
+         * Set the {@link TraversalEngine} to be used for executing this traversal.
+         *
+         * @param engine the engine to execute the traversal with.
+         */
+        public void setEngine(final TraversalEngine engine);
+
+        /**
+         * Get the {@link TraverserGenerator} associated with this traversal.
+         * The traversal generator creates {@link Traverser} instances that are respective of the traversal's {@link org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement}.
+         *
+         * @return the generator of traversers
+         */
+        public default TraverserGenerator getTraverserGenerator() {
+            return this.getStrategies().getTraverserGeneratorFactory().getTraverserGenerator(this);
+        }
+
+        /**
+         * Get the set of all {@link TraverserRequirement}s for this traversal.
+         *
+         * @return the features of a traverser that are required to execute properly in this traversal
+         */
+        public default Set<TraverserRequirement> getTraverserRequirements() {
+            final Set<TraverserRequirement> requirements = this.getSteps().stream()
+                    .flatMap(step -> ((Step<?, ?>) step).getRequirements().stream())
+                    .collect(Collectors.toSet());
+            if (this.getSideEffects().keys().size() > 0)
+                requirements.add(TraverserRequirement.SIDE_EFFECTS);
+            if (this.getSideEffects().getSackInitialValue().isPresent())
+                requirements.add(TraverserRequirement.SACK);
+            if (this.getEngine().isComputer())
+                requirements.add(TraverserRequirement.BULK);
+            return requirements;
+        }
+
+        /**
+         * Call the {@link Step#reset} method on every step in the traversal.
+         */
+        public default void reset() {
+            this.getSteps().forEach(Step::reset);
+        }
+
+        /**
+         * Set the {@link TraversalSideEffects} of this traversal.
+         *
+         * @param sideEffects the sideEffects to set for this traversal.
+         */
+        public void setSideEffects(final TraversalSideEffects sideEffects);
+
+        /**
+         * Get the {@link TraversalSideEffects} associated with the traversal.
+         *
+         * @return The traversal sideEffects
+         */
+        public TraversalSideEffects getSideEffects();
+
+        /**
+         * Set the {@link TraversalStrategies} to be used by this traversal at evaluation time.
+         *
+         * @param strategies the strategies to use on this traversal
+         */
+        public void setStrategies(final TraversalStrategies strategies);
+
+        /**
+         * Get the {@link TraversalStrategies} associated with this traversal.
+         *
+         * @return the strategies associated with this traversal
+         */
+        public TraversalStrategies getStrategies();
+
+        /**
+         * Set the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
+         * Traversals can be nested and this is the means by which the traversal tree is connected.
+         *
+         * @param step the traversal holder parent step
+         */
+        public void setParent(final TraversalParent step);
+
+        /**
+         * Get the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
+         * Traversals can be nested and this is the means by which the traversal tree is walked.
+         *
+         * @return the traversal holder parent step
+         */
+        public TraversalParent getParent();
+
+        /**
+         * Cloning is used to duplicate the traversal typically in OLAP environments.
+         *
+         * @return The cloned traversal
+         */
+        @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+        public Traversal.Admin<S, E> clone();
+
+        /**
+         * When the traversal has had its {@link TraversalStrategies} applied to it, it is locked.
+         *
+         * @return whether the traversal is locked
+         */
+        public boolean isLocked();
+
+        public Optional<Graph> getGraph();
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java
new file mode 100644
index 0000000..0343988
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalEngine.java
@@ -0,0 +1,53 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalEngine extends Serializable {
+
+    public enum Type {STANDARD, COMPUTER}
+
+    public void processTraversal(final Traversal.Admin<?, ?> traversal);
+
+    public Type getType();
+
+    public Optional<GraphComputer> getGraphComputer();
+
+    public default boolean isStandard() {
+        return this.getType().equals(Type.STANDARD);
+    }
+
+    public default boolean isComputer() {
+        return this.getType().equals(Type.COMPUTER);
+    }
+
+    ///////////
+
+    public interface Builder extends Serializable {
+        public TraversalEngine create(final Graph graph);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java
deleted file mode 100644
index 46f6c70..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalMatrix.java
+++ /dev/null
@@ -1,66 +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;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * A TraversalMatrix provides random, non-linear access to the steps of a traversal by their step id.
- * This is useful in situations where traversers becomes detached from their traversal (and step) and later need to be re-attached.
- * A classic use case is {@link org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram} on {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer}.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TraversalMatrix<S, E> {
-
-    private final Map<String, Step<?, ?>> matrix = new HashMap<>();
-    private final Traversal.Admin<S, E> traversal;
-
-    public TraversalMatrix(final Traversal.Admin<S, E> traversal) {
-        this.harvestSteps(this.traversal = traversal);
-    }
-
-    public <A, B, C extends Step<A, B>> C getStepById(final String stepId) {
-        return (C) this.matrix.get(stepId);
-    }
-
-    public Traversal.Admin<S, E> getTraversal() {
-        return this.traversal;
-    }
-
-    private final void harvestSteps(final Traversal.Admin<?, ?> traversal) {
-        for (final Step<?, ?> step : traversal.getSteps()) {
-            this.matrix.put(step.getId(), step);
-            if (step instanceof TraversalParent) {
-                for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
-                    this.harvestSteps(globalChild);
-                }
-                /*for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
-                    this.harvestSteps(localChild);
-                }*/
-            }
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
new file mode 100644
index 0000000..9ef9b28
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffects.java
@@ -0,0 +1,225 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.io.Serializable;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalSideEffects extends Cloneable, Serializable {
+
+    public static final String SIDE_EFFECTS = "gremlin.traversal.sideEffects";
+
+    /**
+     * Determines if the {@link TraversalSideEffects} contains the respective key.
+     * If the key references a stored {@link java.util.function.Supplier}, then it should return true as it will be dynamically created on get().
+     *
+     * @param key the key to check for
+     * @return whether the key exists in the sideEffects
+     */
+    public default boolean exists(final String key) {
+        return this.keys().contains(key);
+    }
+
+    /**
+     * Set the specified key to the specified value.
+     * If a {@link java.util.function.Supplier} is provided, it is NOT assumed to be a supplier as set by registerSupplier().
+     *
+     * @param key   the key
+     * @param value the value
+     */
+    public void set(final String key, final Object value);
+
+    /**
+     * Get the sideEffect associated with the provided key.
+     * If the sideEffect contains an object for the key, return it.
+     * Else if the sideEffect has a registered {@link java.util.function.Supplier} for that key, generate the object, store the object in the sideEffects, and return it.
+     *
+     * @param key the key to get the value for
+     * @param <V> the type of the value to retrieve
+     * @return the value associated with key
+     * @throws IllegalArgumentException if the key does not reference an object or a registered supplier.
+     */
+    public <V> V get(final String key) throws IllegalArgumentException;
+
+    /**
+     * Return the value associated with the key or return the provided otherValue.
+     * The otherValue will not be stored in the sideEffect.
+     *
+     * @param key        the key to get the value for
+     * @param otherValue if not value is associated with key, return the other value.
+     * @param <V>        the type of the value to get
+     * @return the value associated with the key or the otherValue
+     */
+    public default <V> V orElse(final String key, final V otherValue) {
+        return this.exists(key) ? this.get(key) : otherValue;
+    }
+
+    /**
+     * If a value or registered {@link java.util.function.Supplier} exists for the provided key, consume it with the provided consumer.
+     *
+     * @param key      the key to the value
+     * @param consumer the consumer to process the value
+     * @param <V>      the type of the value to consume
+     */
+    public default <V> void ifPresent(final String key, final Consumer<V> consumer) {
+        if (this.exists(key)) consumer.accept(this.get(key));
+    }
+
+    /**
+     * Remove both the value and registered {@link java.util.function.Supplier} associated with provided key.
+     *
+     * @param key the key of the value and registered supplier to remove
+     */
+    public void remove(final String key);
+
+    /**
+     * The keys of the sideEffect which includes registered {@link java.util.function.Supplier} keys.
+     * In essence, that which is possible to get().
+     *
+     * @return the keys of the sideEffect
+     */
+    public Set<String> keys();
+
+    ////////////
+
+    /**
+     * Register a {@link java.util.function.Supplier} with the provided key.
+     * When sideEffects get() are called, if no object exists and there exists a registered supplier for the key, the object is generated.
+     * Registered suppliers are used for the lazy generation of sideEffect data.
+     *
+     * @param key      the key to register the supplier with
+     * @param supplier the supplier that will generate an object when get() is called if it hasn't already been created
+     */
+    public void registerSupplier(final String key, final Supplier supplier);
+
+    /**
+     * Get the registered {@link java.util.function.Supplier} associated with the specified key.
+     *
+     * @param key the key associated with the supplier
+     * @param <V> The object type of the supplier
+     * @return A non-empty optional if the supplier exists
+     */
+    public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key);
+
+    /**
+     * A helper method to register a {@link java.util.function.Supplier} if it has not already been registered.
+     *
+     * @param key      the key of the supplier to register
+     * @param supplier the supplier to register if the key has not already been registered
+     */
+    public default void registerSupplierIfAbsent(final String key, final Supplier supplier) {
+        if (!this.getRegisteredSupplier(key).isPresent())
+            this.registerSupplier(key, supplier);
+    }
+
+    public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator);
+
+    public <S> Optional<Supplier<S>> getSackInitialValue();
+
+    public <S> Optional<UnaryOperator<S>> getSackSplitOperator();
+
+    /**
+     * If the sideEffect contains an object associated with the key, return it.
+     * Else if a "with" supplier exists for the key, generate the object, store it in the sideEffects and return the object.
+     * Else use the provided supplier to generate the object, store it in the sideEffects and return the object.
+     * Note that if the orCreate supplier is used, it is NOT registered as a {@link java.util.function.Supplier}.
+     *
+     * @param key      the key of the object to get
+     * @param orCreate if the object doesn't exist as an object or suppliable object, then generate it with the specified supplier
+     * @param <V>      the return type of the object
+     * @return the object that is either retrieved, generated, or supplier via orCreate
+     */
+    public default <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
+        if (this.exists(key))
+            return this.<V>get(key);
+        final Optional<Supplier<V>> with = this.getRegisteredSupplier(key);
+        if (with.isPresent()) {
+            final V v = with.get().get();
+            this.set(key, v);
+            return v;
+        } else {
+            final V v = orCreate.get();
+            this.set(key, v);
+            return v;
+        }
+    }
+
+    ////////////
+
+    public default <V> void forEach(final BiConsumer<String, V> biConsumer) {
+        this.keys().forEach(key -> biConsumer.accept(key, this.get(key)));
+    }
+
+    /**
+     * In a distributed {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer} traversal, the sideEffects of the traversal are not a single object within a single JVM.
+     * Instead, the sideEffects are distributed across the graph and the pieces are stored on the computing vertices.
+     * This method is necessary to call when the {@link Traversal} is processing the {@link Traverser}s at a particular {@link org.apache.tinkerpop.gremlin.structure.Vertex}.
+     *
+     * @param vertex the vertex where the traversal is currently executing.
+     */
+    public void setLocalVertex(final Vertex vertex);
+
+    /**
+     * Cloning is used to duplicate the sideEffects typically in OLAP environments.
+     *
+     * @return The cloned sideEffects
+     */
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public TraversalSideEffects clone();
+
+    /**
+     * Add the current {@link TraversalSideEffects} data and suppliers to the provided {@link TraversalSideEffects}.
+     *
+     * @param sideEffects the sideEffects to add this traversal's sideEffect data to.
+     */
+    public void mergeInto(final TraversalSideEffects sideEffects);
+
+    public static class Exceptions {
+
+        public static IllegalArgumentException sideEffectKeyCanNotBeEmpty() {
+            return new IllegalArgumentException("Side effect key can not be the empty string");
+        }
+
+        public static IllegalArgumentException sideEffectKeyCanNotBeNull() {
+            return new IllegalArgumentException("Side effect key can not be null");
+        }
+
+        public static IllegalArgumentException sideEffectValueCanNotBeNull() {
+            return new IllegalArgumentException("Side effect value can not be null");
+        }
+
+        public static IllegalArgumentException sideEffectDoesNotExist(final String key) {
+            return new IllegalArgumentException("Side effects do not have a value for provided key: " + key);
+        }
+
+        public static UnsupportedOperationException dataTypeOfSideEffectValueNotSupported(final Object val) {
+            return new UnsupportedOperationException(String.format("Side effect value [%s] is of type %s is not supported", val, val.getClass()));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
new file mode 100644
index 0000000..6301e27
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.io.Serializable;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalSource {
+
+    public TraversalSource.Builder asBuilder();
+
+    public Optional<GraphComputer> getGraphComputer();
+
+    public Optional<Graph> getGraph();
+
+    ////////////////
+
+    public interface Builder<C extends TraversalSource> extends Serializable {
+
+        public Builder engine(final TraversalEngine.Builder engine);
+
+        public Builder strategy(final TraversalStrategy strategy);
+
+        public C create(final Graph graph);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
new file mode 100644
index 0000000..bffce9f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -0,0 +1,195 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ComparatorHolderRemovalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ConjunctionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.DedupOptimizerStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EngineDependentStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.LabeledEndStepStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchWhereStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProfileStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TraversalVerificationStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+import org.apache.tinkerpop.gremlin.util.tools.MultiMap;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Matthias Broecheler (me@matthiasb.com)
+ */
+public interface TraversalStrategies extends Serializable, Cloneable {
+
+    /**
+     * Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.
+     */
+    public List<TraversalStrategy> toList();
+
+    /**
+     * Apply all the {@link TraversalStrategy} optimizers to the {@link Traversal} for the stated {@link TraversalEngine}.
+     * This method must ensure that the strategies are sorted prior to application.
+     *
+     * @param traversal the traversal to apply the strategies to
+     * @param engine    the engine that the traversal is going to be executed on
+     */
+    public void applyStrategies(final Traversal.Admin<?, ?> traversal);
+
+    /**
+     * Add all the provided {@link TraversalStrategy} instances to the current collection.
+     * When all the provided strategies have been added, the collection is resorted.
+     *
+     * @param strategies the traversal strategies to add
+     * @return the newly updated/sorted traversal strategies collection
+     */
+    public TraversalStrategies addStrategies(final TraversalStrategy... strategies);
+
+    /**
+     * Remove all the provided {@link TraversalStrategy} classes from the current collection.
+     * When all the provided strategies have been removed, the collection is resorted.
+     *
+     * @param strategyClasses the traversal strategies to remove by their class
+     * @return the newly updated/sorted traversal strategies collection
+     */
+    @SuppressWarnings("unchecked")
+    public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses);
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public TraversalStrategies clone();
+
+    /**
+     * Get the {@link TraverserGeneratorFactory} to use to generate traversers.
+     */
+    public TraverserGeneratorFactory getTraverserGeneratorFactory();
+
+    /**
+     * Set the {@link TraverserGeneratorFactory} to use for determining which {@link Traverser} type to generate for the {@link Traversal}.
+     *
+     * @param traverserGeneratorFactory the factory to use
+     */
+    public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory);
+
+    /**
+     * Sorts the list of provided strategies such that the {@link TraversalStrategy#applyPost()}
+     * and {@link TraversalStrategy#applyPrior()} dependencies are respected.
+     * <p/>
+     * Note, that the order may not be unique.
+     *
+     * @param strategies the traversal strategies to sort
+     */
+    public static void sortStrategies(final List<? extends TraversalStrategy> strategies) {
+        final Map<Class<? extends TraversalStrategy>, Set<Class<? extends TraversalStrategy>>> dependencyMap = new HashMap<>();
+        final Set<Class<? extends TraversalStrategy>> strategyClass = new HashSet<>(strategies.size());
+        //Initialize data structure
+        strategies.forEach(s -> strategyClass.add(s.getClass()));
+
+        //Initialize all the dependencies
+        strategies.forEach(strategy -> {
+            strategy.applyPrior().forEach(s -> {
+                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, s, strategy.getClass());
+            });
+            strategy.applyPost().forEach(s -> {
+                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, strategy.getClass(), s);
+            });
+        });
+        //Now, compute transitive closure until convergence
+        boolean updated;
+        do {
+            updated = false;
+            for (final Class<? extends TraversalStrategy> sc : strategyClass) {
+                List<Class<? extends TraversalStrategy>> toAdd = null;
+                for (Class<? extends TraversalStrategy> before : MultiMap.get(dependencyMap, sc)) {
+                    final Set<Class<? extends TraversalStrategy>> beforeDep = MultiMap.get(dependencyMap, before);
+                    if (!beforeDep.isEmpty()) {
+                        if (toAdd == null) toAdd = new ArrayList<>(beforeDep.size());
+                        toAdd.addAll(beforeDep);
+                    }
+                }
+                if (toAdd != null && MultiMap.putAll(dependencyMap, sc, toAdd)) updated = true;
+            }
+        } while (updated);
+        Collections.sort(strategies, new Comparator<TraversalStrategy>() {
+            @Override
+            public int compare(final TraversalStrategy s1, final TraversalStrategy s2) {
+                boolean s1Before = MultiMap.containsEntry(dependencyMap, s1.getClass(), s2.getClass());
+                boolean s2Before = MultiMap.containsEntry(dependencyMap, s2.getClass(), s1.getClass());
+                if (s1Before && s2Before)
+                    throw new IllegalStateException("Cyclic dependency between traversal strategies: ["
+                            + s1.getClass().getName() + ", " + s2.getClass().getName() + ']');
+                if (s1Before) return -1;
+                else if (s2Before) return 1;
+                else return 0;
+            }
+        });
+    }
+
+    public static final class GlobalCache {
+
+        private static final Map<Class<? extends Graph>, TraversalStrategies> CACHE = new HashMap<>();
+
+        static {
+            final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
+            coreStrategies.addStrategies(
+                    DedupOptimizerStrategy.instance(),
+                    RangeByIsCountStrategy.instance(),
+                    IdentityRemovalStrategy.instance(),
+                    MatchWhereStrategy.instance(),
+                    ComparatorHolderRemovalStrategy.instance(),
+                    LabeledEndStepStrategy.instance(),
+                    EngineDependentStrategy.instance(),
+                    ProfileStrategy.instance(),
+                    TraversalVerificationStrategy.instance(),
+                    ConjunctionStrategy.instance());
+            CACHE.put(Graph.class, coreStrategies.clone());
+            CACHE.put(EmptyGraph.class, new DefaultTraversalStrategies());
+        }
+
+        public static void registerStrategies(final Class<? extends Graph> graphClass, final TraversalStrategies traversalStrategies) {
+            CACHE.put(graphClass, traversalStrategies);
+        }
+
+        public static TraversalStrategies getStrategies(final Class<? extends Graph> graphClass) {
+            final TraversalStrategies traversalStrategies = CACHE.get(graphClass);
+            if (null == traversalStrategies) {
+                if (EmptyGraph.class.isAssignableFrom(graphClass))
+                    return CACHE.get(EmptyGraph.class);
+                else return CACHE.get(Graph.class);
+            }
+            return traversalStrategies;
+        }
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
new file mode 100644
index 0000000..8d8c383
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java
@@ -0,0 +1,50 @@
+/*
+ * 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;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * A {@link TraversalStrategy} defines a particular atomic operation for mutating a {@link Traversal} prior to its evaluation.
+ * Traversal strategies are typically used for optimizing a traversal for the particular underlying graph engine.
+ * A TraversalStrategy should not have a public constructor as they should not maintain state between applications.
+ * Make use of a singleton instance() object to reduce object creation on the JVM.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Matthias Broecheler (me@matthiasb.com)
+ */
+public interface TraversalStrategy extends Serializable {
+
+    // A TraversalStrategy should not have a public constructor
+    // Make use of a singleton instance() object to reduce object creation on the JVM
+    // Moreover they are stateless objects.
+
+    public void apply(final Traversal.Admin<?, ?> traversal);
+
+    public default Set<Class<? extends TraversalStrategy>> applyPrior() {
+        return Collections.emptySet();
+    }
+
+    public default Set<Class<? extends TraversalStrategy>> applyPost() {
+        return Collections.emptySet();
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
new file mode 100644
index 0000000..e2a63ed
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traverser.java
@@ -0,0 +1,280 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.Attachable;
+
+import java.io.Serializable;
+
+/**
+ * A {@link Traverser} represents the current state of an object flowing through a {@link Traversal}.
+ * A traverser maintains a reference to the current object, a traverser-local "sack", a traversal-global sideEffect, a bulk count, and a path history.
+ * <p/>
+ * Different types of traverser can exist depending on the semantics of the traversal and the desire for
+ * space/time optimizations of the developer.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Traverser<T> extends Serializable, Comparable<Traverser<T>>, Cloneable {
+
+    /**
+     * Get the object that the traverser is current at.
+     *
+     * @return The current object of the traverser
+     */
+    public T get();
+
+    /**
+     * Get the sack local sack object of this traverser.
+     *
+     * @param <S> the type of the sack object
+     * @return the sack object
+     */
+    public <S> S sack();
+
+    /**
+     * Set the traversers sack object to the provided value ("sack the value").
+     *
+     * @param object the new value of the traverser's sack
+     * @param <S>    the type of the object
+     */
+    public <S> void sack(final S object);
+
+    /**
+     * Get the current path of the traverser.
+     *
+     * @return The path of the traverser
+     */
+    public Path path();
+
+    /**
+     * Get the object associated with the specified step-label in the traverser's path history.
+     *
+     * @param stepLabel the step-label in the path to access
+     * @param <A>       the type of the object
+     * @return the object associated with that path label (if more than one object occurs at that step, a list is returned)
+     */
+    public default <A> A path(final String stepLabel) {
+        return this.path().get(stepLabel);
+    }
+
+    /**
+     * Return the number of times the traverser has gone through a looping section of a traversal.
+     *
+     * @return The number of times the traverser has gone through a loop
+     */
+    public int loops();
+
+    /**
+     * A traverser may represent a grouping of traversers to allow for more efficient data propagation.
+     *
+     * @return the number of traversers represented in this traverser.
+     */
+    public long bulk();
+
+    /**
+     * Get a particular value from the sideEffects of the traverser.
+     *
+     * @param sideEffectKey the key of the value to get from the sideEffects
+     * @param <A>           the type of the returned object
+     * @return the object in the sideEffects of the respective key
+     */
+    public default <A> A sideEffects(final String sideEffectKey) {
+        return this.asAdmin().getSideEffects().get(sideEffectKey);
+    }
+
+    /**
+     * Set a particular value in the sideEffects of the traverser.
+     *
+     * @param sideEffectKey   the key of the value to set int the sideEffects
+     * @param sideEffectValue the value to set for the sideEffect key
+     */
+    public default void sideEffects(final String sideEffectKey, final Object sideEffectValue) {
+        this.asAdmin().getSideEffects().set(sideEffectKey, sideEffectValue);
+    }
+
+    /**
+     * If the underlying object of the traverser is comparable, compare it with the other traverser.
+     *
+     * @param other the other traverser that presumably has a comparable internal object
+     * @return the comparison of the two objects of the traversers
+     * @throws ClassCastException if the object of the traverser is not comparable
+     */
+    @Override
+    public default int compareTo(final Traverser<T> other) throws ClassCastException {
+        return ((Comparable) this.get()).compareTo(other.get());
+    }
+
+    /**
+     * Typecast the traverser to a "system traverser" so {@link Traverser.Admin} methods can be accessed.
+     * This is used as a helper method to avoid the awkwardness of <code>((Traverser.Administrative)traverser)</code>.
+     * The default implementation simply returns "this" type casted to {@link Traverser.Admin}.
+     *
+     * @return The type-casted traverser
+     */
+    public default Admin<T> asAdmin() {
+        return (Admin<T>) this;
+    }
+
+    /**
+     * Traverser cloning is important when splitting a traverser at a bifurcation point in a traversal.
+     */
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public Traverser<T> clone();
+
+    /**
+     * The methods in System.Traverser are useful to underlying Step and Traversal implementations.
+     * They should not be accessed by the user during lambda-based manipulations.
+     */
+    public interface Admin<T> extends Traverser<T>, Attachable<Admin<T>> {
+
+        public static final String HALT = "halt";
+
+        /**
+         * When two traversers are {@link Traverser#equals} to each other, then they can be merged.
+         * This method is used to merge the traversers into a single traverser.
+         * This is used for optimization where instead of enumerating all traversers, they can be counted.
+         *
+         * @param other the other traverser to merge into this traverser. Once merged, the other can be garbage collected.
+         */
+        public void merge(final Admin<?> other);
+
+        /**
+         * Generate a child traverser of the current traverser for current as step and new object location.
+         * The child has the path history, future, and loop information of the parent.
+         * The child extends that path history with the current as and provided R-object.
+         *
+         * @param r    The current object of the child
+         * @param step The step yielding the split
+         * @param <R>  The current object type of the child
+         * @return The split traverser
+         */
+        public <R> Admin<R> split(final R r, final Step<T, R> step);
+
+        /**
+         * Generate a sibling traverser of the current traverser with a full copy of all state within the sibling.
+         *
+         * @return The split traverser
+         */
+        public Admin<T> split();
+
+        /**
+         * Set the current object location of the traverser.
+         *
+         * @param t The current object of the traverser
+         */
+        public void set(final T t);
+
+        /**
+         * Increment the number of times the traverser has gone through a looping section of traversal.
+         * The step label is important to create a stack of loop counters when within a nested context.
+         * If the provided label is not the same as the current label on the stack, add a new loop counter.
+         * If the provided label is the same as the current label on the stack, increment the loop counter.
+         *
+         * @param stepLabel the label of the step that is doing the incrementing
+         */
+        public void incrLoops(final String stepLabel);
+
+        /**
+         * Set the number of times the traverser has gone through a loop back to 0.
+         * When a traverser exits a looping construct, this method should be called.
+         * In a nested loop context, the highest stack loop counter should be removed.
+         */
+        public void resetLoops();
+
+        /**
+         * Get the step id of where the traverser is located.
+         * This is typically used in multi-machine systems that require the movement of
+         * traversers between different traversal instances.
+         *
+         * @return The future step for the traverser
+         */
+        public String getStepId();
+
+        /**
+         * Set the step id of where the traverser is located.
+         * If the future is {@link Traverser.Admin#HALT}, then {@link Traverser.Admin#isHalted()} is true.
+         *
+         * @param stepId The future step of the traverser
+         */
+        public void setStepId(final String stepId);
+
+        /**
+         * If the traverser has "no future" then it is done with its lifecycle.
+         * This does not mean that the traverser is "dead," only that it has successfully passed through a {@link Traversal}.
+         *
+         * @return Whether the traverser is done executing or not
+         */
+        public default boolean isHalted() {
+            return getStepId().equals(HALT);
+        }
+
+        /**
+         * Set the number of traversers represented by this traverser.
+         *
+         * @param count the number of traversers
+         */
+        public void setBulk(final long count);
+
+        /**
+         * Prepare the traverser for migration across a JVM boundary.
+         *
+         * @return The deflated traverser
+         */
+        public Admin<T> detach();
+
+        /**
+         * Regenerate the detached traverser given its location at a particular vertex.
+         *
+         * @param hostVertex The vertex that is hosting the traverser
+         * @return The inflated traverser
+         */
+        @Override
+        public Admin<T> attach(final Vertex hostVertex);
+
+        /**
+         * Traversers can not attach to graphs and thus, an {@link UnsupportedOperationException} is thrown.
+         *
+         * @param graph the graph to attach the traverser to, which it can't.
+         * @return nothing as an exception is thrown
+         * @throws UnsupportedOperationException is always thrown as it makes no sense to attach a traverser to a graph
+         */
+        @Override
+        public default Admin<T> attach(final Graph graph) throws UnsupportedOperationException {
+            throw new UnsupportedOperationException("A traverser can only exist at the vertices of the graph, not the graph itself");
+        }
+
+        /**
+         * Set the sideEffects of the {@link Traversal}. Given that traversers can move between machines,
+         * it may be important to re-set this when the traverser crosses machine boundaries.
+         *
+         * @param sideEffects the sideEffects of the traversal.
+         */
+        public void setSideEffects(final TraversalSideEffects sideEffects);
+
+        /**
+         * Get the sideEffects associated with the traversal of the traverser.
+         *
+         * @return the traversal sideEffects of the traverser
+         */
+        public TraversalSideEffects getSideEffects();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java
new file mode 100644
index 0000000..bf30b67
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraverserGenerator.java
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraverserGenerator {
+
+    public Set<TraverserRequirement> getProvidedRequirements();
+
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk);
+
+    public default <S> Iterator<Traverser.Admin<S>> generateIterator(final Iterator<S> starts, final Step<S, ?> startStep, final long initialBulk) {
+        return new Iterator<Traverser.Admin<S>>() {
+            @Override
+            public boolean hasNext() {
+                return starts.hasNext();
+            }
+
+            @Override
+            public Traverser.Admin<S> next() {
+                return generate(starts.next(), startStep, initialBulk);
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
new file mode 100644
index 0000000..8895edc
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/DefaultGraphTraversal.java
@@ -0,0 +1,47 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultGraphTraversal<S, E> extends DefaultTraversal<S, E> implements GraphTraversal.Admin<S, E> {
+
+    public DefaultGraphTraversal(final Graph graph) {
+        super(graph);
+    }
+
+    @Override
+    public GraphTraversal.Admin<S, E> asAdmin() {
+        return this;
+    }
+
+    @Override
+    public GraphTraversal<S, E> iterate() {
+        return GraphTraversal.Admin.super.iterate();
+    }
+
+    @Override
+    public DefaultGraphTraversal<S, E> clone() {
+        return (DefaultGraphTraversal<S, E>) super.clone();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java
new file mode 100644
index 0000000..c0fa31e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/EmptyGraphTraversal.java
@@ -0,0 +1,64 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyGraphTraversal<S, E> extends EmptyTraversal<S, E> implements GraphTraversal.Admin<S, E>, GraphTraversal<S, E> {
+
+    private static final EmptyGraphTraversal INSTANCE = new EmptyGraphTraversal<>();
+
+    public static <A, B> EmptyGraphTraversal<A, B> instance() {
+        return INSTANCE;
+    }
+
+    private EmptyGraphTraversal() {
+
+    }
+
+    @Override
+    public GraphTraversal.Admin<S, E> asAdmin() {
+        return this;
+    }
+
+    @Override
+    public <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
+        return instance();
+    }
+
+    @Override
+    public GraphTraversal<S, E> withPath() {
+        return instance();
+    }
+
+    @Override
+    public GraphTraversal<S, E> iterate() {
+        return this;
+    }
+
+    @Override
+    @SuppressWarnings("CloneDoesntCallSuperClone")
+    public EmptyGraphTraversal<S, E> clone() {
+        return instance();
+    }
+}


[34/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java
deleted file mode 100644
index bead509..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/TreeStep.java
+++ /dev/null
@@ -1,178 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-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.graph.util.Tree;
-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.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-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.TreeSupplier;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TreeStep<S> extends ReducingBarrierStep<S, Tree> implements MapReducer, TraversalParent {
-
-    private TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
-
-    public TreeStep(final Traversal.Admin traversal) {
-        super(traversal);
-        this.setSeedSupplier((Supplier) TreeSupplier.instance());
-        this.setBiFunction(new TreeBiFunction());
-    }
-
-
-    @Override
-    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
-        return this.traversalRing.getTraversals();
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
-        this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> getMapReduce() {
-        return TreeMapReduce.instance();
-    }
-
-    @Override
-    public TreeStep<S> clone() {
-        final TreeStep<S> clone = (TreeStep<S>) super.clone();
-        clone.traversalRing = new TraversalRing<>();
-        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
-            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
-        }
-        return clone;
-    }
-
-    @Override
-    public Traverser<Tree> processNextStart() {
-        if (this.byPass) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            return traverser.split(this.reducingBiFunction.apply(new Tree(), traverser), this);
-        } else {
-            return super.processNextStart();
-        }
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.traversalRing);
-    }
-
-    ///////////
-
-    private class TreeBiFunction implements BiFunction<Tree, Traverser<S>, Tree>, Serializable {
-
-        private TreeBiFunction() {
-
-        }
-
-        @Override
-        public Tree apply(final Tree mutatingSeed, final Traverser<S> traverser) {
-            Tree depth = mutatingSeed;
-            final Path path = traverser.path();
-            for (int i = 0; i < path.size(); i++) {
-                final Object object = TraversalUtil.apply(path.<Object>get(i), TreeStep.this.traversalRing.next());
-                if (!depth.containsKey(object))
-                    depth.put(object, new Tree<>());
-                depth = (Tree) depth.get(object);
-            }
-            TreeStep.this.traversalRing.reset();
-            return mutatingSeed;
-        }
-    }
-
-    ///////////
-
-    public static final class TreeMapReduce extends StaticMapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> {
-
-        private static final TreeMapReduce INSTANCE = new TreeMapReduce();
-
-        private TreeMapReduce() {
-
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return true;
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<NullObject, Tree> emitter) {
-            vertex.<TraverserSet<Tree>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
-        }
-
-        @Override
-        public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
-            this.reduce(key, values, emitter);
-        }
-
-        @Override
-        public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
-            final Tree tree = new Tree();
-            values.forEachRemaining(tree::addTree);
-            emitter.emit(tree);
-        }
-
-        @Override
-        public Tree generateFinalResult(final Iterator<KeyValue<NullObject, Tree>> keyValues) {
-            final Tree tree = new Tree();
-            keyValues.forEachRemaining(keyValue -> tree.addTree(keyValue.getValue()));
-            return tree;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return REDUCING;
-        }
-
-        public static final TreeMapReduce instance() {
-            return INSTANCE;
-        }
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java
deleted file mode 100644
index e9ec148..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/UnfoldStep.java
+++ /dev/null
@@ -1,57 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class UnfoldStep<S, E> extends FlatMapStep<S, E> {
-
-    public UnfoldStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
-        final S s = traverser.get();
-        if (s instanceof Iterator)
-            return (Iterator) s;
-        else if (s instanceof Iterable)
-            return ((Iterable) s).iterator();
-        else if (s instanceof Map)
-            return ((Map) s).entrySet().iterator();
-        else
-            return IteratorUtils.of((E) s);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java
deleted file mode 100644
index 39dfa47..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/VertexStep.java
+++ /dev/null
@@ -1,82 +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.map;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class VertexStep<E extends Element> extends FlatMapStep<Vertex, E> {
-
-    private final String[] edgeLabels;
-    private Direction direction;
-    private final Class<E> returnClass;
-
-    public VertexStep(final Traversal.Admin traversal, final Class<E> returnClass, final Direction direction, final String... edgeLabels) {
-        super(traversal);
-        this.direction = direction;
-        this.edgeLabels = edgeLabels;
-        this.returnClass = returnClass;
-    }
-
-    @Override
-    protected Iterator<E> flatMap(final Traverser.Admin<Vertex> traverser) {
-        return Vertex.class.isAssignableFrom(this.returnClass) ?
-                (Iterator<E>) traverser.get().vertices(this.direction, this.edgeLabels) :
-                (Iterator<E>) traverser.get().edges(this.direction, this.edgeLabels);
-    }
-
-    public Direction getDirection() {
-        return this.direction;
-    }
-
-    public String[] getEdgeLabels() {
-        return this.edgeLabels;
-    }
-
-    public Class<E> getReturnClass() {
-        return this.returnClass;
-    }
-
-    public void reverseDirection() {
-        this.direction = this.direction.opposite();
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.direction, Arrays.asList(this.edgeLabels), this.returnClass.getSimpleName().toLowerCase());
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java
deleted file mode 100644
index 44ff69e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Bindings.java
+++ /dev/null
@@ -1,87 +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.map.match;
-
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
-import java.util.function.Function;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class Bindings<T> {
-    private final SortedMap<String, T> map = new TreeMap<>();
-
-    public Bindings() {
-    }
-
-    public Bindings(final Map<String, T> map) {
-        this.map.putAll(map);
-    }
-
-    public Bindings<T> put(final String name, final T value) {
-        map.put(name, value);
-        return this;
-    }
-
-    @Override
-    public String toString() {
-        StringBuilder sb = new StringBuilder("{");
-        boolean first = true;
-        for (Map.Entry<String, T> entry : map.entrySet()) {
-            if (first) first = false;
-            else sb.append(", ");
-            sb.append(entry.getKey()).append(':').append(entry.getValue());
-        }
-        sb.append('}');
-        return sb.toString();
-    }
-
-    public static class BindingsComparator<T> implements Comparator<Bindings<T>> {
-        private final Function<T, String> toStringFunction;
-
-        public BindingsComparator(Function<T, String> toStringFunction) {
-            this.toStringFunction = toStringFunction;
-        }
-
-        @Override
-        public int compare(Bindings<T> left, Bindings<T> right) {
-            int cmp = ((Integer) left.map.size()).compareTo(right.map.size());
-            if (0 != cmp) return cmp;
-
-            Iterator<Map.Entry<String, T>> i1 = left.map.entrySet().iterator();
-            Iterator<Map.Entry<String, T>> i2 = right.map.entrySet().iterator();
-            while (i1.hasNext()) {
-                Map.Entry<String, T> e1 = i1.next();
-                Map.Entry<String, T> e2 = i2.next();
-
-                cmp = e1.getKey().compareTo(e1.getKey());
-                if (0 != cmp) return cmp;
-
-                cmp = e1.getValue().toString().compareTo(e2.getValue().toString());
-                if (0 != cmp) return cmp;
-            }
-
-            return 0;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.java
deleted file mode 100644
index 3285eaf..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/CrossJoinEnumerator.java
+++ /dev/null
@@ -1,96 +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.map.match;
-
-import java.util.function.BiConsumer;
-
-/**
- * An Enumerator which finds the Cartesian product of two other Enumerators,
- * expanding at the same rate in either dimension.
- * This maximizes the size of the product with respect to the number of expansions of the base Enumerators.
- */
-public class CrossJoinEnumerator<T> implements Enumerator<T> {
-
-    private final Enumerator<T> xEnum, yEnum;
-
-    public CrossJoinEnumerator(final Enumerator<T> xEnum,
-                               final Enumerator<T> yEnum) {
-        this.xEnum = xEnum;
-        this.yEnum = yEnum;
-    }
-
-    public int size() {
-        return xEnum.size() * yEnum.size();
-    }
-
-    // note: permits random access
-    public boolean visitSolution(final int index,
-                                 final BiConsumer<String, T> visitor) {
-        int sq = (int) Math.sqrt(index);
-
-        // choose x and y such that the solution represented by index
-        // remains constant as this Enumerator expands
-        int x, y;
-
-        if (0 == index) {
-            x = y = 0;
-        } else {
-            int r = index - sq * sq;
-            if (r < sq) {
-                x = sq;
-                y = r;
-            } else {
-                x = r - sq;
-                y = sq;
-            }
-        }
-
-        // expand x if necessary
-        if (!hasIndex(xEnum, sq)) {
-            if (0 == xEnum.size()) {
-                return false;
-            }
-
-            x = index % xEnum.size();
-            y = index / xEnum.size();
-        }
-
-        // expand y if necessary
-        if (!hasIndex(yEnum, y)) {
-            int height = yEnum.size();
-            if (0 == height) {
-                return false;
-            }
-
-            x = index / height;
-            if (!hasIndex(xEnum, x)) {
-                return false;
-            }
-            y = index % height;
-        }
-
-        // solutions are visited completely (if we have reached this point), else not at all
-        return xEnum.visitSolution(x, visitor) && yEnum.visitSolution(y, visitor);
-    }
-
-    private boolean hasIndex(final Enumerator<T> e,
-                             final int index) {
-        return index < e.size() || e.visitSolution(index, (BiConsumer<String, T>) MatchStep.TRIVIAL_CONSUMER);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java
deleted file mode 100644
index 169f76b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/Enumerator.java
+++ /dev/null
@@ -1,46 +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.map.match;
-
-import java.util.function.BiConsumer;
-
-/**
- * An array of key/value maps accessible by index.
- * The total size of the enumerator may be unknown when it is created;
- * it grows when successive solutions are requested, computing as many as necessary.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public interface Enumerator<T> {
-
-    /**
-     * @return the number of solutions so far known; the enumerator has at least this many.
-     * This should be a relatively cheap operation.
-     */
-    int size();
-
-    /**
-     * Provides access to a solution, allowing it to be printed, put into a map, etc.
-     *
-     * @param index   the index of the solution
-     * @param visitor a consumer for each key/value pair in the solution
-     * @return whether a solution exists at the given index and was visited
-     */
-    boolean visitSolution(int index, BiConsumer<String, T> visitor);
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java
deleted file mode 100644
index 6cc3099..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/InnerJoinEnumerator.java
+++ /dev/null
@@ -1,129 +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.map.match;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiConsumer;
-
-/**
- * An Enumerator which joins the solutions of a base Enumerator according to repeated variables
- * <p/>
- * Note: this Enumerator requires random access to its base Enumerator,
- * as it maintains a list of indices at which valid solutions are found, and visits only those indices.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class InnerJoinEnumerator<T> implements Enumerator<T> {
-    private final Enumerator<T> baseEnumerator;
-    private Iterator<Integer> iterator;
-    private final List<Integer> joinIndices;
-
-    private final Map<String, T> map;
-    private final BiConsumer<String, T> joinVisitor;
-
-    private int joinCount;
-
-    public InnerJoinEnumerator(final Enumerator<T> baseEnumerator,
-                               final Set<String> joinVariables) {
-
-        this.baseEnumerator = baseEnumerator;
-        this.joinIndices = new ArrayList<>();
-
-        map = new HashMap<>();
-        // TODO: allow for more than two instances of a variable
-        joinVisitor = (name, newValue) -> {
-            if (joinVariables.contains(name)) {
-                T value = map.get(name);
-                if (null == value) {
-                    map.put(name, newValue);
-                } else if (value.equals(newValue)) {
-                    joinCount++;
-                }
-            } else {
-                map.put(name, newValue);
-            }
-        };
-
-        iterator = new Iterator<Integer>() {
-            private int currentIndex = -1;
-
-            {
-                advanceToNext();
-            }
-
-            public boolean hasNext() {
-                // there are no calls to this method
-                return false;
-            }
-
-            public Integer next() {
-                int tmp = currentIndex;
-                advanceToNext();
-                return tmp;
-            }
-
-            private void advanceToNext() {
-                while (true) {
-                    map.clear();
-                    joinCount = 0;
-
-                    if (!baseEnumerator.visitSolution(++currentIndex, joinVisitor)) {
-                        iterator = null;
-                        return;
-                    }
-
-                    if (joinVariables.size() == joinCount) {
-                        joinIndices.add(currentIndex);
-                        return;
-                    }
-                }
-            }
-        };
-    }
-
-    public int size() {
-        return joinIndices.size();
-    }
-
-    public boolean visitSolution(int i, BiConsumer<String, T> visitor) {
-        while (i >= joinIndices.size()) {
-            if (null == iterator) {
-                return false;
-            }
-
-            iterator.next();
-        }
-
-        map.clear();
-        if (!baseEnumerator.visitSolution(joinIndices.get(i), joinVisitor)) {
-            throw new IllegalStateException();
-        }
-
-        for (Map.Entry<String, T> entry : map.entrySet()) {
-            visitor.accept(entry.getKey(), entry.getValue());
-        }
-
-        return true;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java
deleted file mode 100644
index f974daf..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/IteratorEnumerator.java
+++ /dev/null
@@ -1,67 +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.map.match;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiConsumer;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class IteratorEnumerator<T> implements Enumerator<T> {
-    private final String name;
-    private Iterator<T> iterator;
-    private final List<T> memory = new ArrayList<>();
-
-    public IteratorEnumerator(final String name,
-                              final Iterator<T> iterator) {
-        this.name = name;
-        this.iterator = iterator;
-    }
-
-    public int size() {
-        return memory.size();
-    }
-
-    public boolean visitSolution(final int index,
-                                 final BiConsumer<String, T> visitor) {
-        T value;
-
-        if (index < memory.size()) {
-            value = memory.get(index);
-        } else do {
-            if (null == iterator) {
-                return false;
-            } else if (!iterator.hasNext()) {
-                // free up memory as soon as possible
-                iterator = null;
-                return false;
-            }
-
-            value = iterator.next();
-            memory.add(value);
-        } while (index >= memory.size());
-
-        MatchStep.visit(name, value, visitor);
-
-        return true;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java
deleted file mode 100644
index e51e21d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/MatchStep.java
+++ /dev/null
@@ -1,559 +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.map.match;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Set;
-import java.util.Stack;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public final class MatchStep<S, E> extends AbstractStep<S, Map<String, E>> implements TraversalParent {
-
-    static final BiConsumer<String, Object> TRIVIAL_CONSUMER = (s, t) -> {
-    };
-
-    private static final String ANON_LABEL_PREFIX = "_";
-
-    // optimize before processing each start object, by default
-    private static final int DEFAULT_STARTS_PER_OPTIMIZE = 1;
-
-    private final String startLabel;
-    private final Map<String, List<TraversalWrapper<S, S>>> traversalsByStartAs;
-    private final List<Traversal> traversals = new ArrayList<>();
-
-    private int startsPerOptimize = DEFAULT_STARTS_PER_OPTIMIZE;
-    private int optimizeCounter = -1;
-    private int anonLabelCounter = 0;
-
-    private Enumerator<S> currentSolution;
-    private int currentIndex;
-
-    // initial value allows MatchStep to be used as a stand-alone query engine
-    private Traverser.Admin<S> currentStart;
-
-    public MatchStep(final Traversal.Admin traversal, final String startLabel, final Traversal... traversals) {
-        super(traversal);
-        this.startLabel = startLabel;
-        this.traversalsByStartAs = new HashMap<>();
-        this.currentStart = new B_O_PA_S_SE_SL_Traverser<>(null, this);
-        for (final Traversal tl : traversals) {
-            addTraversalPrivate(tl);
-            this.integrateChild(tl.asAdmin());
-            this.traversals.add(tl);
-        }
-        checkSolvability();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements();
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.traversalsByStartAs);
-    }
-
-    /**
-     * Adds an individual traversal to an already-constructed MatchStep.
-     * The query must be solvable after addition (i.e. should not require the addition of
-     * further traversals in order to be solvable)
-     * This method should be called before the query is first executed.
-     *
-     * @param traversal the traversal to add
-     */
-    public void addTraversal(final Traversal<S, S> traversal) {
-        addTraversalPrivate(traversal);
-        this.traversals.add(traversal);
-        this.integrateChild(traversal.asAdmin());
-        checkSolvability();
-    }
-
-    public void setStartsPerOptimize(final int startsPerOptimize) {
-        if (startsPerOptimize < 1) {
-            throw new IllegalArgumentException();
-        }
-        this.startsPerOptimize = startsPerOptimize;
-    }
-
-    @Override
-    protected Traverser<Map<String, E>> processNextStart() throws NoSuchElementException {
-        final Map<String, E> map = new HashMap<>();
-        final Traverser<Map<String, E>> result = this.currentStart.split(map, this);
-        final BiConsumer<String, S> resultSetter = (name, value) -> map.put(name, (E) value);
-
-        while (true) { // break out when the current solution is exhausted and there are no more starts
-            if (null == this.currentSolution) {
-                if (this.starts.hasNext()) {
-                    this.optimizeCounter = (this.optimizeCounter + 1) % this.startsPerOptimize;
-                    if (0 == this.optimizeCounter) {
-                        optimize();
-                    }
-
-                    this.currentStart = this.starts.next();
-                    this.currentSolution = solveFor(IteratorUtils.of(this.currentStart.get()));
-                    this.currentIndex = 0;
-                } else {
-                    throw FastNoSuchElementException.instance();
-                }
-            }
-
-            map.clear();
-            if (this.currentSolution.visitSolution(this.currentIndex++, resultSetter)) {
-                return result;
-            } else {
-                this.currentSolution = null;
-            }
-        }
-    }
-
-    /**
-     * @return a description of the current state of this step, including the query plan and gathered statistics
-     */
-    public String summarize() {
-        final StringBuilder sb = new StringBuilder("match \"")
-                .append(this.startLabel)
-                .append("\":\t")
-                .append(findCost(this.startLabel))
-                .append('\n');
-        summarize(this.startLabel, sb, new HashSet<>(), 1);
-        return sb.toString();
-    }
-
-    private void summarize(final String outLabel,
-                           final StringBuilder sb,
-                           final Set<String> visited,
-                           final int indent) {
-        if (!visited.contains(outLabel)) {
-            visited.add(outLabel);
-            final List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outLabel);
-            if (null != outs) {
-                for (final TraversalWrapper<S, S> w : outs) {
-                    for (int i = 0; i < indent; i++) sb.append('\t');
-                    sb.append(outLabel).append("->").append(w.endLabel).append(":\t");
-                    sb.append(findCost(w));
-                    sb.append('\t').append(w);
-                    sb.append('\n');
-                    summarize(w.endLabel, sb, visited, indent + 1);
-                }
-            }
-        }
-    }
-
-    private void addTraversalPrivate(final Traversal<S, S> traversal) {
-
-        String startAs = traversal.asAdmin().getStartStep().getLabel().orElseThrow(()
-                -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
-        String endAs = traversal.asAdmin().getEndStep().getLabel().orElse(null);
-        checkAs(startAs);
-        if (null == endAs) {
-            endAs = createAnonymousAs();
-        } else {
-            checkAs(endAs);
-        }
-
-        final TraversalWrapper<S, S> wrapper = new TraversalWrapper<>(traversal, startAs, endAs);
-        // index all wrapped traversals by their startLabel
-        List<TraversalWrapper<S, S>> l2 = this.traversalsByStartAs.get(startAs);
-        if (null == l2) {
-            l2 = new LinkedList<>();
-            this.traversalsByStartAs.put(startAs, l2);
-        }
-        l2.add(wrapper);
-    }
-
-    // given all the wrapped traversals, determine bad patterns in the set and throw exceptions if not solvable
-    private void checkSolvability() {
-        final Set<String> pathSet = new HashSet<>();
-        final Stack<String> stack = new Stack<>();
-        stack.push(this.startLabel);
-        int countTraversals = 0;
-        while (!stack.isEmpty()) {
-            final String outAs = stack.peek();
-            if (pathSet.contains(outAs)) {
-                stack.pop();
-                pathSet.remove(outAs);
-            } else {
-                pathSet.add(outAs);
-                final List<TraversalWrapper<S, S>> l = traversalsByStartAs.get(outAs);
-                if (null != l) {
-                    for (final TraversalWrapper<S, S> tw : l) {
-                        countTraversals++;
-                        if (pathSet.contains(tw.endLabel)) {
-                            throw new IllegalArgumentException("The provided traversal set contains a cycle due to '"
-                                    + tw.endLabel + '\'');
-                        }
-                        stack.push(tw.endLabel);
-                    }
-                }
-            }
-        }
-
-        int totalTraversals = 0;
-        for (List<TraversalWrapper<S, S>> l : this.traversalsByStartAs.values()) {
-            totalTraversals += l.size();
-        }
-
-        if (countTraversals < totalTraversals) {
-            throw new IllegalArgumentException("The provided traversal set contains unreachable as-label(s)");
-        }
-    }
-
-    private static void checkAs(final String as) {
-        // note: this won't happen so long as the anon prefix is the same as Traversal.UNDERSCORE
-        if (isAnonymousAs(as)) {
-            throw new IllegalArgumentException("The step named '" + as + "' uses reserved prefix '"
-                    + ANON_LABEL_PREFIX + '\'');
-        }
-    }
-
-    private static boolean isAnonymousAs(final String as) {
-        return as.startsWith(ANON_LABEL_PREFIX);
-    }
-
-    private String createAnonymousAs() {
-        return ANON_LABEL_PREFIX + ++this.anonLabelCounter;
-    }
-
-    /**
-     * Directly applies this match query to a sequence of inputs
-     *
-     * @param inputs a sequence of inputs
-     * @return an enumerator over all solutions
-     */
-    public Enumerator<S> solveFor(final Iterator<S> inputs) {
-        return solveFor(startLabel, inputs);
-    }
-
-    private Enumerator<S> solveFor(final String localStartAs,
-                                   final Iterator<S> inputs) {
-        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
-        if (null == outs) {
-            // no out-traversals from here; just enumerate the values bound to localStartAs
-            return isAnonymousAs(localStartAs)
-                    ? new SimpleEnumerator<>(localStartAs, inputs)
-                    : new IteratorEnumerator<>(localStartAs, inputs);
-        } else {
-            // for each value bound to localStartAs, feed it into all out-traversals in parallel and join the results
-            return new SerialEnumerator<>(localStartAs, inputs, o -> {
-                Enumerator<S> result = null;
-                Set<String> leftLabels = new HashSet<>();
-
-                for (TraversalWrapper<S, S> w : outs) {
-                    TraversalUpdater<S, S> updater
-                            = new TraversalUpdater<>(w, IteratorUtils.of(o), currentStart, this.getId());
-
-                    Set<String> rightLabels = new HashSet<>();
-                    addVariables(w.endLabel, rightLabels);
-                    Enumerator<S> ie = solveFor(w.endLabel, updater);
-                    result = null == result ? ie : crossJoin(result, ie, leftLabels, rightLabels);
-                    leftLabels.addAll(rightLabels);
-                }
-
-                return result;
-            });
-        }
-    }
-
-    private static <T> Enumerator<T> crossJoin(final Enumerator<T> left,
-                                               final Enumerator<T> right,
-                                               final Set<String> leftLabels,
-                                               final Set<String> rightLabels) {
-        Set<String> shared = new HashSet<>();
-        for (String s : rightLabels) {
-            if (leftLabels.contains(s)) {
-                shared.add(s);
-            }
-        }
-
-        Enumerator<T> cj = new CrossJoinEnumerator<>(left, right);
-        return shared.size() > 0 ? new InnerJoinEnumerator<>(cj, shared) : cj;
-    }
-
-    // recursively add all non-anonymous variables from a starting point in the query
-    private void addVariables(final String localStartAs,
-                              final Set<String> variables) {
-        if (!isAnonymousAs(localStartAs)) {
-            variables.add(localStartAs);
-        }
-
-        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
-        if (null != outs) {
-            for (TraversalWrapper<S, S> w : outs) {
-                String endAs = w.endLabel;
-                if (!variables.contains(endAs)) {
-                    addVariables(endAs, variables);
-                }
-            }
-        }
-    }
-
-    // applies a visitor, skipping anonymous variables
-    static <T> void visit(final String name,
-                          final T value,
-                          final BiConsumer<String, T> visitor) {
-        if (!isAnonymousAs(name)) {
-            visitor.accept(name, value);
-        }
-    }
-
-    /**
-     * Computes and applies a new query plan based on gathered statistics about traversal inputs and outputs.
-     */
-    // note: optimize() is never called from within a solution iterator, as it changes the query plan
-    public void optimize() {
-        optimizeAt(startLabel);
-    }
-
-    private void optimizeAt(final String outAs) {
-        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
-        if (null != outs) {
-            for (TraversalWrapper<S, S> t : outs) {
-                optimizeAt(t.endLabel);
-                updateOrderingFactor(t);
-            }
-            Collections.sort(outs);
-        }
-    }
-
-    private double findCost(final TraversalWrapper<S, S> root) {
-        double bf = root.findBranchFactor();
-        return bf + findCost(root.endLabel, root.findBranchFactor());
-    }
-
-    private double findCost(final String outAs,
-                            final double branchFactor) {
-        double bf = branchFactor;
-
-        double cost = 0;
-
-        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
-        if (null != outs) {
-            for (TraversalWrapper<S, S> child : outs) {
-                cost += bf * findCost(child);
-                bf *= child.findBranchFactor();
-            }
-        }
-
-        return cost;
-    }
-
-    /**
-     * @param outLabel the out-label of one or more traversals in the query
-     * @return the expected cost, in the current query plan, of applying the branch of the query plan at
-     * the given out-label to one start value
-     */
-    public double findCost(final String outLabel) {
-        return findCost(outLabel, 1.0);
-    }
-
-    private void updateOrderingFactor(final TraversalWrapper<S, S> w) {
-        w.orderingFactor = ((w.findBranchFactor() - 1) / findCost(w));
-    }
-
-    @Override
-    public List<Traversal> getLocalChildren() {
-        return this.traversals;
-    }
-
-    /**
-     * A wrapper for a traversal in a query which maintains statistics about the traversal as
-     * it consumes inputs and produces outputs.
-     * The "branch factor" of the traversal is an important factor in determining its place in the query plan.
-     */
-    // note: input and output counts are never "refreshed".
-    // The position of a traversal in a query never changes, although its priority / likelihood of being executed does.
-    // Priority in turn affects branch factor.
-    // However, with sufficient inputs and optimizations,the branch factor is expected to converge on a stable value.
-    public static class TraversalWrapper<A, B> implements Comparable<TraversalWrapper<A, B>> {
-        private final Traversal<A, B> traversal;
-        private final String startLabel, endLabel;
-        private int totalInputs = 0;
-        private int totalOutputs = 0;
-        private double orderingFactor;
-
-        public TraversalWrapper(final Traversal<A, B> traversal,
-                                final String startLabel,
-                                final String endLabel) {
-            this.traversal = traversal;
-            this.startLabel = startLabel;
-            this.endLabel = endLabel;
-        }
-
-        public void incrementInputs() {
-            this.totalInputs++;
-        }
-
-        public void incrementOutputs(int outputs) {
-            this.totalOutputs += outputs;
-        }
-
-        // TODO: take variance into account, to avoid penalizing traversals for early encounters with super-inputs,
-        // or simply for never having been tried
-        public double findBranchFactor() {
-            return 0 == this.totalInputs ? 1 : this.totalOutputs / ((double) this.totalInputs);
-        }
-
-        @Override
-        public int compareTo(final TraversalWrapper<A, B> other) {
-            return ((Double) this.orderingFactor).compareTo(other.orderingFactor);
-        }
-
-        public Traversal<A, B> getTraversal() {
-            return this.traversal;
-        }
-
-        public void reset() {
-            this.traversal.asAdmin().reset();
-        }
-
-        @Override
-        public String toString() {
-            return this.traversal.toString();
-            //return "[" + this.startLabel + "->" + this.endLabel + "," + findBranchFactor() + ","
-            // + this.totalInputs + "," + this.totalOutputs + "," + this.traversal + "]";
-        }
-    }
-
-    /**
-     * A helper object which wraps a traversal, submitting starts and counting results per start
-     */
-    public static class TraversalUpdater<A, B> implements Iterator<B> {
-        private final TraversalWrapper<A, B> w;
-        private int outputs = -1;
-
-        public TraversalUpdater(final TraversalWrapper<A, B> w,
-                                final Iterator<A> inputs,
-                                final Traverser<A> start,
-                                final String as) {
-            this.w = w;
-
-            Iterator<A> seIter = new SideEffectIterator<>(inputs, ignored -> {
-                // only increment traversal input and output counts once an input
-                // has been completely processed by the traversal
-                if (-1 != outputs) {
-                    w.incrementInputs();
-                    w.incrementOutputs(outputs);
-                }
-                outputs = 0;
-            });
-            Iterator<Traverser<A>> starts = new MapIterator<>(seIter,
-                    o -> {
-                        final Traverser.Admin<A> traverser = ((Traverser.Admin<A>) start).split();
-                        traverser.set((A) o);
-                        return traverser;
-                    });
-
-            w.reset();
-
-            // with the traversal "empty" and ready for re-use, add new starts
-            w.traversal.asAdmin().addStarts(starts);
-        }
-
-        // note: may return true after first returning false (inheriting this behavior from e.g. DefaultTraversal)
-        @Override
-        public boolean hasNext() {
-            return w.traversal.hasNext();
-        }
-
-        @Override
-        public B next() {
-            outputs++;
-            B b = w.traversal.next();
-
-            // immediately check hasNext(), possibly updating the traverser's statistics
-            // even if we otherwise abandon the iterator
-            w.traversal.hasNext();
-
-            return b;
-        }
-    }
-
-    // an iterator which executes a side-effect the first time hasNext() is called before a next()
-    private static class SideEffectIterator<T> implements Iterator<T> {
-        private final Consumer onHasNext;
-        private final Iterator<T> baseIterator;
-        private boolean ready = true;
-
-        private SideEffectIterator(final Iterator<T> baseIterator,
-                                   final Consumer onHasNext) {
-            this.onHasNext = onHasNext;
-            this.baseIterator = baseIterator;
-        }
-
-        @Override
-        public boolean hasNext() {
-            if (this.ready) {
-                this.onHasNext.accept(null);
-                this.ready = false;
-            }
-            return this.baseIterator.hasNext();
-        }
-
-        @Override
-        public T next() {
-            T value = this.baseIterator.next();
-            this.ready = true;
-            return value;
-        }
-    }
-
-    private static class MapIterator<A, B> implements Iterator<B> {
-        private final Function<A, B> map;
-        private final Iterator<A> baseIterator;
-
-        public MapIterator(final Iterator<A> baseIterator, final Function<A, B> map) {
-            this.map = map;
-            this.baseIterator = baseIterator;
-        }
-
-        @Override
-        public boolean hasNext() {
-            return this.baseIterator.hasNext();
-        }
-
-        @Override
-        public B next() {
-            return this.map.apply(this.baseIterator.next());
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java
deleted file mode 100644
index ce0739d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SerialEnumerator.java
+++ /dev/null
@@ -1,119 +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.map.match;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiConsumer;
-import java.util.function.Function;
-
-/**
- * An enumerator which consumes values from an iterator and maps each value to a secondary enumerator
- * (for example, a join)
- * Enumerated indices cover all solutions in the secondary enumerators,
- * in ascending order according to the value iterator and the enumerators' own indices.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class SerialEnumerator<T> implements Enumerator<T> {
-    private final String name;
-    private Iterator<T> iterator;
-    private final Function<T, Enumerator<T>> constructor;
-    private final List<Enumerator<T>> memory = new ArrayList<>();
-    private final List<T> values = new ArrayList<>();
-
-    // TODO: this only assigned, not accessed until the efficient implementation of size() is restored
-    private int completedEnumsSize = 0;
-
-    public SerialEnumerator(final String name,
-                            final Iterator<T> iterator,
-                            final Function<T, Enumerator<T>> constructor) {
-        this.name = name;
-        this.iterator = iterator;
-        this.constructor = constructor;
-    }
-
-    public int size() {
-        // TODO: restore the more efficient implementation of size() while taking into account that
-        // traversal iterators such as DefaultTraversal may return hasNext=true after first returning hasNext=false
-        /*
-        int size = completedEnumsSize;
-        if (!sideEffects.isEmpty()) {
-            size += sideEffects.get(sideEffects.size() - 1).size();
-        }
-        return size;
-        */
-
-        //*
-        int size = 0;
-        for (Enumerator<T> e : memory) size += e.size();
-        return size;
-        //*/
-    }
-
-    // note: *not* intended for random access; use binary search if this is ever needed
-    public boolean visitSolution(final int index,
-                                 final BiConsumer<String, T> visitor) {
-        int totalSize = 0;
-        int memIndex = 0;
-        while (true) {
-            if (memIndex < memory.size()) {
-                Enumerator<T> e = memory.get(memIndex);
-
-                if (e.visitSolution(index - totalSize, visitor)) {
-                    // additionally, bind the value stored in this enumerator
-                    MatchStep.visit(name, values.get(memIndex), visitor);
-
-                    return true;
-                } else {
-                    totalSize += e.size();
-                    memIndex++;
-                }
-            } else {
-                if (null == iterator) {
-                    return false;
-                } else if (!iterator.hasNext()) {
-                    // free up memory as soon as possible
-                    iterator = null;
-                    return false;
-                }
-
-                if (!memory.isEmpty()) {
-                    int lastSize = memory.get(memIndex - 1).size();
-
-                    // first remove the head enumeration if it exists and is empty
-                    // (only the head will ever be empty, avoiding wasted space)
-                    if (0 == lastSize) {
-                        memIndex--;
-                        memory.remove(memIndex);
-                        values.remove(memIndex);
-                    } else {
-                        completedEnumsSize += lastSize;
-                    }
-                }
-
-                T value = iterator.next();
-                values.add(value);
-                Enumerator<T> e = constructor.apply(value);
-                memory.add(memory.size(), e);
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java
deleted file mode 100644
index 37443f4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/match/SimpleEnumerator.java
+++ /dev/null
@@ -1,66 +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.map.match;
-
-import java.util.Iterator;
-import java.util.function.BiConsumer;
-
-/**
- * An enumerator of at most one element
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public class SimpleEnumerator<T> implements Enumerator<T> {
-
-    private final String name;
-    private Iterator<T> iterator;
-    private T element;
-
-    public SimpleEnumerator(final String name,
-                            final Iterator<T> iterator) {
-        this.name = name;
-        this.iterator = iterator;
-    }
-
-    @Override
-    public int size() {
-        return null == element ? 0 : 1;
-    }
-
-    @Override
-    public boolean visitSolution(int index, BiConsumer<String, T> visitor) {
-        if (0 != index) {
-            return false;
-        }
-
-        if (null != iterator) {
-            if (iterator.hasNext()) {
-                element = iterator.next();
-            }
-            iterator = null;
-        }
-
-        if (null != element) {
-            MatchStep.visit(name, element, visitor);
-            return true;
-        }
-
-        return false;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java
deleted file mode 100644
index e1914dc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AddPropertyStep.java
+++ /dev/null
@@ -1,54 +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.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AddPropertyStep<S extends Element> extends SideEffectStep<S> {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
-
-    private final String key;
-    private final Object value;
-
-    public AddPropertyStep(final Traversal.Admin traversal, final String key, final Object value) {
-        super(traversal);
-        this.key = key;
-        this.value = value;
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<S> traverser) {
-        traverser.get().property(this.key, this.value);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 3c88312..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/AggregateStep.java
+++ /dev/null
@@ -1,160 +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.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.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-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.util.function.BulkSetSupplier;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AggregateStep<S> extends CollectingBarrierStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
-    private Traversal.Admin<S, Object> aggregateTraversal = null;
-    private String sideEffectKey;
-
-    public AggregateStep(final Traversal.Admin traversal, final String sideEffectKey) {
-        super(traversal);
-        this.sideEffectKey = sideEffectKey;
-        this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
-    }
-
-    @Override
-    public String getSideEffectKey() {
-        return this.sideEffectKey;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.aggregateTraversal);
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
-        return new AggregateMapReduce(this);
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> aggregateTraversal) {
-        this.aggregateTraversal = this.integrateChild(aggregateTraversal);
-    }
-
-    @Override
-    public List<Traversal.Admin<S, Object>> getLocalChildren() {
-        return null == this.aggregateTraversal ? Collections.emptyList() : Collections.singletonList(this.aggregateTraversal);
-    }
-
-    @Override
-    public void barrierConsumer(final TraverserSet<S> traverserSet) {
-        traverserSet.forEach(traverser ->
-                TraversalHelper.addToCollection(
-                        traverser.getSideEffects().get(this.sideEffectKey),
-                        TraversalUtil.applyNullable(traverser, this.aggregateTraversal),
-                        traverser.bulk()));
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
-    }
-
-    @Override
-    public AggregateStep<S> clone() {
-        final AggregateStep<S> clone = (AggregateStep<S>) super.clone();
-        if (null != this.aggregateTraversal)
-            clone.aggregateTraversal = clone.integrateChild(this.aggregateTraversal.clone());
-        return clone;
-    }
-
-    ////////
-
-    public static final class AggregateMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
-        public static final String AGGREGATE_STEP_SIDE_EFFECT_KEY = "gremlin.aggregateStep.sideEffectKey";
-
-        private String sideEffectKey;
-        private Supplier<Collection> collectionSupplier;
-
-        private AggregateMapReduce() {
-
-        }
-
-        public AggregateMapReduce(final AggregateStep step) {
-            this.sideEffectKey = step.getSideEffectKey();
-            this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
-        }
-
-        @Override
-        public void storeState(final Configuration configuration) {
-            super.storeState(configuration);
-            configuration.setProperty(AGGREGATE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
-        }
-
-        @Override
-        public void loadState(final Configuration configuration) {
-            this.sideEffectKey = configuration.getString(AGGREGATE_STEP_SIDE_EFFECT_KEY);
-            this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return stage.equals(Stage.MAP);
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
-            VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
-        }
-
-        @Override
-        public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
-            final Collection collection = this.collectionSupplier.get();
-            keyValues.forEachRemaining(keyValue -> collection.add(keyValue.getValue()));
-            return collection;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return this.sideEffectKey;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
deleted file mode 100644
index e36ea37..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GraphStep.java
+++ /dev/null
@@ -1,99 +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.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class GraphStep<S extends Element> extends StartStep<S> implements EngineDependent {
-
-    protected final Class<S> returnClass;
-    protected Object[] ids;
-    protected transient Supplier<Iterator<S>> iteratorSupplier;
-
-    public GraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
-        super(traversal);
-        this.returnClass = returnClass;
-        this.ids = ids;
-        for (int i = 0; i < this.ids.length; i++) {
-            if (this.ids[i] instanceof Element)
-                this.ids[i] = ((Element) this.ids[i]).id();
-        }
-        this.iteratorSupplier = () -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ?
-                this.getTraversal().getGraph().get().vertices(this.ids) :
-                this.getTraversal().getGraph().get().edges(this.ids));
-    }
-
-    public String toString() {
-        return TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.returnClass.getSimpleName().toLowerCase());
-    }
-
-    public boolean returnsVertices() {
-        return Vertex.class.isAssignableFrom(this.returnClass);
-    }
-
-    public boolean returnsEdges() {
-        return Edge.class.isAssignableFrom(this.returnClass);
-    }
-
-    public Class<S> getReturnClass() {
-        return this.returnClass;
-    }
-
-    public void setIteratorSupplier(final Supplier<Iterator<S>> iteratorSupplier) {
-        this.iteratorSupplier = iteratorSupplier;
-    }
-
-    public Object[] getIds() {
-        return this.ids;
-    }
-
-    public void clearIds() {
-        this.ids = new Object[0];
-    }
-
-    @Override
-    public void onEngine(final TraversalEngine traversalEngine) {
-        if (traversalEngine.isComputer()) {
-            this.iteratorSupplier = Collections::emptyIterator;
-        }
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() {
-        if (this.first)
-            this.start = null == this.iteratorSupplier ? EmptyIterator.instance() : this.iteratorSupplier.get();
-        return super.processNextStart();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java
deleted file mode 100644
index 997d1db..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupCountSideEffectStep.java
+++ /dev/null
@@ -1,171 +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.commons.configuration.Configuration;
-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.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-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.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-
-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 GroupCountSideEffectStep<S, E> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<E, Long, E, Long, Map<E, Long>> {
-
-    private Traversal.Admin<S, E> groupTraversal = null;
-    private String sideEffectKey;
-
-    public GroupCountSideEffectStep(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<Object, Long> groupCountMap = traverser.sideEffects(this.sideEffectKey);
-        MapHelper.incr(groupCountMap, TraversalUtil.applyNullable(traverser.asAdmin(), this.groupTraversal), traverser.bulk());
-    }
-
-    @Override
-    public String getSideEffectKey() {
-        return this.sideEffectKey;
-    }
-
-    @Override
-    public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
-        return new GroupCountSideEffectMapReduce<>(this);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.groupTraversal);
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
-        this.groupTraversal = this.integrateChild(groupTraversal);
-    }
-
-    @Override
-    public List<Traversal.Admin<S, E>> getLocalChildren() {
-        return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
-    }
-
-    @Override
-    public GroupCountSideEffectStep<S, E> clone() {
-        final GroupCountSideEffectStep<S, E> clone = (GroupCountSideEffectStep<S, E>) super.clone();
-        if (null != this.groupTraversal)
-            clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
-        return clone;
-    }
-
-    ///////
-
-    public static final class GroupCountSideEffectMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
-
-        public static final String GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupCountSideEffectStep.sideEffectKey";
-
-        private String sideEffectKey;
-        private Supplier<Map<E, Long>> mapSupplier;
-
-        private GroupCountSideEffectMapReduce() {
-
-        }
-
-        public GroupCountSideEffectMapReduce(final GroupCountSideEffectStep step) {
-            this.sideEffectKey = step.getSideEffectKey();
-            this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
-        }
-
-        @Override
-        public void storeState(final Configuration configuration) {
-            super.storeState(configuration);
-            configuration.setProperty(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
-        }
-
-        @Override
-        public void loadState(final Configuration configuration) {
-            this.sideEffectKey = configuration.getString(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
-            this.mapSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return true;
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
-            VertexTraversalSideEffects.of(vertex).<Map<E, Number>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach((k, v) -> emitter.emit(k, v.longValue()));
-        }
-
-        @Override
-        public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
-            long counter = 0;
-            while (values.hasNext()) {
-                counter = counter + values.next();
-            }
-            emitter.emit(key, counter);
-        }
-
-        @Override
-        public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
-            reduce(key, values, emitter);
-        }
-
-        @Override
-        public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
-            final Map<E, Long> map = this.mapSupplier.get();
-            keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
-            return map;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return this.sideEffectKey;
-        }
-    }
-}


[37/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java
deleted file mode 100644
index f55814a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchStep.java
+++ /dev/null
@@ -1,166 +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.branch;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ComputerAwareStep;
-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 java.util.*;
-import java.util.stream.Collectors;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class BranchStep<S, E, M> extends ComputerAwareStep<S, E> implements TraversalOptionParent<M, S, E> {
-
-    protected Traversal.Admin<S, M> branchTraversal;
-    protected Map<M, List<Traversal.Admin<S, E>>> traversalOptions = new HashMap<>();
-    private boolean first = true;
-
-    public BranchStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    public void setBranchTraversal(final Traversal.Admin<S, M> branchTraversal) {
-        this.branchTraversal = this.integrateChild(branchTraversal);
-    }
-
-    @Override
-    public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
-        if (this.traversalOptions.containsKey(pickToken))
-            this.traversalOptions.get(pickToken).add(traversalOption);
-        else
-            this.traversalOptions.put(pickToken, new ArrayList<>(Collections.singletonList(traversalOption)));
-        traversalOption.addStep(new EndStep(traversalOption));
-        this.integrateChild(traversalOption);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements();
-    }
-
-    @Override
-    public List<Traversal.Admin<S, E>> getGlobalChildren() {
-        return Collections.unmodifiableList(this.traversalOptions.values().stream()
-                .flatMap(list -> list.stream())
-                .collect(Collectors.toList()));
-    }
-
-    @Override
-    public List<Traversal.Admin<S, M>> getLocalChildren() {
-        return Collections.singletonList(this.branchTraversal);
-    }
-
-    @Override
-    protected Iterator<Traverser<E>> standardAlgorithm() {
-        while (true) {
-            if (!this.first) {
-                for (final List<Traversal.Admin<S, E>> options : this.traversalOptions.values()) {
-                    for (final Traversal.Admin<S, E> option : options) {
-                        if (option.hasNext())
-                            return option.getEndStep();
-                    }
-                }
-            }
-            this.first = false;
-            ///
-            final Traverser.Admin<S> start = this.starts.next();
-            final M choice = TraversalUtil.apply(start, this.branchTraversal);
-            final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
-            if (null != branch) {
-                branch.forEach(traversal -> {
-                    traversal.reset();
-                    traversal.addStart(start.split());
-                });
-            }
-            if (choice != Pick.any) {
-                final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
-                if (null != anyBranch)
-                    anyBranch.forEach(traversal -> {
-                        traversal.reset();
-                        traversal.addStart(start.split());
-                    });
-            }
-        }
-    }
-
-    @Override
-    protected Iterator<Traverser<E>> computerAlgorithm() {
-        final List<Traverser<E>> ends = new ArrayList<>();
-        final Traverser.Admin<S> start = this.starts.next();
-        final M choice = TraversalUtil.apply(start, this.branchTraversal);
-        final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
-        if (null != branch) {
-            branch.forEach(traversal -> {
-                final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
-                split.setStepId(traversal.getStartStep().getId());
-                ends.add(split);
-            });
-        }
-        if (choice != Pick.any) {
-            final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
-            if (null != anyBranch) {
-                anyBranch.forEach(traversal -> {
-                    final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
-                    split.setStepId(traversal.getStartStep().getId());
-                    ends.add(split);
-                });
-            }
-        }
-        return ends.iterator();
-    }
-
-    @Override
-    public BranchStep<S, E, M> clone() {
-        final BranchStep<S, E, M> clone = (BranchStep<S, E, M>) super.clone();
-        clone.traversalOptions = new HashMap<>(this.traversalOptions.size());
-        for (final Map.Entry<M, List<Traversal.Admin<S, E>>> entry : this.traversalOptions.entrySet()) {
-            final List<Traversal.Admin<S, E>> traversals = entry.getValue();
-            if (traversals.size() > 0) {
-                final List<Traversal.Admin<S, E>> clonedTraversals = clone.traversalOptions.compute(entry.getKey(), (k, v) ->
-                        (v == null) ? new ArrayList<>(traversals.size()) : v);
-                for (final Traversal.Admin<S, E> traversal : traversals) {
-                    final Traversal.Admin<S, E> clonedTraversal = traversal.clone();
-                    clonedTraversals.add(clonedTraversal);
-                    clone.integrateChild(clonedTraversal);
-                }
-            }
-        }
-        clone.branchTraversal = this.branchTraversal.clone();
-        clone.integrateChild(clone.branchTraversal);
-        return clone;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.branchTraversal, this.traversalOptions);
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.first = true;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java
deleted file mode 100644
index d692b47..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseStep.java
+++ /dev/null
@@ -1,51 +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.branch;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.HasNextTraversal;
-
-/**
- * A step which offers a choice of two or more Traversals to take.
- *
- * @author Joshua Shinavier (http://fortytwo.net)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ChooseStep<S, E, M> extends BranchStep<S, E, M> {
-
-    public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, M> choiceTraversal) {
-        super(traversal);
-        this.setBranchTraversal(choiceTraversal);
-    }
-
-    public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> predicateTraversal, final Traversal.Admin<S, E> trueChoice, final Traversal.Admin<S, E> falseChoice) {
-        this(traversal, new HasNextTraversal(predicateTraversal));
-        this.addGlobalChildOption((M) Boolean.TRUE, trueChoice);
-        this.addGlobalChildOption((M) Boolean.FALSE, falseChoice);
-    }
-
-    @Override
-    public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
-        if (Pick.any.equals(pickToken))
-            throw new IllegalArgumentException("Choose step can not have an any-option as only one option per traverser is allowed");
-        if (this.traversalOptions.containsKey(pickToken))
-            throw new IllegalArgumentException("Choose step can only have one traversal per pick token: " + pickToken);
-        super.addGlobalChildOption(pickToken, traversalOption);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java
deleted file mode 100644
index 3c84d5d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalStep.java
+++ /dev/null
@@ -1,87 +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.branch;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LocalStep<S, E> extends AbstractStep<S, E> implements TraversalParent {
-
-    private Traversal.Admin<S, E> localTraversal;
-    private boolean first = true;
-
-    public LocalStep(final Traversal.Admin traversal, final Traversal.Admin<S, E> localTraversal) {
-        super(traversal);
-        this.localTraversal = this.integrateChild(localTraversal);
-    }
-
-    @Override
-    public LocalStep<S, E> clone() {
-        final LocalStep<S, E> clone = (LocalStep<S, E>) super.clone();
-        clone.localTraversal = clone.integrateChild(this.localTraversal.clone());
-        clone.first = true;
-        return clone;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.localTraversal);
-    }
-
-    @Override
-    public List<Traversal.Admin<S, E>> getLocalChildren() {
-        return Collections.singletonList(this.localTraversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.localTraversal.getTraverserRequirements();
-    }
-
-    @Override
-    protected Traverser<E> processNextStart() throws NoSuchElementException {
-        if (this.first) {
-            this.first = false;
-            this.localTraversal.addStart(this.starts.next());
-        }
-        while (true) {
-            if (this.localTraversal.hasNext())
-                return this.localTraversal.getEndStep().next();
-            else if (this.starts.hasNext()) {
-                this.localTraversal.reset();
-                this.localTraversal.addStart(this.starts.next());
-            } else {
-                throw FastNoSuchElementException.instance();
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java
deleted file mode 100644
index c317048..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatStep.java
+++ /dev/null
@@ -1,263 +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.branch;
-
-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.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ComputerAwareStep;
-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.util.iterator.IteratorUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class RepeatStep<S> extends ComputerAwareStep<S, S> implements TraversalParent {
-
-    private Traversal.Admin<S, S> repeatTraversal = null;
-    private Traversal.Admin<S, ?> untilTraversal = null;
-    private Traversal.Admin<S, ?> emitTraversal = null;
-    public boolean untilFirst = false;
-    public boolean emitFirst = false;
-
-    public RepeatStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.BULK);
-        if (requirements.contains(TraverserRequirement.SINGLE_LOOP))
-            requirements.add(TraverserRequirement.NESTED_LOOP);
-        requirements.add(TraverserRequirement.SINGLE_LOOP);
-        return requirements;
-    }
-
-    @SuppressWarnings("unchecked")
-    public void setRepeatTraversal(final Traversal.Admin<S, S> repeatTraversal) {
-        this.repeatTraversal = repeatTraversal; // .clone();
-        this.repeatTraversal.addStep(new RepeatEndStep(this.repeatTraversal));
-        this.integrateChild(this.repeatTraversal);
-    }
-
-    public void setUntilTraversal(final Traversal.Admin<S, ?> untilTraversal) {
-        if (null == this.repeatTraversal) this.untilFirst = true;
-        this.untilTraversal = this.integrateChild(untilTraversal);
-    }
-
-    public void setEmitTraversal(final Traversal.Admin<S, ?> emitTraversal) {
-        if (null == this.repeatTraversal) this.emitFirst = true;
-        this.emitTraversal = this.integrateChild(emitTraversal);
-    }
-
-    public List<Traversal.Admin<S, S>> getGlobalChildren() {
-        return null == this.repeatTraversal ? Collections.emptyList() : Collections.singletonList(this.repeatTraversal);
-    }
-
-    public List<Traversal.Admin<S, ?>> getLocalChildren() {
-        final List<Traversal.Admin<S, ?>> list = new ArrayList<>();
-        if (null != this.untilTraversal)
-            list.add(this.untilTraversal);
-        if (null != this.emitTraversal)
-            list.add(this.emitTraversal);
-        return list;
-    }
-
-    public final boolean doUntil(final Traverser.Admin<S> traverser, boolean utilFirst) {
-        return utilFirst == this.untilFirst && null != this.untilTraversal && TraversalUtil.test(traverser, this.untilTraversal);
-    }
-
-    public final boolean doEmit(final Traverser.Admin<S> traverser, boolean emitFirst) {
-        return emitFirst == this.emitFirst && null != this.emitTraversal && TraversalUtil.test(traverser, this.emitTraversal);
-    }
-
-    @Override
-    public String toString() {
-        if (this.untilFirst && this.emitFirst)
-            return TraversalHelper.makeStepString(this, untilString(), emitString(), this.repeatTraversal);
-        else if (this.emitFirst)
-            return TraversalHelper.makeStepString(this, emitString(), this.repeatTraversal, untilString());
-        else if (this.untilFirst)
-            return TraversalHelper.makeStepString(this, untilString(), this.repeatTraversal, emitString());
-        else
-            return TraversalHelper.makeStepString(this, this.repeatTraversal, untilString(), emitString());
-    }
-
-    private final String untilString() {
-        return null == this.untilTraversal ? "until(false)" : "until(" + this.untilTraversal + ')';
-    }
-
-    private final String emitString() {
-        return null == this.emitTraversal ? "emit(false)" : "emit(" + this.emitTraversal + ')';
-    }
-
-    /////////////////////////
-
-    @Override
-    public RepeatStep<S> clone() {
-        final RepeatStep<S> clone = (RepeatStep<S>) super.clone();
-        clone.repeatTraversal = clone.integrateChild(this.repeatTraversal.clone());
-        if (null != this.untilTraversal)
-            clone.untilTraversal = clone.integrateChild(this.untilTraversal.clone());
-        if (null != this.emitTraversal)
-            clone.emitTraversal = clone.integrateChild(this.emitTraversal.clone());
-        return clone;
-    }
-
-    @Override
-    protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
-        while (true) {
-            if (this.repeatTraversal.getEndStep().hasNext()) {
-                return this.repeatTraversal.getEndStep();
-            } else {
-                final Traverser.Admin<S> start = this.starts.next();
-                if (doUntil(start, true)) {
-                    start.resetLoops();
-                    return IteratorUtils.of(start);
-                }
-                this.repeatTraversal.addStart(start);
-                if (doEmit(start, true)) {
-                    final Traverser.Admin<S> emitSplit = start.split();
-                    emitSplit.resetLoops();
-                    return IteratorUtils.of(emitSplit);
-                }
-            }
-        }
-    }
-
-    @Override
-    protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
-        final Traverser.Admin<S> start = this.starts.next();
-        if (doUntil(start, true)) {
-            start.resetLoops();
-            start.setStepId(this.getNextStep().getId());
-            return IteratorUtils.of(start);
-        } else {
-            start.setStepId(this.repeatTraversal.getStartStep().getId());
-            if (doEmit(start, true)) {
-                final Traverser.Admin<S> emitSplit = start.split();
-                emitSplit.resetLoops();
-                emitSplit.setStepId(this.getNextStep().getId());
-                return IteratorUtils.of(start, emitSplit);
-            } else {
-                return IteratorUtils.of(start);
-            }
-        }
-    }
-
-    /////////////////////////
-
-    public static <A, B, C extends Traversal<A, B>> C addRepeatToTraversal(final C traversal, final Traversal.Admin<B, B> repeatTraversal) {
-        final Step<?, B> step = traversal.asAdmin().getEndStep();
-        if (step instanceof RepeatStep && null == ((RepeatStep) step).repeatTraversal) {
-            ((RepeatStep<B>) step).setRepeatTraversal(repeatTraversal);
-        } else {
-            final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
-            repeatStep.setRepeatTraversal(repeatTraversal);
-            traversal.asAdmin().addStep(repeatStep);
-        }
-        return traversal;
-    }
-
-    public static <A, B, C extends Traversal<A, B>> C addUntilToTraversal(final C traversal, final Traversal.Admin<B, ?> untilPredicate) {
-        final Step<?, B> step = traversal.asAdmin().getEndStep();
-        if (step instanceof RepeatStep && null == ((RepeatStep) step).untilTraversal) {
-            ((RepeatStep<B>) step).setUntilTraversal(untilPredicate);
-        } else {
-            final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
-            repeatStep.setUntilTraversal(untilPredicate);
-            traversal.asAdmin().addStep(repeatStep);
-        }
-        return traversal;
-    }
-
-    public static <A, B, C extends Traversal<A, B>> C addEmitToTraversal(final C traversal, final Traversal.Admin<B, ?> emitPredicate) {
-        final Step<?, B> step = traversal.asAdmin().getEndStep();
-        if (step instanceof RepeatStep && null == ((RepeatStep) step).emitTraversal) {
-            ((RepeatStep<B>) step).setEmitTraversal(emitPredicate);
-        } else {
-            final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
-            repeatStep.setEmitTraversal(emitPredicate);
-            traversal.asAdmin().addStep(repeatStep);
-        }
-        return traversal;
-    }
-
-    ///////////////////////////////////
-
-    public class RepeatEndStep extends ComputerAwareStep<S, S> {
-
-        public RepeatEndStep(final Traversal.Admin traversal) {
-            super(traversal);
-        }
-
-        @Override
-        protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
-            while (true) {
-                final Traverser.Admin<S> start = this.starts.next();
-                start.incrLoops(this.getId());
-                if (doUntil(start, false)) {
-                    start.resetLoops();
-                    return IteratorUtils.of(start);
-                } else {
-                    if (!RepeatStep.this.untilFirst && !RepeatStep.this.emitFirst)
-                        RepeatStep.this.repeatTraversal.addStart(start);
-                    else
-                        RepeatStep.this.addStart(start);
-                    if (doEmit(start, false)) {
-                        final Traverser.Admin<S> emitSplit = start.split();
-                        emitSplit.resetLoops();
-                        return IteratorUtils.of(emitSplit);
-                    }
-                }
-            }
-        }
-
-        @Override
-        protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
-            final Traverser.Admin<S> start = this.starts.next();
-            start.incrLoops(RepeatStep.this.getId());
-            if (doUntil(start, false)) {
-                start.resetLoops();
-                start.setStepId(RepeatStep.this.getNextStep().getId());
-                return IteratorUtils.of(start);
-            } else {
-                start.setStepId(RepeatStep.this.getId());
-                if (doEmit(start, false)) {
-                    final Traverser.Admin<S> emitSplit = start.split();
-                    emitSplit.resetLoops();
-                    emitSplit.setStepId(RepeatStep.this.getNextStep().getId());
-                    return IteratorUtils.of(start, emitSplit);
-                }
-                return IteratorUtils.of(start);
-            }
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
deleted file mode 100644
index fb31ac8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionStep.java
+++ /dev/null
@@ -1,52 +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.branch;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Collections;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class UnionStep<S, E> extends BranchStep<S, E, TraversalOptionParent.Pick> {
-
-    public UnionStep(final Traversal.Admin traversal, final Traversal.Admin<?, E>... unionTraversals) {
-        super(traversal);
-        this.setBranchTraversal(new ConstantTraversal<>(Pick.any));
-        for (final Traversal.Admin<?, E> union : unionTraversals) {
-            this.addGlobalChildOption(Pick.any, (Traversal.Admin) union);
-        }
-    }
-
-    @Override
-    public void addGlobalChildOption(final Pick pickToken, final Traversal.Admin<S, E> traversalOption) {
-        if (Pick.any != pickToken)
-            throw new IllegalArgumentException("Union step only supports the any token: " + pickToken);
-        super.addGlobalChildOption(pickToken, traversalOption);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.traversalOptions.getOrDefault(Pick.any, Collections.emptyList()));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java
deleted file mode 100644
index 9044b4c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndStep.java
+++ /dev/null
@@ -1,39 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class AndStep<S> extends ConjunctionStep<S> implements TraversalParent {
-
-    public AndStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... andTraversals) {
-        super(traversal, andTraversals);
-
-    }
-
-    public static final class AndMarker<S> extends ConjunctionMarker<S> {
-        public AndMarker(final Traversal.Admin traversal) {
-            super(traversal);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java
deleted file mode 100644
index 0390283..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinStep.java
+++ /dev/null
@@ -1,64 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CoinStep<S> extends FilterStep<S> {
-
-    private static final Random RANDOM = new Random();
-    private final double probability;
-
-    public CoinStep(final Traversal.Admin traversal, final double probability) {
-        super(traversal);
-        this.probability = probability;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        long newBulk = 0l;
-        for (int i = 0; i < traverser.bulk(); i++) {
-            if (this.probability >= RANDOM.nextDouble())
-                newBulk++;
-        }
-        if (0 == newBulk) return false;
-        traverser.setBulk(newBulk);
-        return true;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.probability);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.BULK);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java
deleted file mode 100644
index 83e76e7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ConjunctionStep.java
+++ /dev/null
@@ -1,193 +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.filter;
-
-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.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ConjunctionStep<S> extends AbstractStep<S, S> implements TraversalParent {
-
-    private List<Traversal.Admin<S, ?>> conjunctionTraversals;
-    private final boolean isAnd;
-
-    public ConjunctionStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... conjunctionTraversals) {
-        super(traversal);
-        this.isAnd = this.getClass().equals(AndStep.class);
-        this.conjunctionTraversals = Arrays.asList(conjunctionTraversals);
-        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
-            this.integrateChild(conjunctionTraversal);
-        }
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        while (true) {
-            final Traverser.Admin<S> start = this.starts.next();
-            boolean found = false;
-            for (final Traversal.Admin<S, ?> traversal : this.conjunctionTraversals) {
-                traversal.addStart(start.split());
-                found = traversal.hasNext();
-                traversal.reset();
-                if (this.isAnd) {
-                    if (!found)
-                        break;
-                } else if (found)
-                    break;
-            }
-            if (found) return start;
-        }
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements();
-    }
-
-    @Override
-    public List<Traversal.Admin<S, ?>> getLocalChildren() {
-        return Collections.unmodifiableList(this.conjunctionTraversals);
-    }
-
-    @Override
-    public ConjunctionStep<S> clone() {
-        final ConjunctionStep<S> clone = (ConjunctionStep<S>) super.clone();
-        clone.conjunctionTraversals = new ArrayList<>();
-        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
-            clone.conjunctionTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
-        }
-        return clone;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.conjunctionTraversals);
-    }
-
-    public boolean isConjunctionHasTree() {
-        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
-            for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
-                if (step instanceof ConjunctionStep) {
-                    if (!((ConjunctionStep) step).isConjunctionHasTree())
-                        return false;
-                } else if (!(step instanceof HasStep))
-                    return false;
-            }
-        }
-        return true;
-    }
-
-    public ConjunctionTree getConjunctionHasTree() {
-        return new ConjunctionTree(this);
-    }
-
-
-    ////////
-
-    public static class ConjunctionMarker<S> extends AbstractStep<S, S> {
-
-        public ConjunctionMarker(final Traversal.Admin traversal) {
-            super(traversal);
-        }
-
-        @Override
-        protected Traverser<S> processNextStart() throws NoSuchElementException {
-            throw new IllegalStateException("This step should have been removed via a strategy: " + this.getClass().getCanonicalName());
-        }
-    }
-
-    ////////
-
-    public static class ConjunctionTree implements Iterable<ConjunctionTree.Entry> {
-
-        private final List<Entry> tree = new ArrayList<>();
-        private final boolean isAnd;
-
-        public ConjunctionTree(final ConjunctionStep<?> conjunctionStep) {
-            this.isAnd = conjunctionStep.isAnd;
-            for (final Traversal.Admin<?, ?> conjunctionTraversal : conjunctionStep.conjunctionTraversals) {
-                for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
-                    if (step instanceof HasStep) {
-                        (((HasStep<?>) step).getHasContainers()).forEach(container -> this.tree.add(new Entry(HasContainer.class, container)));
-                    } else if (step instanceof ConjunctionStep) {
-                        this.tree.add(new Entry(ConjunctionTree.class, ((ConjunctionStep) step).getConjunctionHasTree()));
-                    } else {
-                        throw new IllegalArgumentException("This conjunction supports more complex steps than HasStep");
-                    }
-                }
-            }
-        }
-
-        @Override
-        public String toString() {
-            return (this.isAnd ? "and" : "or") + this.tree.toString();
-        }
-
-        public boolean isAnd() {
-            return this.isAnd;
-        }
-
-        @Override
-        public Iterator<Entry> iterator() {
-            return this.tree.iterator();
-        }
-
-        public static class Entry {
-            private Class entryClass;
-            private Object entryValue;
-
-            public Entry(final Class entryClass, final Object entryValue) {
-                this.entryClass = entryClass;
-                this.entryValue = entryValue;
-            }
-
-            public <V> V getValue() {
-                return (V) this.entryValue;
-            }
-
-            public boolean isHasContainer() {
-                return this.entryClass.equals(HasContainer.class);
-            }
-
-            public boolean isConjunctionTree() {
-                return this.entryClass.equals(ConjunctionTree.class);
-            }
-
-            public String toString() {
-                return this.entryValue.toString();
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java
deleted file mode 100644
index a9c1b17..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathStep.java
+++ /dev/null
@@ -1,46 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class CyclicPathStep<S> extends FilterStep<S> {
-
-    public CyclicPathStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        return !traverser.path().isSimple();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 205c492..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupGlobalStep.java
+++ /dev/null
@@ -1,86 +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.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.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 java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class DedupGlobalStep<S> extends FilterStep<S> implements TraversalParent {
-
-    private Traversal.Admin<S, Object> dedupTraversal = new IdentityTraversal<>();
-    private Set<Object> duplicateSet = new HashSet<>();
-
-    public DedupGlobalStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        traverser.setBulk(1);
-        return this.duplicateSet.add(TraversalUtil.apply(traverser, this.dedupTraversal));
-    }
-
-
-    @Override
-    public List<Traversal<S, Object>> getLocalChildren() {
-        return Collections.singletonList(this.dedupTraversal);
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin dedupTraversal) {
-        this.dedupTraversal = this.integrateChild(dedupTraversal);
-    }
-
-    @Override
-    public DedupGlobalStep<S> clone() {
-        final DedupGlobalStep<S> clone = (DedupGlobalStep<S>) super.clone();
-        clone.duplicateSet = new HashSet<>();
-        clone.dedupTraversal = clone.integrateChild(this.dedupTraversal.clone());
-        return clone;
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.duplicateSet.clear();
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.dedupTraversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java
deleted file mode 100644
index 0d1cbd3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptStep.java
+++ /dev/null
@@ -1,97 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ExceptStep<S> extends FilterStep<S> {
-
-    private final String sideEffectKeyOrPathLabel;
-    private final Collection<S> exceptCollection;
-    private final S exceptObject;
-    private final short choice;
-
-    public ExceptStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
-        super(traversal);
-        this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
-        this.exceptCollection = null;
-        this.exceptObject = null;
-        this.choice = 0;
-    }
-
-    public ExceptStep(final Traversal.Admin traversal, final Collection<S> exceptionCollection) {
-        super(traversal);
-        this.sideEffectKeyOrPathLabel = null;
-        this.exceptCollection = exceptionCollection;
-        this.exceptObject = null;
-        this.choice = 1;
-    }
-
-    public ExceptStep(final Traversal.Admin traversal, final S exceptionObject) {
-        super(traversal);
-        this.sideEffectKeyOrPathLabel = null;
-        this.exceptCollection = null;
-        this.exceptObject = exceptionObject;
-        this.choice = 2;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        switch (this.choice) {
-            case 0: {
-                final Object except = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
-                        traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
-                        traverser.path(this.sideEffectKeyOrPathLabel);
-                return except instanceof Collection ?
-                        !((Collection) except).contains(traverser.get()) :
-                        !except.equals(traverser.get());
-            }
-            case 1:
-                return !this.exceptCollection.contains(traverser.get());
-            default:
-                return !this.exceptObject.equals(traverser.get());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return null == this.sideEffectKeyOrPathLabel ?
-                Collections.singleton(TraverserRequirement.OBJECT) :
-                Stream.of(TraverserRequirement.OBJECT,
-                        TraverserRequirement.SIDE_EFFECTS,
-                        TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java
deleted file mode 100644
index 482abf9..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterStep.java
+++ /dev/null
@@ -1,47 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.function.Predicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class FilterStep<S> extends AbstractStep<S, S> {
-
-    public FilterStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() {
-        while (true) {
-            final Traverser.Admin<S> traverser = this.starts.next();
-            if (this.filter(traverser)) {
-                return traverser;
-            }
-        }
-    }
-
-    protected abstract boolean filter(final Traverser.Admin<S> traverser);
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java
deleted file mode 100644
index c127727..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasStep.java
+++ /dev/null
@@ -1,69 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class HasStep<S extends Element> extends FilterStep<S> implements HasContainerHolder {   // TODO: make final when graph strategies are fixed up
-
-    private final HasContainer hasContainer;
-
-    public HasStep(final Traversal.Admin traversal, final HasContainer hasContainer) {
-        super(traversal);
-        this.hasContainer = hasContainer;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        return this.hasContainer.test(traverser.get());
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.hasContainer);
-    }
-
-    @Override
-    public List<HasContainer> getHasContainers() {
-        return Collections.singletonList(this.hasContainer);
-    }
-
-    @Override
-    public void addHasContainer(final HasContainer hasContainer) {
-        throw new UnsupportedOperationException(this.getClass().getSimpleName() + " does not support adding new HasContainers");
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java
deleted file mode 100644
index 0ffe739..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTraversalStep.java
+++ /dev/null
@@ -1,80 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-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 java.util.Collections;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class HasTraversalStep<S> extends AbstractStep<S, S> implements TraversalParent {
-
-    private Traversal.Admin<S, ?> hasTraversal;
-    private final boolean negate;
-
-    public HasTraversalStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> hasTraversal, final boolean negate) {
-        super(traversal);
-        this.negate = negate;
-        this.hasTraversal = this.integrateChild(hasTraversal);
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        while (true) {
-            final Traverser.Admin<S> start = this.starts.next();
-            if (TraversalUtil.test(start, this.hasTraversal) != this.negate)
-                return start;
-        }
-    }
-
-    @Override
-    public String toString() {
-        final String stepString = TraversalHelper.makeStepString(this, this.hasTraversal);
-        return this.negate ? stepString.replaceFirst("\\(", "(!") : stepString;
-    }
-
-    @Override
-    public List<Traversal<S, ?>> getLocalChildren() {
-        return Collections.singletonList(this.hasTraversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements();
-    }
-
-    @Override
-    public HasTraversalStep<S> clone() {
-        final HasTraversalStep<S> clone = (HasTraversalStep<S>) super.clone();
-        clone.hasTraversal = clone.integrateChild(this.hasTraversal.clone());
-        return clone;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
deleted file mode 100644
index 61e743d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsStep.java
+++ /dev/null
@@ -1,66 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-import java.util.function.BiPredicate;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class IsStep<S> extends FilterStep<S> {
-
-    private final Object value;
-    private final BiPredicate<S, Object> biPredicate;
-
-    public IsStep(final Traversal.Admin traversal, final BiPredicate<S, Object> biPredicate, final Object value) {
-        super(traversal);
-        this.value = value;
-        this.biPredicate = biPredicate;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        return this.biPredicate.test(traverser.get(), this.value);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.biPredicate, this.value);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.OBJECT);
-    }
-
-    public Object getValue() {
-        return value;
-    }
-
-    public BiPredicate<S, Object> getPredicate() {
-        return biPredicate;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
deleted file mode 100644
index 96ebf75..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/LambdaFilterStep.java
+++ /dev/null
@@ -1,52 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.function.Predicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaFilterStep<S> extends FilterStep<S> {
-
-    private final Predicate<Traverser<S>> predicate;
-
-    public LambdaFilterStep(final Traversal.Admin traversal, final Predicate<Traverser<S>> predicate) {
-        super(traversal);
-        this.predicate = predicate;
-    }
-
-    public Predicate<Traverser<S>> getPredicate() {
-        return predicate;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        return this.predicate.test(traverser);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this,this.predicate);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java
deleted file mode 100644
index a5c183e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrStep.java
+++ /dev/null
@@ -1,39 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class OrStep<S> extends ConjunctionStep<S> implements TraversalParent {
-
-    public OrStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... orTraversals) {
-        super(traversal, orTraversals);
-
-    }
-
-    public static final class OrMarker<S> extends ConjunctionMarker<S> {
-        public OrMarker(final Traversal.Admin traversal) {
-            super(traversal);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java
deleted file mode 100644
index aa2e84d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeGlobalStep.java
+++ /dev/null
@@ -1,113 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.Ranging;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging {
-
-    private final long low;
-    private final long high;
-    private AtomicLong counter = new AtomicLong(0l);
-
-    public RangeGlobalStep(final Traversal.Admin traversal, final long low, final long high) {
-        super(traversal);
-        if (low != -1 && high != -1 && low > high) {
-            throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
-        }
-        this.low = low;
-        this.high = high;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        if (this.high != -1 && this.counter.get() >= this.high) {
-            throw FastNoSuchElementException.instance();
-        }
-
-        long avail = traverser.bulk();
-        if (this.counter.get() + avail <= this.low) {
-            // Will not surpass the low w/ this traverser. Skip and filter the whole thing.
-            this.counter.getAndAdd(avail);
-            return false;
-        }
-
-        // Skip for the low and trim for the high. Both can happen at once.
-
-        long toSkip = 0;
-        if (this.counter.get() < this.low) {
-            toSkip = this.low - this.counter.get();
-        }
-
-        long toTrim = 0;
-        if (this.high != -1 && this.counter.get() + avail >= this.high) {
-            toTrim = this.counter.get() + avail - this.high;
-        }
-
-        long toEmit = avail - toSkip - toTrim;
-        this.counter.getAndAdd(toSkip + toEmit);
-        traverser.asAdmin().setBulk(toEmit);
-
-        return true;
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.counter.set(0l);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.low, this.high);
-    }
-
-    public long getLowRange() {
-        return this.low;
-    }
-
-    public long getHighRange() {
-        return this.high;
-    }
-
-    @Override
-    public RangeGlobalStep<S> clone() {
-        final RangeGlobalStep<S> clone = (RangeGlobalStep<S>) super.clone();
-        clone.counter = new AtomicLong(0l);
-        return clone;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.BULK);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java
deleted file mode 100644
index 56d2eec..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainStep.java
+++ /dev/null
@@ -1,97 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class RetainStep<S> extends FilterStep<S> {
-
-    private final String sideEffectKeyOrPathLabel;
-    private final Collection<S> retainCollection;
-    private final S retainObject;
-    private final short choice;
-
-    public RetainStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
-        super(traversal);
-        this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
-        this.retainCollection = null;
-        this.retainObject = null;
-        this.choice = 0;
-    }
-
-    public RetainStep(final Traversal.Admin traversal, final Collection<S> retainCollection) {
-        super(traversal);
-        this.sideEffectKeyOrPathLabel = null;
-        this.retainCollection = retainCollection;
-        this.retainObject = null;
-        this.choice = 1;
-    }
-
-    public RetainStep(final Traversal.Admin traversal, final S retainObject) {
-        super(traversal);
-        this.sideEffectKeyOrPathLabel = null;
-        this.retainCollection = null;
-        this.retainObject = retainObject;
-        this.choice = 2;
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        switch (this.choice) {
-            case 0: {
-                final Object retain = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
-                        traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
-                        traverser.path(this.sideEffectKeyOrPathLabel);
-                return retain instanceof Collection ?
-                        ((Collection) retain).contains(traverser.get()) :
-                        retain.equals(traverser.get());
-            }
-            case 1:
-                return this.retainCollection.contains(traverser.get());
-            default:
-                return this.retainObject.equals(traverser.get());
-        }
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return null == this.sideEffectKeyOrPathLabel ?
-                Collections.singleton(TraverserRequirement.OBJECT) :
-                Stream.of(TraverserRequirement.OBJECT,
-                        TraverserRequirement.SIDE_EFFECTS,
-                        TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java
deleted file mode 100644
index d15ce6c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleGlobalStep.java
+++ /dev/null
@@ -1,117 +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.filter;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
-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.TraverserSet;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.Random;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SampleGlobalStep<S> extends CollectingBarrierStep<S> implements TraversalParent {
-
-    private Traversal.Admin<S, Number> probabilityTraversal = new ConstantTraversal<>(1.0d);
-    private final int amountToSample;
-    private static final Random RANDOM = new Random();
-
-    public SampleGlobalStep(final Traversal.Admin traversal, final int amountToSample) {
-        super(traversal);
-        this.amountToSample = amountToSample;
-    }
-
-    @Override
-    public List<Traversal.Admin<S, Number>> getLocalChildren() {
-        return Collections.singletonList(this.probabilityTraversal);
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> probabilityTraversal) {
-        this.probabilityTraversal = this.integrateChild(probabilityTraversal);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.amountToSample, this.probabilityTraversal);
-    }
-
-    @Override
-    public void barrierConsumer(final TraverserSet<S> traverserSet) {
-        // return the entire traverser set if the set is smaller than the amount to sample
-        if (traverserSet.bulkSize() <= this.amountToSample)
-            return;
-        //////////////// else sample the set
-        double totalWeight = 0.0d;
-        for (final Traverser<S> s : traverserSet) {
-            totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), this.probabilityTraversal).doubleValue() * s.bulk();
-        }
-        ///////
-        final TraverserSet<S> sampledSet = new TraverserSet<>();
-        int runningAmountToSample = 0;
-        while (runningAmountToSample < this.amountToSample) {
-            boolean reSample = false;
-            double runningWeight = 0.0d;
-            for (final Traverser.Admin<S> s : traverserSet) {
-                long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
-                if (sampleBulk < s.bulk()) {
-                    final double currentWeight = TraversalUtil.apply(s, this.probabilityTraversal).doubleValue();
-                    for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
-                        runningWeight = runningWeight + currentWeight;
-                        if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
-                            final Traverser.Admin<S> split = s.asAdmin().split();
-                            split.asAdmin().setBulk(1l);
-                            sampledSet.add(split);
-                            runningAmountToSample++;
-                            totalWeight = totalWeight - currentWeight;
-                            reSample = true;
-                            break;
-                        }
-                    }
-                    if (reSample || (runningAmountToSample >= this.amountToSample))
-                        break;
-                }
-            }
-        }
-        traverserSet.clear();
-        traverserSet.addAll(sampledSet);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
-    }
-
-    @Override
-    public SampleGlobalStep<S> clone() {
-        final SampleGlobalStep<S> clone = (SampleGlobalStep<S>) super.clone();
-        clone.probabilityTraversal = clone.integrateChild(this.probabilityTraversal.clone());
-        return clone;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java
deleted file mode 100644
index a1ae045..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathStep.java
+++ /dev/null
@@ -1,47 +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.filter;
-
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SimplePathStep<S> extends FilterStep<S> {
-
-    public SimplePathStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected boolean filter(final Traverser.Admin<S> traverser) {
-        return traverser.path().isSimple();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-}


[08/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java
deleted file mode 100644
index a5bc114..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileTest.java
+++ /dev/null
@@ -1,271 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.*;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.util.metric.Metrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.concurrent.TimeUnit;
-import java.util.function.Consumer;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.both;
-import static org.junit.Assert.*;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ProfileTest extends AbstractGremlinProcessTest {
-    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile();
-
-    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile();
-
-    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile();
-
-    public abstract Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_modern_profile() {
-        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        metrics = traversalMetrics.getMetrics(2);
-        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_out_out_grateful_profile() {
-        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_out_out_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        metrics = traversalMetrics.getMetrics(2);
-        assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_sleep_sleep_profile() {
-        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_sleep_sleep_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
-
-        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        // Grab the second (sideEffect{sleep}) step and check the times.
-        Metrics metrics = traversalMetrics.getMetrics(1);
-        // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation
-        assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) >= 60);
-        assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
-
-        // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
-        metrics = traversalMetrics.getMetrics(2);
-        assertTrue("Duration should be at least the length of the sleep: " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) >= 30);
-        assertTrue("Check that duration is within tolerant range: " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) < 100);
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_repeat_both_modern_profile() {
-        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_repeat_both_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) > 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        // Test the nested global metrics of the repeat step
-        Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
-        assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-        Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
-        assertEquals(72, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-        assertNotEquals(0, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Count should be greater than traversers.", repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) > 0);
-
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-        final Traversal<Vertex, StandardTraversalMetrics> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID));
-        assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID));
-
-        assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends ProfileTest {
-
-        @Override
-        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
-            return (Traversal) g.V().out().out().profile();
-        }
-
-        @Override
-        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
-            return (Traversal) g.V().repeat(both()).times(3).profile();
-        }
-
-        @Override
-        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
-            return (Traversal) g.V().sideEffect(new Consumer<Traverser<Vertex>>() {
-                @Override
-                public void accept(final Traverser<Vertex> vertexTraverser) {
-                    try {
-                        Thread.sleep(10);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    }
-                }
-            }).sideEffect(new Consumer<Traverser<Vertex>>() {
-                @Override
-                public void accept(final Traverser<Vertex> vertexTraverser) {
-                    try {
-                        Thread.sleep(5);
-                    } catch (InterruptedException e) {
-                        e.printStackTrace();
-                    }
-                }
-            }).profile();
-        }
-
-        @Override
-        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-            return (Traversal) g.V().has(__.in("created").count().is(1l)).values("name").profile();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java
deleted file mode 100644
index fdd7a53..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackTest.java
+++ /dev/null
@@ -1,105 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Operator;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SackTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
-
-    public abstract Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
-
-    public abstract Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
-        final Traversal<Vertex, Double> traversal = get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum();
-        assertEquals(3.5d, traversal.next(), 0.00001d);
-        assertFalse(traversal.hasNext());
-    }
-
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
-        final Traversal<Vertex, Float> traversal = get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack();
-        super.checkResults(Arrays.asList(2.0f, 1.4f), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
-        final Traversal<Vertex, Map> traversal = get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack();
-        int counter = 0;
-        while (traversal.hasNext()) {
-            final Map map = traversal.next();
-            assertEquals(1, map.size());
-            assertTrue(map.containsKey("a"));
-            assertTrue(map.get("a").equals("ripple") || map.get("a").equals("lop"));
-            counter++;
-        }
-        assertEquals(2, counter);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends SackTest {
-        @Override
-        public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
-            return g.V().withSack(0.0f).outE().sack(Operator.sum, "weight").inV().sack().sum();
-        }
-
-        @Override
-        public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
-            return g.V().withSack(0.0f).repeat(outE().sack(Operator.sum, "weight").inV()).times(2).sack();
-        }
-
-        @Override
-        public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
-            return g.V().<HashMap>withSack(HashMap::new, m -> (HashMap) m.clone()).out().out().<Map>sack((map, vertex) -> {
-                map.put("a", vertex.value("name"));
-                return map;
-            }).sack();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java
deleted file mode 100644
index a713ced..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapTest.java
+++ /dev/null
@@ -1,95 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SideEffectCapTest extends AbstractGremlinProcessTest {
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
-
-    public abstract Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
-        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX();
-        printTraversalForm(traversal);
-        Map<String, Long> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(map.get("marko"), new Long(1l));
-        assertEquals(map.get("vadas"), new Long(1l));
-        assertEquals(map.get("peter"), new Long(1l));
-        assertEquals(map.get("josh"), new Long(1l));
-        assertEquals(map.size(), 4);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
-        final Traversal<Vertex, Map<String, Map<Object, Long>>> traversal = get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        Map<String, Map<Object, Long>> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertTrue(map.containsKey("a"));
-        assertTrue(map.containsKey("b"));
-        assertEquals(4, map.get("a").size());
-        assertEquals(2, map.get("b").size());
-        assertEquals(1l, map.get("a").get(27).longValue());
-        assertEquals(1l, map.get("a").get(29).longValue());
-        assertEquals(1l, map.get("a").get(32).longValue());
-        assertEquals(1l, map.get("a").get(35).longValue());
-        assertEquals(1l, map.get("b").get("ripple").longValue());
-        assertEquals(1l, map.get("b").get("lop").longValue());
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends SideEffectCapTest {
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
-            return g.V().has("age").groupCount("a").by("name").out().cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
-            return g.V().choose(has(T.label, "person"),
-                    values("age").groupCount("a"),
-                    values("name").groupCount("b")).cap("a", "b");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java
deleted file mode 100644
index d60abaf..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectTest.java
+++ /dev/null
@@ -1,116 +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.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class SideEffectTest extends AbstractGremlinTest {
-    public abstract Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_sideEffectXstore_aX_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_sideEffectXstore_aX_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertEquals(traversal.next(), "marko");
-        assertFalse(traversal.hasNext());
-        assertEquals(convertToVertexId("marko"), traversal.asAdmin().getSideEffects().<List<Vertex>>get("a").get(0).id());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_sideEffectXincr_cX_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXincr_cX_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
-        assertEquals(new Integer(3), traversal.asAdmin().getSideEffects().<List<Integer>>get("c").get(0));
-    }
-
-    private void assert_g_v1_out_sideEffectXincr_cX_valueXnameX(final Iterator<String> traversal) {
-        final List<String> names = new ArrayList<>();
-        while (traversal.hasNext()) {
-            names.add(traversal.next());
-        }
-        assertEquals(3, names.size());
-        assertTrue(names.contains("josh"));
-        assertTrue(names.contains("lop"));
-        assertTrue(names.contains("vadas"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_sideEffectXX_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_out_sideEffectXX_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assert_g_v1_out_sideEffectXincr_cX_valueXnameX(traversal);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class Traversals extends SideEffectTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
-            return g.V(v1Id).withSideEffect("a", ArrayList::new).sideEffect(traverser -> {
-                traverser.<List>sideEffects("a").clear();
-                traverser.<List<Vertex>>sideEffects("a").add(traverser.get());
-            }).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
-            return g.V(v1Id).withSideEffect("c", () -> {
-                final List<Integer> list = new ArrayList<>();
-                list.add(0);
-                return list;
-            }).out().sideEffect(traverser -> {
-                Integer temp = traverser.<List<Integer>>sideEffects("c").get(0);
-                traverser.<List<Integer>>sideEffects("c").clear();
-                traverser.<List<Integer>>sideEffects("c").add(temp + 1);
-            }).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
-            return g.V(v1Id).out().sideEffect(traverser -> {
-            }).values("name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java
deleted file mode 100644
index 8f1f8cf..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreTest.java
+++ /dev/null
@@ -1,137 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.HashSetSupplier;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.inE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class StoreTest extends AbstractGremlinProcessTest {
-    public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX();
-
-    public abstract Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
-
-    public abstract Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_storeXa_nameX_out_capXaX() {
-        final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXnameX_out_capXaX();
-        printTraversalForm(traversal);
-        Collection names = traversal.next();
-        assertEquals(6, names.size());
-        assertTrue(names.contains("marko"));
-        assertTrue(names.contains("josh"));
-        assertTrue(names.contains("peter"));
-        assertTrue(names.contains("lop"));
-        assertTrue(names.contains("ripple"));
-        assertTrue(names.contains("vadas"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX() {
-        final Traversal<Vertex, Collection> traversal = get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        Collection names = traversal.next();
-        assertEquals(4, names.size());
-        assertTrue(names.contains("marko"));
-        assertTrue(names.contains("josh"));
-        assertTrue(names.contains("vadas"));
-        assertTrue(names.contains("lop"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_withXa_setX_both_name_storeXaX() {
-        final Traversal<Vertex, Set<String>> traversal = get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX();
-        printTraversalForm(traversal);
-        final Set<String> names = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertFalse(names instanceof BulkSet);
-        assertEquals(6, names.size());
-        assertTrue(names.contains("marko"));
-        assertTrue(names.contains("vadas"));
-        assertTrue(names.contains("josh"));
-        assertTrue(names.contains("lop"));
-        assertTrue(names.contains("ripple"));
-        assertTrue(names.contains("peter"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX() {
-        final Traversal<Vertex, Collection> traversal = get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Collection store = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(8, store.size());
-        assertTrue(store.contains(0L));
-        assertTrue(store.contains(1L));
-        assertTrue(store.contains(2L));
-        assertTrue(store.contains(1.0d));
-        assertFalse(store.isEmpty());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends StoreTest {
-        @Override
-        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
-            return g.V().store("a").by("name").out().cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(final Object v1Id) {
-            return g.V(v1Id).store("a").by("name").out().store("a").by("name").values("name").cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
-            return g.V().withSideEffect("a", HashSetSupplier.instance()).both().<String>values("name").store("a").cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
-            return g.V().store("a").by(outE("created").count()).out().out().store("a").by(inE("created").values("weight").sum()).cap("a");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java
deleted file mode 100644
index 537f4fa..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphTest.java
+++ /dev/null
@@ -1,116 +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.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.commons.configuration.Configuration;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.apache.tinkerpop.gremlin.structure.Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES;
-import static org.apache.tinkerpop.gremlin.structure.Graph.Features.ElementFeatures.FEATURE_USER_SUPPLIED_IDS;
-import static org.apache.tinkerpop.gremlin.structure.Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class SubgraphTest extends AbstractGremlinProcessTest {
-    public abstract Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph);
-
-    public abstract Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
-    public void g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX() throws Exception {
-        final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
-        graphProvider.clear(config);
-        Graph subgraph = graphProvider.openTestGraph(config);
-        /////
-        Traversal<Vertex, Graph> traversal = get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(convertToVertexId("marko"), subgraph);
-        printTraversalForm(traversal);
-        subgraph = traversal.next();
-        assertVertexEdgeCounts(3, 2).accept(subgraph);
-        subgraph.edges().forEachRemaining(e -> {
-            assertEquals("knows", e.label());
-            assertEquals("marko", e.outVertex().values("name").next());
-            assertEquals(new Integer(29), e.outVertex().<Integer>values("age").next());
-            assertEquals("person", e.outVertex().label());
-
-            final String name = e.inVertex().<String>values("name").next();
-            if (name.equals("vadas"))
-                assertEquals(0.5d, e.value("weight"), 0.0001d);
-            else if (name.equals("josh"))
-                assertEquals(1.0d, e.value("weight"), 0.0001d);
-            else
-                fail("There's a vertex present that should not be in the subgraph");
-        });
-        graphProvider.clear(subgraph, config);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_ADD_VERTICES)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_ADD_EDGES)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = FEATURE_USER_SUPPLIED_IDS)
-    public void g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup() throws Exception {
-        final Configuration config = graphProvider.newGraphConfiguration("subgraph", this.getClass(), name.getMethodName());
-        graphProvider.clear(config);
-        final Graph subgraph = graphProvider.openTestGraph(config);
-        /////
-        Traversal<Vertex, String> traversal = get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(subgraph);
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
-        final Graph subGraph = traversal.asAdmin().getSideEffects().get("sg");
-        assertVertexEdgeCounts(5, 4).accept(subGraph);
-
-        graphProvider.clear(subgraph, config);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class Traversals extends SubgraphTest {
-
-        @Override
-        public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(final Object v1Id, final Graph subgraph) {
-            return g.V(v1Id).withSideEffect("sg", () -> subgraph).outE("knows").subgraph("sg").values("name").cap("sg");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(final Graph subgraph) {
-            return g.V().withSideEffect("sg", () -> subgraph).repeat(bothE("created").subgraph("sg").outV()).times(5).<String>values("name").dedup();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java
deleted file mode 100644
index 7f46632..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeTest.java
+++ /dev/null
@@ -1,139 +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.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.*;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class TreeTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX();
-
-    public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX();
-
-    public abstract Traversal<Vertex, Tree> get_g_V_out_out_tree();
-
-    public abstract Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX();
-
-    public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id);
-
-    @Test
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_out_tree_byXnameX() {
-        List<Traversal<Vertex, Tree>> traversals = Arrays.asList(
-                get_g_VX1X_out_out_tree_byXnameX(convertToVertexId("marko")),
-                get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(convertToVertexId("marko")));
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Tree tree = traversal.next();
-            assertFalse(traversal.hasNext());
-            assertEquals(1, tree.size());
-            assertTrue(tree.containsKey("marko"));
-            assertEquals(1, ((Map) tree.get("marko")).size());
-            assertTrue(((Map) tree.get("marko")).containsKey("josh"));
-            assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("lop"));
-            assertTrue(((Map) ((Map) tree.get("marko")).get("josh")).containsKey("ripple"));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_tree_byXidX() {
-        List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree_byXidX(), get_g_V_out_out_treeXaX_byXidX_capXaX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Tree tree = traversal.next();
-            assertFalse(traversal.hasNext());
-            assertEquals(1, tree.size());
-            assertTrue(tree.containsKey(convertToVertexId("marko")));
-            assertEquals(1, ((Map) tree.get(convertToVertexId("marko"))).size());
-            assertTrue(((Map) tree.get(convertToVertexId("marko"))).containsKey(convertToVertexId("josh")));
-            assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("lop")));
-            assertTrue(((Map) ((Map) tree.get(convertToVertexId("marko"))).get(convertToVertexId("josh"))).containsKey(convertToVertexId("ripple")));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_treeXaX_capXaX() {
-        List<Traversal<Vertex, Tree>> traversals = Arrays.asList(get_g_V_out_out_tree(), get_g_V_out_out_treeXaX_capXaX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Tree tree = traversal.next();
-            assertFalse(traversal.hasNext());
-            assertEquals(1, tree.size());
-            assertTrue(tree.containsKey(convertToVertex(graph, "marko")));
-            assertEquals(1, ((Map) tree.get(convertToVertex(graph, "marko"))).size());
-            assertTrue(((Map) tree.get(convertToVertex(graph, "marko"))).containsKey(convertToVertex(graph, "josh")));
-            assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "lop")));
-            assertTrue(((Map) ((Map) tree.get(convertToVertex(graph, "marko"))).get(convertToVertex(graph, "josh"))).containsKey(convertToVertex(graph, "ripple")));
-        });
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends TreeTest {
-        @Override
-        public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
-            return (Traversal) g.V(v1Id).out().out().tree().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
-            return g.V(v1Id).out().out().tree("a").by("name").both().both().cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
-            return (Traversal) g.V().out().out().tree().by(T.id);
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
-            return (Traversal) g.V().out().out().tree("a").by(T.id).cap("a");
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
-            return (Traversal) g.V().out().out().tree();
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
-            return (Traversal) g.V().out().out().tree("a").cap("a");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java
deleted file mode 100644
index f5bdefc..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/TraversalSideEffectsTest.java
+++ /dev/null
@@ -1,58 +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.util;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class TraversalSideEffectsTest extends AbstractGremlinProcessTest {
-    public abstract TraversalSideEffects get_g_V_asAdmin_getSideEffects();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_sideEffects() {
-        final TraversalSideEffects sideEffects = get_g_V_asAdmin_getSideEffects();
-        try {
-            assertFalse(sideEffects.get("a"));
-        } catch (IllegalArgumentException e) {
-            assertEquals(TraversalSideEffects.Exceptions.sideEffectDoesNotExist("a").getMessage(), e.getMessage());
-        }
-        assertEquals(StringFactory.traversalSideEffectsString(sideEffects), sideEffects.toString());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class Traversals extends TraversalSideEffectsTest {
-        @Override
-        public TraversalSideEffects get_g_V_asAdmin_getSideEffects() {
-            return g.V().asAdmin().getSideEffects();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java
deleted file mode 100644
index 4268ba6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategyTest.java
+++ /dev/null
@@ -1,131 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class TraversalVerificationStrategyTest extends AbstractGremlinProcessTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends TraversalVerificationStrategyTest {
-        @Test
-        @LoadGraphWith(MODERN)
-        public void shouldAllowNestedGlobalTraversalToHaveBarriers() {
-            try {
-                g.V().values("age").union(max(), min(), sum()).iterate();
-            } catch (IllegalStateException e) {
-                fail("Nested global traversals can have barrier steps on STANDARD:" + e.getMessage());
-            }
-        }
-
-        @Test
-        @LoadGraphWith(MODERN)
-        public void shouldAllowMidTraversalBarriersOnComputer() {
-            try {
-                g.V().count().sum().iterate();
-            } catch (IllegalStateException e) {
-                fail("Mid-traversal barrier steps are OK on STANDARD: " + e.getMessage());
-            }
-        }
-
-        @Test
-        @LoadGraphWith(MODERN)
-        public void shouldAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
-            try {
-                g.V().local(out().out()).iterate();
-            } catch (IllegalStateException e) {
-                fail("Local traversals leaving the star-graph are OK on STANDARD: " + e.getMessage());
-            }
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends TraversalVerificationStrategyTest {
-
-        @Test
-        @LoadGraphWith(MODERN)
-        public void shouldNotAllowNestedGlobalTraversalToHaveBarriers() {
-            try {
-                final GraphTraversal t = g.V().values("age").union(max(), min(), sum()).iterate();
-                fail("Nested global traversals should not be allowed to contain barriers (COMPUTER): " + t);
-            } catch (IllegalStateException e) {
-               assertTrue(true);
-            }
-        }
-
-        @Test
-        @LoadGraphWith(MODERN)
-        public void shouldNotAllowMidTraversalBarriersOnComputer() {
-            try {
-                final GraphTraversal t = g.V().count().sum().iterate();
-                fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
-            } catch (IllegalStateException e) {
-                assertTrue(true);
-            }
-
-            try {
-                final GraphTraversal t = g.V().count().sum().map(x -> x.get() * 19).iterate();
-                fail("Mid-traversal barrier steps are not allowed (COMPUTER): " + t);
-            } catch (IllegalStateException e) {
-                assertTrue(true);
-            }
-        }
-
-        @Test
-        @LoadGraphWith(MODERN)
-        public void shouldNotAllowLocalTraversalsToLeaveTheStarGraphOnComputer() {
-            try {
-                final GraphTraversal t = g.V().local(out().out()).iterate();
-                fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
-            } catch (IllegalStateException e) {
-                assertTrue(true);
-            }
-
-            try {
-                final GraphTraversal t = g.V().local(out().values("name")).iterate();
-                fail("Local traversals should not be allowed to leave the star-graph (COMPUTER): " + t);
-            } catch (IllegalStateException e) {
-                assertTrue(true);
-            }
-
-            try {
-                g.V().local(outE().values("weight")).iterate();
-                g.V().local(out().id()).iterate();
-                g.V().local(outE().inV()).iterate();
-            } catch (IllegalStateException e) {
-                fail("Local traversals on the star-graph are OK on COMPUTER: " + e.getMessage());
-            }
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
index 9e39071..16b1fc3 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java
@@ -22,11 +22,9 @@ import org.apache.tinkerpop.gremlin.ExceptionCoverage;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
@@ -41,7 +39,7 @@ import java.util.Random;
 import java.util.Set;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
 import static org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeatures.FEATURE_TRANSACTIONS;
 import static org.junit.Assert.*;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java
deleted file mode 100644
index 7218ff2..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalTest.java
+++ /dev/null
@@ -1,50 +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;
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.junit.Test;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversalTest {
-
-    @Test
-    public void shouldCloneTraversalCorrectly() throws CloneNotSupportedException {
-        final DefaultGraphTraversal<?, ?> original = new DefaultGraphTraversal<>(EmptyGraph.instance());
-        original.out().groupCount("m").values("name").count();
-        final DefaultTraversal<?, ?> clone = (DefaultTraversal) original.clone();
-        assertNotEquals(original.hashCode(), clone.hashCode());
-        assertEquals(original.getSteps().size(), clone.getSteps().size());
-
-        for (int i = 0; i < original.steps.size(); i++) {
-            assertNotEquals(original.getSteps().get(i), clone.getSteps().get(i));
-        }
-        assertNotEquals(original.sideEffects, clone.sideEffects);
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java
new file mode 100644
index 0000000..16bf2fe
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSideEffectsTest.java
@@ -0,0 +1,56 @@
+/*
+ * 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;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class TraversalSideEffectsTest extends AbstractGremlinProcessTest {
+    public abstract TraversalSideEffects get_g_V_asAdmin_getSideEffects();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_sideEffects() {
+        final TraversalSideEffects sideEffects = get_g_V_asAdmin_getSideEffects();
+        try {
+            assertFalse(sideEffects.get("a"));
+        } catch (IllegalArgumentException e) {
+            assertEquals(TraversalSideEffects.Exceptions.sideEffectDoesNotExist("a").getMessage(), e.getMessage());
+        }
+        assertEquals(StringFactory.traversalSideEffectsString(sideEffects), sideEffects.toString());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class Traversals extends TraversalSideEffectsTest {
+        @Override
+        public TraversalSideEffects get_g_V_asAdmin_getSideEffects() {
+            return g.V().asAdmin().getSideEffects();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java
new file mode 100644
index 0000000..4149fb5
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchTest.java
@@ -0,0 +1,82 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.label;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.values;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class BranchTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
+
+    public abstract Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+        Traversal<Vertex, Object> traversal = get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+        Traversal<Vertex, Object> traversal = get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends BranchTest {
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+            return g.V().branch(v -> v.get().label().equals("person") ? "a" : "b")
+                    .option("a", values("age"))
+                    .option("b", values("lang"))
+                    .option("b", values("name"));
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+            return g.V().branch(label().is("person").count())
+                    .option(1L, values("age"))
+                    .option(0L, values("lang"))
+                    .option(0L, values("name"));
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java
new file mode 100644
index 0000000..be5e192
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class ChooseTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+        final Traversal<Vertex, Object> traversal = get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
+        printTraversalForm(traversal);
+        Map<String, Long> counts = new HashMap<>();
+        int counter = 0;
+        while (traversal.hasNext()) {
+            MapHelper.incr(counts, traversal.next().toString(), 1l);
+            counter++;
+        }
+        assertFalse(traversal.hasNext());
+        assertEquals(2, counter);
+        assertEquals(2, counts.size());
+        assertEquals(Long.valueOf(1), counts.get("{name=[marko], age=[29]}"));
+        assertEquals(Long.valueOf(1), counts.get("josh"));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends ChooseTest {
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+            return g.V().choose(out().count())
+                    .option(2L, values("name"))
+                    .option(3L, valueMap());
+        }
+    }
+}
\ No newline at end of file


[32/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java
deleted file mode 100644
index 44ce828..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/AbstractTraversalStrategy.java
+++ /dev/null
@@ -1,43 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractTraversalStrategy implements TraversalStrategy {
-
-    @Override
-    public String toString() {
-        return StringFactory.traversalStrategyString(this);
-    }
-
-    @Override
-    public int hashCode() {
-        return this.getClass().hashCode();
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return this.getClass().equals(object.getClass());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
deleted file mode 100644
index 6ea93a8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ComparatorHolderRemovalStrategy.java
+++ /dev/null
@@ -1,54 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ComparatorHolderRemovalStrategy extends AbstractTraversalStrategy {
-
-    private static final ComparatorHolderRemovalStrategy INSTANCE = new ComparatorHolderRemovalStrategy();
-
-    private ComparatorHolderRemovalStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getEngine().isStandard())
-            return;
-
-        if (TraversalHelper.hasStepOfAssignableClass(ComparatorHolder.class, traversal)) {
-            final Step endStep = traversal.getEndStep();
-            TraversalHelper.getStepsOfAssignableClass(ComparatorHolder.class, traversal)
-                    .stream()
-                    .filter(step -> step != endStep)
-                    .forEach(step -> traversal.removeStep((Step)step));
-        }
-    }
-
-    public static ComparatorHolderRemovalStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java
deleted file mode 100644
index 8b10fb7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ConjunctionStrategy.java
+++ /dev/null
@@ -1,83 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ConjunctionStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ConjunctionStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
-    private static final ConjunctionStrategy INSTANCE = new ConjunctionStrategy();
-
-    private ConjunctionStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        processConjunctionMarker(AndStep.AndMarker.class, traversal);
-        processConjunctionMarker(OrStep.OrMarker.class, traversal);
-    }
-
-    private static final boolean legalCurrentStep(final Step<?, ?> step) {
-        return !(step instanceof EmptyStep || step instanceof OrStep.OrMarker || step instanceof AndStep.AndMarker || step instanceof StartStep);
-    }
-
-    private static final void processConjunctionMarker(final Class<? extends ConjunctionStep.ConjunctionMarker> markerClass, final Traversal.Admin<?, ?> traversal) {
-        TraversalHelper.getStepsOfClass(markerClass, traversal).forEach(markerStep -> {
-            Step<?, ?> currentStep = markerStep.getNextStep();
-            final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
-            while (legalCurrentStep(currentStep)) {
-                final Step<?, ?> nextStep = currentStep.getNextStep();
-                rightTraversal.addStep(currentStep);
-                traversal.removeStep(currentStep);
-                currentStep = nextStep;
-            }
-
-            currentStep = markerStep.getPreviousStep();
-            final Traversal.Admin<?, ?> leftTraversal = __.start().asAdmin();
-            while (legalCurrentStep(currentStep)) {
-                final Step<?, ?> previousStep = currentStep.getPreviousStep();
-                leftTraversal.addStep(0, currentStep);
-                traversal.removeStep(currentStep);
-                currentStep = previousStep;
-            }
-            TraversalHelper.replaceStep(markerStep,
-                    markerClass.equals(AndStep.AndMarker.class) ?
-                            new AndStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal) :
-                            new OrStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal),
-                    traversal);
-        });
-    }
-
-    public static ConjunctionStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.java
deleted file mode 100644
index 22935da..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/DedupOptimizerStrategy.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.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class DedupOptimizerStrategy extends AbstractTraversalStrategy {
-
-    private static final DedupOptimizerStrategy INSTANCE = new DedupOptimizerStrategy();
-
-    private DedupOptimizerStrategy() {
-    }
-
-    private static final List<Class<? extends Step>> BIJECTIVE_PIPES = Arrays.asList(IdentityStep.class, OrderGlobalStep.class);
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!TraversalHelper.hasStepOfClass(DedupGlobalStep.class, traversal))
-            return;
-
-        boolean done = false;
-        while (!done) {
-            done = true;
-            for (int i = 0; i < traversal.getSteps().size(); i++) {
-                final Step step1 = traversal.getSteps().get(i);
-                if (step1 instanceof DedupGlobalStep && !(((DedupGlobalStep) step1).getLocalChildren().get(0) instanceof IdentityTraversal)) {
-                    for (int j = i; j >= 0; j--) {
-                        final Step step2 = traversal.getSteps().get(j);
-                        if (BIJECTIVE_PIPES.stream().filter(c -> c.isAssignableFrom(step2.getClass())).findAny().isPresent()) {
-                            traversal.removeStep(step1);
-                            traversal.addStep(j, step1);
-                            done = false;
-                            break;
-                        }
-                    }
-                }
-                if (!done)
-                    break;
-            }
-        }
-    }
-
-    public static DedupOptimizerStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java
deleted file mode 100644
index ea51480..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/EngineDependentStrategy.java
+++ /dev/null
@@ -1,46 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EngineDependentStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
-    private static final EngineDependentStrategy INSTANCE = new EngineDependentStrategy();
-
-    private EngineDependentStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        traversal.getSteps().stream()
-                .filter(step -> step instanceof EngineDependent)
-                .forEach(step -> ((EngineDependent) step).onEngine(traversal.getEngine()));
-    }
-
-    public static EngineDependentStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java
deleted file mode 100644
index c81c1e5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/IdentityRemovalStrategy.java
+++ /dev/null
@@ -1,49 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class IdentityRemovalStrategy extends AbstractTraversalStrategy {
-
-    private static final IdentityRemovalStrategy INSTANCE = new IdentityRemovalStrategy();
-
-    private IdentityRemovalStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!TraversalHelper.hasStepOfClass(IdentityStep.class, traversal))
-            return;
-
-        TraversalHelper.getStepsOfClass(IdentityStep.class, traversal).stream()
-                .filter(step -> !step.getLabel().isPresent())
-                .forEach(traversal::removeStep);
-    }
-
-    public static IdentityRemovalStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java
deleted file mode 100644
index 3f091e8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/LabeledEndStepStrategy.java
+++ /dev/null
@@ -1,50 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.MarkerIdentityStep;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LabeledEndStepStrategy extends AbstractTraversalStrategy {
-
-    private static final LabeledEndStepStrategy INSTANCE = new LabeledEndStepStrategy();
-
-    private LabeledEndStepStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getEndStep().getLabel().isPresent())
-            traversal.addStep(new MarkerIdentityStep<>(traversal));
-    }
-
-    public static LabeledEndStepStrategy instance() {
-        return INSTANCE;
-    }
-
-    @Override
-    public String toString() {
-        return StringFactory.traversalStrategyString(this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java
deleted file mode 100644
index fa33567..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/MatchWhereStrategy.java
+++ /dev/null
@@ -1,90 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectOneStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.MatchStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MatchWhereStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
-    private static final MatchWhereStrategy INSTANCE = new MatchWhereStrategy();
-    private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
-
-    static {
-        PRIORS.add(IdentityRemovalStrategy.class);
-    }
-
-    private MatchWhereStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!TraversalHelper.hasStepOfClass(MatchStep.class, traversal))
-            return;
-
-        final List<MatchStep> matchSteps = TraversalHelper.getStepsOfClass(MatchStep.class, traversal);
-        for (final MatchStep matchStep : matchSteps) {
-            boolean foundWhereWithNoTraversal = false;
-            Step currentStep = matchStep.getNextStep();
-            while (currentStep instanceof WhereStep || currentStep instanceof SelectStep || currentStep instanceof SelectOneStep || currentStep instanceof IdentityStep) {
-                if (currentStep instanceof WhereStep) {
-                    if (!((WhereStep) currentStep).getLocalChildren().isEmpty()) {
-                        matchStep.addTraversal(((WhereStep<?>) currentStep).getLocalChildren().get(0));
-                        traversal.removeStep(currentStep);
-                    } else {
-                        foundWhereWithNoTraversal = true;
-                    }
-                } else if (currentStep instanceof SelectStep) {
-                    if (!((SelectStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
-                        break;
-                } else if (currentStep instanceof SelectOneStep) {
-                    if (!((SelectOneStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
-                        break;
-                }
-                // else is the identity step
-                currentStep = currentStep.getNextStep();
-            }
-        }
-    }
-
-    public static MatchWhereStrategy instance() {
-        return INSTANCE;
-    }
-
-    @Override
-    public Set<Class<? extends TraversalStrategy>> applyPrior() {
-        return PRIORS;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java
deleted file mode 100644
index 79c229b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/ProfileStrategy.java
+++ /dev/null
@@ -1,111 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class ProfileStrategy extends AbstractTraversalStrategy {
-
-
-    private static final ProfileStrategy INSTANCE = new ProfileStrategy();
-    private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
-
-    static {
-        // Ensure that this strategy is applied last.
-        PRIORS.add(ComparatorHolderRemovalStrategy.class);
-        PRIORS.add(ConjunctionStrategy.class);
-        PRIORS.add(DedupOptimizerStrategy.class);
-        PRIORS.add(EngineDependentStrategy.class);
-        PRIORS.add(IdentityRemovalStrategy.class);
-        PRIORS.add(LabeledEndStepStrategy.class);
-        PRIORS.add(MatchWhereStrategy.class);
-        PRIORS.add(RangeByIsCountStrategy.class);
-    }
-
-    private ProfileStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!(traversal.getParent() instanceof EmptyStep)) {
-            // This strategy is applied to the top-level traversal only
-            return;
-        }
-
-        if (!TraversalHelper.hasStepOfClass(ProfileStep.class, traversal)) {
-            // No ProfileStep present
-            return;
-        }
-
-        prepTraversalForProfiling(traversal);
-    }
-
-    // Walk the traversal steps and inject the .profile()-steps.
-    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal) {
-        // Remove user-specified .profile() steps
-        final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
-        for (ProfileStep step : profileSteps) {
-            traversal.removeStep(step);
-        }
-
-        // Add .profile() step after every pre-existing step.
-        final List<Step> steps = traversal.getSteps();
-        final int numSteps = steps.size();
-        for (int ii = 0; ii < numSteps; ii++) {
-            // Get the original step
-            Step step = steps.get(ii * 2);
-
-            // Create and inject ProfileStep
-            ProfileStep profileStep = new ProfileStep(traversal);
-            traversal.addStep((ii * 2) + 1, profileStep);
-
-            // Handle nested traversal
-            if (step instanceof TraversalParent) {
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
-                    prepTraversalForProfiling(t);
-                }
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
-                    prepTraversalForProfiling(t);
-                }
-            }
-        }
-    }
-
-    @Override
-    public Set<Class<? extends TraversalStrategy>> applyPrior() {
-        return PRIORS;
-    }
-
-    public static ProfileStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
deleted file mode 100644
index 28832e6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/RangeByIsCountStrategy.java
+++ /dev/null
@@ -1,90 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-
-import java.util.*;
-import java.util.function.BiPredicate;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public final class RangeByIsCountStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
-
-    private static final Map<BiPredicate, Long> RANGE_PREDICATES = new HashMap<BiPredicate, Long>() {{
-        put(Compare.inside, 0L);
-        put(Compare.outside, 1L);
-        put(Contains.within, 1L);
-        put(Contains.without, 0L);
-    }};
-    private static final Set<Compare> INCREASED_OFFSET_SCALAR_PREDICATES =
-            EnumSet.of(Compare.eq, Compare.neq, Compare.lte, Compare.gt);
-
-    private static final RangeByIsCountStrategy INSTANCE = new RangeByIsCountStrategy();
-
-    private RangeByIsCountStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        final int size = traversal.getSteps().size();
-        Step prev = null;
-        for (int i = 0; i < size; i++) {
-            final Step curr = traversal.getSteps().get(i);
-            if (curr instanceof CountGlobalStep && i < size - 1) {
-                final Step next = traversal.getSteps().get(i + 1);
-                if (next instanceof IsStep && !(prev instanceof RangeGlobalStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
-                    final IsStep isStep = (IsStep) next;
-                    final Object value = isStep.getValue();
-                    final BiPredicate predicate = isStep.getPredicate();
-                    if (value instanceof Number) {
-                        final long highRangeOffset = INCREASED_OFFSET_SCALAR_PREDICATES.contains(predicate) ? 1L : 0L;
-                        final long highRange = ((Number) value).longValue() + highRangeOffset;
-                        TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
-                        i++;
-                    } else {
-                        final Long highRangeOffset = RANGE_PREDICATES.get(predicate);
-                        if (value instanceof Collection && highRangeOffset != null) {
-                            final Object high = Collections.max((Collection) value);
-                            if (high instanceof Number) {
-                                final long highRange = ((Number) high).longValue() + highRangeOffset;
-                                TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
-                                i++;
-                            }
-                        }
-                    }
-                }
-            }
-            prev = curr;
-        }
-    }
-
-    public static RangeByIsCountStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java
deleted file mode 100644
index 03c2507..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TimeLimitedStrategy.java
+++ /dev/null
@@ -1,48 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.TimeLimitStep;
-
-/**
- * A {@link org.apache.tinkerpop.gremlin.process.TraversalStrategy} that prevents a traversal from running beyond
- * a pre-configured time.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class TimeLimitedStrategy extends AbstractTraversalStrategy {
-    private final long timeLimit;
-
-    public TimeLimitedStrategy(final long timeLimit) {
-        this.timeLimit = timeLimit;
-    }
-
-    public long getTimeLimit() {
-        return timeLimit;
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getEndStep().getClass().equals(TimeLimitStep.class))
-            return;
-
-        traversal.addStep(new TimeLimitStep<>(traversal, timeLimit));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
deleted file mode 100644
index 3aeb166..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/strategy/TraversalVerificationStrategy.java
+++ /dev/null
@@ -1,71 +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.strategy;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ComputerAwareStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.SupplyingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TraversalVerificationStrategy extends AbstractTraversalStrategy {
-
-    private static final TraversalVerificationStrategy INSTANCE = new TraversalVerificationStrategy();
-
-    private TraversalVerificationStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getEngine().isStandard())
-            return;
-
-        Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
-                ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
-                traversal.getEndStep();
-        if (endStep instanceof ComputerResultStep)        // TODO: this is not needed anymore (delete when you prove it)
-            endStep = endStep.getPreviousStep();
-
-        for (final Step<?, ?> step : traversal.getSteps()) {
-            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep))) {
-                throw new IllegalStateException("Global traversals on GraphComputer may not contain mid-traversal barriers: " + step);
-            }
-            if (step instanceof TraversalParent) {
-                final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()
-                        .filter(t -> !TraversalHelper.isLocalStarGraph(t.asAdmin()))
-                        .findAny();
-                if (traversalOptional.isPresent())
-                    throw new IllegalStateException("Local traversals on GraphComputer may not traverse past the local star-graph: " + traversalOptional.get());
-            }
-        }
-    }
-
-    public static TraversalVerificationStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
deleted file mode 100644
index c959922..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/util/EmptyGraphTraversal.java
+++ /dev/null
@@ -1,66 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyGraphTraversal<S, E> extends EmptyTraversal<S, E> implements GraphTraversal.Admin<S, E>, GraphTraversal<S, E> {
-
-    private static final EmptyGraphTraversal INSTANCE = new EmptyGraphTraversal<>();
-
-    public static <A, B> EmptyGraphTraversal<A, B> instance() {
-        return INSTANCE;
-    }
-
-    private EmptyGraphTraversal() {
-
-    }
-
-    @Override
-    public GraphTraversal.Admin<S, E> asAdmin() {
-        return this;
-    }
-
-    @Override
-    public <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
-        return instance();
-    }
-
-    @Override
-    public GraphTraversal<S, E> withPath() {
-        return instance();
-    }
-
-    @Override
-    public GraphTraversal<S, E> iterate() {
-        return this;
-    }
-
-    @Override
-    @SuppressWarnings("CloneDoesntCallSuperClone")
-    public EmptyGraphTraversal<S, E> clone() {
-        return instance();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java
deleted file mode 100644
index 1edf474..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/HasContainer.java
+++ /dev/null
@@ -1,113 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-
-import java.io.Serializable;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiPredicate;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class HasContainer implements Serializable {
-
-    public String key;
-    public BiPredicate predicate;
-    public Object value;
-
-    public HasContainer(final String key, final BiPredicate predicate, final Object value) {
-        this.key = key;
-        this.predicate = predicate;
-        this.value = value;
-        if (null == this.value && !(this.predicate instanceof Contains)) {
-            throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate");
-        }
-    }
-
-    public HasContainer(final String key, final Contains contains) {
-        this(key, contains, null);
-    }
-
-    public HasContainer(final T accessor, final BiPredicate predicate, final Object value) {
-        this(accessor.getAccessor(), predicate, value);
-    }
-
-    public HasContainer(final T accessor, final Contains contains) {
-        this(accessor.getAccessor(), contains, null);
-    }
-
-    public boolean test(final Element element) {
-        if (null != this.value) {
-            if (this.key.equals(T.id.getAccessor()))
-                return this.predicate.test(element.id(), this.value);
-            else if (this.key.equals(T.label.getAccessor()))
-                return this.predicate.test(element.label(), this.value);
-            else if (element instanceof VertexProperty && this.key.equals(T.value.getAccessor()))
-                return this.predicate.test(((VertexProperty) element).value(), this.value);
-            else if (element instanceof VertexProperty && this.key.equals(T.key.getAccessor()))
-                return this.predicate.test(((VertexProperty) element).key(), this.value);
-            else {
-                if (element instanceof Vertex) {
-                    final Iterator<? extends Property> itty = element.properties(this.key);
-                    while (itty.hasNext()) {
-                        if (this.predicate.test(itty.next().value(), this.value))
-                            return true;
-                    }
-                    return false;
-                } else {
-                    final Property property = element.property(this.key);
-                    return property.isPresent() && this.predicate.test(property.value(), this.value);
-                }
-            }
-        } else {
-            return Contains.within.equals(this.predicate) ?
-                    element.property(this.key).isPresent() :
-                    !element.property(this.key).isPresent();
-        }
-    }
-
-    public static boolean testAll(final Element element, final List<HasContainer> hasContainers) {
-        if (hasContainers.size() == 0)
-            return true;
-        else {
-            for (final HasContainer hasContainer : hasContainers) {
-                if (!hasContainer.test(element))
-                    return false;
-            }
-            return true;
-        }
-    }
-
-    // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
-    public String toString() {
-        return this.value == null ?
-                (this.predicate == Contains.within ?
-                        '[' + this.key + ']' :
-                        "[!" + this.key + ']') :
-                '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java
deleted file mode 100644
index bfb225a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/util/Tree.java
+++ /dev/null
@@ -1,134 +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.util;
-
-import java.io.Serializable;
-import java.util.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class Tree<T> extends HashMap<T, Tree<T>> implements Serializable {
-
-    public Tree() {
-        super();
-    }
-
-    @SafeVarargs
-    public Tree(final T... children) {
-        this();
-        for (final T t : children) {
-            this.put(t, new Tree<>());
-        }
-    }
-
-    @SafeVarargs
-    public Tree(final Map.Entry<T, Tree<T>>... children) {
-        this();
-        for (final Map.Entry<T, Tree<T>> entry : children) {
-            this.put(entry.getKey(), entry.getValue());
-        }
-    }
-
-
-    public List<Tree<T>> getTreesAtDepth(final int depth) {
-        List<Tree<T>> currentDepth = Collections.singletonList(this);
-        for (int i = 0; i < depth; i++) {
-            if (i == depth - 1) {
-                return currentDepth;
-            } else {
-                final List<Tree<T>> temp = new ArrayList<Tree<T>>();
-                for (final Tree<T> t : currentDepth) {
-                    temp.addAll(t.values());
-                }
-                currentDepth = temp;
-            }
-        }
-        return Collections.emptyList();
-    }
-
-    public List<T> getObjectsAtDepth(final int depth) {
-        final List<T> list = new ArrayList<T>();
-        for (final Tree<T> t : this.getTreesAtDepth(depth)) {
-            list.addAll(t.keySet());
-        }
-        return list;
-    }
-
-    public List<Tree<T>> getLeafTrees() {
-        final List<Tree<T>> leaves = new ArrayList<>();
-        List<Tree<T>> currentDepth = Collections.singletonList(this);
-        boolean allLeaves = false;
-        while (!allLeaves) {
-            allLeaves = true;
-            final List<Tree<T>> temp = new ArrayList<>();
-            for (final Tree<T> t : currentDepth) {
-                if (t.isLeaf()) {
-                    for (Map.Entry<T, Tree<T>> t2 : t.entrySet()) {
-                        leaves.add(new Tree<T>(t2));
-                    }
-                } else {
-                    allLeaves = false;
-                    temp.addAll(t.values());
-                }
-            }
-            currentDepth = temp;
-
-        }
-        return leaves;
-    }
-
-    public List<T> getLeafObjects() {
-        final List<T> leaves = new ArrayList<T>();
-        for (final Tree<T> t : this.getLeafTrees()) {
-            leaves.addAll(t.keySet());
-        }
-        return leaves;
-    }
-
-    public boolean isLeaf() {
-        final Collection<Tree<T>> values = this.values();
-        return values.iterator().next().isEmpty();
-
-    }
-
-    public void addTree(final Tree<T> tree) {
-        tree.forEach((k, t) -> {
-            if (this.containsKey(k)) {
-                this.get(k).addTree(t);
-            } else {
-                this.put(k, t);
-            }
-        });
-    }
-
-    public List<Tree<T>> splitParents() {
-        if (this.keySet().size() == 1) {
-            return Collections.singletonList(this);
-        } else {
-            final List<Tree<T>> parents = new ArrayList<>();
-            this.forEach((k, t) -> {
-                final Tree<T> parentTree = new Tree<>();
-                parentTree.put(k, t);
-                parents.add(parentTree);
-            });
-            return parents;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
deleted file mode 100644
index a8aa67b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversal.java
+++ /dev/null
@@ -1,257 +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;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
-
-    private E lastEnd = null;
-    private long lastEndCount = 0l;
-    private Step<?, E> finalEndStep = EmptyStep.instance();
-    private final StepPosition stepPosition = new StepPosition();
-
-    protected final transient Graph graph;
-
-    protected List<Step> steps = new ArrayList<>();
-    protected TraversalSideEffects sideEffects = new DefaultTraversalSideEffects();
-    protected TraversalStrategies strategies;
-    protected TraversalEngine traversalEngine;
-
-    protected boolean locked = false;
-
-    protected TraversalParent traversalParent = (TraversalParent) EmptyStep.instance();
-
-    public DefaultTraversal(final Graph graph) {
-        this.graph = graph;
-        this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass()));
-        this.traversalEngine = StandardTraversalEngine.instance(); // TODO: remove and then clean up v.outE
-    }
-
-    @Override
-    public Traversal.Admin<S, E> asAdmin() {
-        return this;
-    }
-
-    @Override
-    public void applyStrategies() throws IllegalStateException {
-        if (this.locked) throw Traversal.Exceptions.traversalIsLocked();
-        TraversalHelper.reIdSteps(this.stepPosition, this);
-        this.strategies.applyStrategies(this);
-        for (final Step<?, ?> step : this.getSteps()) {
-            if (step instanceof TraversalParent) {
-                for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
-                    globalChild.setStrategies(this.strategies);
-                    globalChild.setEngine(this.traversalEngine);
-                    globalChild.applyStrategies();
-                }
-                for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
-                    localChild.setStrategies(this.strategies);
-                    localChild.setEngine(StandardTraversalEngine.instance());
-                    localChild.applyStrategies();
-                }
-            }
-        }
-        this.traversalEngine.processTraversal(this);
-        this.finalEndStep = this.getEndStep();
-        this.locked = true;
-    }
-
-    @Override
-    public TraversalEngine getEngine() {
-        return this.traversalEngine;
-    }
-
-    @Override
-    public void setEngine(final TraversalEngine engine) {
-        this.traversalEngine = engine;
-    }
-
-    @Override
-    public List<Step> getSteps() {
-        return Collections.unmodifiableList(this.steps);
-    }
-
-    @Override
-    public boolean hasNext() {
-        if (!this.locked) this.applyStrategies();
-        return this.lastEndCount > 0l || this.finalEndStep.hasNext();
-    }
-
-    @Override
-    public E next() {
-        if (!this.locked) this.applyStrategies();
-        if (this.lastEndCount > 0l) {
-            this.lastEndCount--;
-            return this.lastEnd;
-        } else {
-            final Traverser<E> next = this.finalEndStep.next();
-            final long nextBulk = next.bulk();
-            if (nextBulk == 1) {
-                return next.get();
-            } else {
-                this.lastEndCount = nextBulk - 1;
-                this.lastEnd = next.get();
-                return this.lastEnd;
-            }
-        }
-    }
-
-    @Override
-    public void reset() {
-        this.steps.forEach(Step::reset);
-        this.lastEndCount = 0l;
-    }
-
-    @Override
-    public void addStart(final Traverser<S> start) {
-        if (!this.locked) this.applyStrategies();
-        if (!this.steps.isEmpty()) this.steps.get(0).addStart(start);
-    }
-
-    @Override
-    public void addStarts(final Iterator<Traverser<S>> starts) {
-        if (!this.locked) this.applyStrategies();
-        if (!this.steps.isEmpty()) this.steps.get(0).addStarts(starts);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeTraversalString(this);
-    }
-
-    @Override
-    public Step<S, ?> getStartStep() {
-        return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(0);
-    }
-
-    @Override
-    public Step<?, E> getEndStep() {
-        return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(this.steps.size() - 1);
-    }
-
-    @Override
-    public DefaultTraversal<S, E> clone() {
-        try {
-            final DefaultTraversal<S, E> clone = (DefaultTraversal<S, E>) super.clone();
-            clone.steps = new ArrayList<>();
-            clone.sideEffects = this.sideEffects.clone();
-            clone.strategies = this.strategies.clone(); // TODO: does this need to be cloned?
-            clone.lastEnd = null;
-            clone.lastEndCount = 0l;
-            for (final Step<?, ?> step : this.steps) {
-                final Step<?, ?> clonedStep = step.clone();
-                clonedStep.setTraversal(clone);
-                final Step previousStep = clone.steps.isEmpty() ? EmptyStep.instance() : clone.steps.get(clone.steps.size() - 1);
-                clonedStep.setPreviousStep(previousStep);
-                previousStep.setNextStep(clonedStep);
-                clone.steps.add(clonedStep);
-            }
-            clone.finalEndStep = clone.getEndStep();
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public boolean isLocked() {
-        return this.locked;
-    }
-
-    @Override
-    public void setSideEffects(final TraversalSideEffects sideEffects) {
-        this.sideEffects = sideEffects;
-    }
-
-    @Override
-    public TraversalSideEffects getSideEffects() {
-        return this.sideEffects;
-    }
-
-    @Override
-    public void setStrategies(final TraversalStrategies strategies) {
-        this.strategies = strategies.clone();
-    }
-
-    @Override
-    public TraversalStrategies getStrategies() {
-        return this.strategies;
-    }
-
-    @Override
-    public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException {
-        if (this.locked) throw Exceptions.traversalIsLocked();
-        step.setId(this.stepPosition.nextXId());
-        this.steps.add(index, step);
-        final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
-        final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
-        step.setPreviousStep(null != previousStep ? previousStep : EmptyStep.instance());
-        step.setNextStep(null != nextStep ? nextStep : EmptyStep.instance());
-        if (null != previousStep) previousStep.setNextStep(step);
-        if (null != nextStep) nextStep.setPreviousStep(step);
-        return (Traversal.Admin<S2, E2>) this;
-    }
-
-    @Override
-    public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException {
-        if (this.locked) throw Exceptions.traversalIsLocked();
-        final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
-        final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
-        this.steps.remove(index);
-        if (null != previousStep) previousStep.setNextStep(null == nextStep ? EmptyStep.instance() : nextStep);
-        if (null != nextStep) nextStep.setPreviousStep(null == previousStep ? EmptyStep.instance() : previousStep);
-        return (Traversal.Admin<S2, E2>) this;
-    }
-
-    @Override
-    public void setParent(final TraversalParent step) {
-        this.traversalParent = step;
-    }
-
-    @Override
-    public TraversalParent getParent() {
-        return this.traversalParent;
-    }
-
-    @Override
-    public Optional<Graph> getGraph() {
-        return Optional.ofNullable(this.graph);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java
deleted file mode 100644
index c46ce06..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalSideEffects.java
+++ /dev/null
@@ -1,203 +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;
-
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.traversal.util.SideEffectHelper;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Supplier;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversalSideEffects implements TraversalSideEffects {
-
-    protected Map<String, Object> objectMap = new HashMap<>();
-    protected Map<String, Supplier> supplierMap = new HashMap<>();
-    protected UnaryOperator sackSplitOperator = null;
-    protected Supplier sackInitialValue = null;
-
-    public DefaultTraversalSideEffects() {
-
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void registerSupplier(final String key, final Supplier supplier) {
-        this.supplierMap.put(key, supplier);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key) {
-        return Optional.ofNullable(this.supplierMap.get(key));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void registerSupplierIfAbsent(final String key, final Supplier supplier) {
-        if (!this.supplierMap.containsKey(key))
-            this.supplierMap.put(key, supplier);
-    }
-
-    @Override
-    public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator) {
-        this.sackInitialValue = initialValue;
-        this.sackSplitOperator = splitOperator.orElse(null);
-    }
-
-    @Override
-    public <S> Optional<Supplier<S>> getSackInitialValue() {
-        return Optional.ofNullable(this.sackInitialValue);
-    }
-
-    @Override
-    public <S> Optional<UnaryOperator<S>> getSackSplitOperator() {
-        return Optional.ofNullable(this.sackSplitOperator);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean exists(final String key) {
-        return this.objectMap.containsKey(key) || this.supplierMap.containsKey(key);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void set(final String key, final Object value) {
-        SideEffectHelper.validateSideEffect(key, value);
-        this.objectMap.put(key, value);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public <V> V get(final String key) throws IllegalArgumentException {
-        final V value = (V) this.objectMap.get(key);
-        if (null != value)
-            return value;
-        else {
-            if (this.supplierMap.containsKey(key)) {
-                final V v = (V) this.supplierMap.get(key).get();
-                this.objectMap.put(key, v);
-                return v;
-            } else {
-                throw TraversalSideEffects.Exceptions.sideEffectDoesNotExist(key);
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
-        if (this.objectMap.containsKey(key))
-            return (V) this.objectMap.get(key);
-        else if (this.supplierMap.containsKey(key)) {
-            final V value = (V) this.supplierMap.get(key).get();
-            this.objectMap.put(key, value);
-            return value;
-        } else {
-            final V value = orCreate.get();
-            this.objectMap.put(key, value);
-            return value;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void remove(final String key) {
-        this.objectMap.remove(key);
-        this.supplierMap.remove(key);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<String> keys() {
-        final Set<String> keys = new HashSet<>();
-        keys.addAll(this.objectMap.keySet());
-        keys.addAll(this.supplierMap.keySet());
-        return Collections.unmodifiableSet(keys);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setLocalVertex(final Vertex vertex) {
-        final Property<Map<String, Object>> property = vertex.property(SIDE_EFFECTS);
-        if (property.isPresent()) {
-            this.objectMap = property.value();
-        } else {
-            this.objectMap = new HashMap<>();
-            vertex.property(SIDE_EFFECTS, this.objectMap);
-        }
-    }
-
-    @Override
-    public void mergeInto(final TraversalSideEffects sideEffects) {
-        this.objectMap.forEach(sideEffects::set);
-        this.supplierMap.forEach(sideEffects::registerSupplierIfAbsent);
-        // TODO: add sack information?
-    }
-
-    @Override
-    public String toString() {
-        return StringFactory.traversalSideEffectsString(this);
-    }
-
-    @Override
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public DefaultTraversalSideEffects clone() {
-        try {
-            final DefaultTraversalSideEffects sideEffects = (DefaultTraversalSideEffects) super.clone();
-            sideEffects.objectMap = new HashMap<>(this.objectMap);
-            sideEffects.supplierMap = new HashMap<>(this.supplierMap);
-            return sideEffects;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java
deleted file mode 100644
index b736265..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/DefaultTraversalStrategies.java
+++ /dev/null
@@ -1,105 +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;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.process.traverser.util.DefaultTraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraversalStrategies implements TraversalStrategies {
-
-    protected List<TraversalStrategy> traversalStrategies = new ArrayList<>();
-    protected TraverserGeneratorFactory traverserGeneratorFactory = DefaultTraverserGeneratorFactory.instance();
-
-    @Override
-    public TraversalStrategies addStrategies(final TraversalStrategy... strategies) {
-        boolean added = false;
-        for (final TraversalStrategy strategy : strategies) {
-            if (!this.traversalStrategies.contains(strategy)) {
-                this.traversalStrategies.add(strategy);
-                added = true;
-            }
-        }
-        if (added) TraversalStrategies.sortStrategies(this.traversalStrategies);
-        return this;
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses) {
-        boolean removed = false;
-        for (final Class<? extends TraversalStrategy> strategyClass : strategyClasses) {
-            final Optional<TraversalStrategy> strategy = this.traversalStrategies.stream().filter(s -> s.getClass().equals(strategyClass)).findAny();
-            if (strategy.isPresent()) {
-                this.traversalStrategies.remove(strategy.get());
-                removed = true;
-            }
-        }
-        if (removed) TraversalStrategies.sortStrategies(this.traversalStrategies);
-        return this;
-    }
-
-    @Override
-    public List<TraversalStrategy> toList() {
-        return Collections.unmodifiableList(this.traversalStrategies);
-    }
-
-    @Override
-    public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
-        this.traversalStrategies.forEach(traversalStrategy -> traversalStrategy.apply(traversal));
-    }
-
-    @Override
-    public TraverserGeneratorFactory getTraverserGeneratorFactory() {
-        return this.traverserGeneratorFactory;
-    }
-
-    @Override
-    public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory) {
-        this.traverserGeneratorFactory = traverserGeneratorFactory;
-    }
-
-    @Override
-    public DefaultTraversalStrategies clone() {
-        try {
-            final DefaultTraversalStrategies clone = (DefaultTraversalStrategies) super.clone();
-            clone.traversalStrategies = new ArrayList<>();
-            clone.traversalStrategies.addAll(this.traversalStrategies);
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public String toString() {
-        return StringFactory.traversalStrategiesString(this);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.java
new file mode 100644
index 0000000..1a9eae6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/FastNoSuchElementException.java
@@ -0,0 +1,46 @@
+/*
+ * 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;
+
+import java.util.NoSuchElementException;
+
+/**
+ * Retrieve a singleton, fast {@link java.util.NoSuchElementException} without a stack trace.
+ */
+public final class FastNoSuchElementException extends NoSuchElementException {
+
+    private static final long serialVersionUID = 2303108654138257697L;
+    private static final FastNoSuchElementException INSTANCE = new FastNoSuchElementException();
+
+    private FastNoSuchElementException() {
+    }
+
+    /**
+     * Retrieve a singleton, fast {@link NoSuchElementException} without a stack trace.
+     */
+    public static NoSuchElementException instance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public synchronized Throwable fillInStackTrace() {
+        return this;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
new file mode 100644
index 0000000..8fce9d0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Path.java
@@ -0,0 +1,180 @@
+/*
+ * 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;
+
+import org.javatuples.Pair;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.stream.IntStream;
+import java.util.stream.Stream;
+
+/**
+ * A Path denotes a particular walk through a {@link org.apache.tinkerpop.gremlin.structure.Graph} as defined by a {@link Traverser}.
+ * In abstraction, any Path implementation maintains two lists: a list of sets of labels and a list of objects.
+ * The list of labels are the labels of the steps traversed.
+ * The list of objects are the objects traversed.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Path extends Cloneable {
+
+    /**
+     * Get the number of step in the path.
+     *
+     * @return the size of the path
+     */
+    public default int size() {
+        return this.objects().size();
+    }
+
+    /**
+     * Add a new step to the path with an object and any number of associated labels.
+     *
+     * @param object the new head of the path
+     * @param labels the labels at the head of the path
+     * @return the extended path
+     */
+    public Path extend(final Object object, final String... labels);
+
+    /**
+     * Get the object associated with the particular label of the path.
+     * If the path as multiple labels of the type, then return a {@link List} of those objects.
+     *
+     * @param label the label of the path
+     * @param <A>   the type of the object associated with the label
+     * @return the object associated with the label of the path
+     * @throws IllegalArgumentException if the path does not contain the label
+     */
+    public default <A> A get(final String label) throws IllegalArgumentException {
+        final List<Object> objects = this.objects();
+        final List<Set<String>> labels = this.labels();
+        Object object = null;
+        for (int i = 0; i < labels.size(); i++) {
+            if (labels.get(i).contains(label)) {
+                if (null == object) {
+                    object = objects.get(i);
+                } else if (object instanceof List) {
+                    ((List) object).add(objects.get(i));
+                } else {
+                    final List list = new ArrayList(2);
+                    list.add(object);
+                    list.add(objects.get(i));
+                    object = list;
+                }
+            }
+        }
+        if (null == object)
+            throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+        return (A) object;
+    }
+
+    /**
+     * Get the object associated with the specified index into the path.
+     *
+     * @param index the index of the path
+     * @param <A>   the type of the object associated with the index
+     * @return the object associated with the index of the path
+     */
+    public default <A> A get(final int index) {
+        return (A) this.objects().get(index);
+    }
+
+    /**
+     * Return true if the path has the specified label, else return false.
+     *
+     * @param label the label to search for
+     * @return true if the label exists in the path
+     */
+    public default boolean hasLabel(final String label) {
+        return this.labels().stream().filter(labels -> labels.contains(label)).findAny().isPresent();
+    }
+
+    /**
+     * Add label to the current head of the path.
+     *
+     * @param label the label to add to the head of the path
+     */
+    public void addLabel(final String label);
+
+    /**
+     * An ordered list of the objects in the path.
+     *
+     * @return the objects of the path
+     */
+    public List<Object> objects();
+
+    /**
+     * An ordered list of the labels associated with the path
+     *
+     * @return the labels of the path
+     */
+    public List<Set<String>> labels();
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public Path clone();
+
+    /**
+     * Determines whether the path is a simple or not.
+     * A simple path has no cycles and thus, no repeated objects.
+     *
+     * @return Whether the path is simple or not
+     */
+    public default boolean isSimple() {
+        final List<Object> objects = this.objects();
+        for (int i = 0; i < objects.size() - 1; i++) {
+            for (int j = i + 1; j < objects.size(); j++) {
+                if (objects.get(i).equals(objects.get(j)))
+                    return false;
+            }
+        }
+        return true;
+    }
+
+    public default void forEach(final Consumer<Object> consumer) {
+        this.objects().forEach(consumer);
+    }
+
+    public default void forEach(final BiConsumer<Object, Set<String>> consumer) {
+        final List<Object> objects = this.objects();
+        final List<Set<String>> labels = this.labels();
+        for (int i = 0; i < objects.size(); i++) {
+            consumer.accept(objects.get(i), labels.get(i));
+        }
+    }
+
+    public default Stream<Pair<Object, Set<String>>> stream() {
+        final List<Set<String>> labels = this.labels();
+        final List<Object> objects = this.objects();
+        return IntStream.range(0, this.size()).mapToObj(i -> Pair.with(objects.get(i), labels.get(i)));
+    }
+
+    public static class Exceptions {
+
+        public static IllegalArgumentException stepWithProvidedLabelDoesNotExist(final String label) {
+            return new IllegalArgumentException("The step with label " + label + "  does not exist");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java
new file mode 100644
index 0000000..e2965e0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Scope.java
@@ -0,0 +1,27 @@
+/*
+ * 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;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum Scope {
+
+    global, local
+}


[21/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java
deleted file mode 100644
index ee601a7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_Traverser.java
+++ /dev/null
@@ -1,87 +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.traverser;
-
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.util.AbstractPathTraverser;
-import org.apache.tinkerpop.gremlin.process.util.path.SparsePath;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Map;
-import java.util.Optional;
-import java.util.WeakHashMap;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
-
-    protected B_O_PA_S_SE_SL_Traverser() {
-    }
-
-    public B_O_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
-        super(t, step);
-        final Optional<String> stepLabel = step.getLabel();
-        this.path = stepLabel.isPresent() ?
-                getOrCreateFromCache(this.sideEffects).extend(t, stepLabel.get()) :
-                getOrCreateFromCache(this.sideEffects).extend(t);
-    }
-
-    @Override
-    public int hashCode() {
-        return this.t.hashCode() + this.future.hashCode() + this.loops;
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return object instanceof B_O_PA_S_SE_SL_Traverser
-                && ((B_O_PA_S_SE_SL_Traverser) object).get().equals(this.t)
-                && ((B_O_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
-                && ((B_O_PA_S_SE_SL_Traverser) object).loops() == this.loops()
-                && (null == this.sack);
-    }
-
-    @Override
-    public Traverser.Admin<T> attach(final Vertex vertex) {
-        super.attach(vertex);
-        final Path newSparsePath = getOrCreateFromCache(this.sideEffects);
-        this.path.forEach((object, labels) -> newSparsePath.extend(object, labels.toArray(new String[labels.size()])));
-        this.path = newSparsePath;
-        return this;
-    }
-
-    //////////////////////
-
-    private static final Map<TraversalSideEffects, SparsePath> PATH_CACHE = new WeakHashMap<>();
-
-    private static SparsePath getOrCreateFromCache(final TraversalSideEffects sideEffects) {
-        SparsePath path = PATH_CACHE.get(sideEffects);
-        if (null == path) {
-            path = SparsePath.make();
-            PATH_CACHE.put(sideEffects, path);
-        }
-        return path;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
deleted file mode 100644
index 4a2d8e1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
+++ /dev/null
@@ -1,62 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
-
-    private static final B_O_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_PA_S_SE_SL_TraverserGenerator();
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
-            TraverserRequirement.BULK,
-            TraverserRequirement.SINGLE_LOOP,
-            TraverserRequirement.PATH_ACCESS,
-            TraverserRequirement.SACK,
-            TraverserRequirement.SIDE_EFFECTS);
-
-
-    private B_O_PA_S_SE_SL_TraverserGenerator() {
-    }
-
-    @Override
-    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
-        final B_O_PA_S_SE_SL_Traverser<S> traverser = new B_O_PA_S_SE_SL_Traverser<>(start, startStep);
-        traverser.setBulk(initialBulk);
-        return traverser;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getProvidedRequirements() {
-        return REQUIREMENTS;
-    }
-
-    public static B_O_PA_S_SE_SL_TraverserGenerator instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java
deleted file mode 100644
index 4ea4a2f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_Traverser.java
+++ /dev/null
@@ -1,58 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.traverser.util.AbstractPathTraverser;
-import org.apache.tinkerpop.gremlin.process.util.path.ImmutablePath;
-
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_P_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
-
-    protected B_O_P_PA_S_SE_SL_Traverser() {
-    }
-
-    public B_O_P_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
-        super(t, step);
-        final Optional<String> stepLabel = step.getLabel();
-        this.path = stepLabel.isPresent() ?
-                ImmutablePath.make().extend(t, stepLabel.get()) :
-                ImmutablePath.make().extend(t);
-    }
-
-    @Override
-    public int hashCode() {
-        return super.hashCode() + this.path.hashCode();
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return (object instanceof B_O_P_PA_S_SE_SL_Traverser)
-                && ((B_O_P_PA_S_SE_SL_Traverser) object).path().equals(this.path) // TODO: path equality
-                && ((B_O_P_PA_S_SE_SL_Traverser) object).get().equals(this.t)
-                && ((B_O_P_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
-                && ((B_O_P_PA_S_SE_SL_Traverser) object).loops() == this.loops()
-                && (null == this.sack);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
deleted file mode 100644
index caf3ab9..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
+++ /dev/null
@@ -1,61 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_P_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
-
-    private static final B_O_P_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_P_PA_S_SE_SL_TraverserGenerator();
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
-            TraverserRequirement.BULK,
-            TraverserRequirement.SINGLE_LOOP,
-            TraverserRequirement.PATH_ACCESS,
-            TraverserRequirement.PATH,
-            TraverserRequirement.SACK,
-            TraverserRequirement.SIDE_EFFECTS);
-
-    private B_O_P_PA_S_SE_SL_TraverserGenerator() {
-    }
-
-    @Override
-    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
-        final B_O_P_PA_S_SE_SL_Traverser<S> traverser = new B_O_P_PA_S_SE_SL_Traverser<>(start, startStep);
-        traverser.setBulk(initialBulk);
-        return traverser;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getProvidedRequirements() {
-        return REQUIREMENTS;
-    }
-
-    public static B_O_P_PA_S_SE_SL_TraverserGenerator instance() {
-        return INSTANCE;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java
deleted file mode 100644
index 4a2be92..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_Traverser.java
+++ /dev/null
@@ -1,70 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Traverser;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_Traverser<T> extends O_Traverser<T> {
-
-    protected long bulk = 1l;
-    protected String future = HALT;
-
-    protected B_O_Traverser() {
-    }
-
-    public B_O_Traverser(final T t, final long initialBulk) {
-        super(t);
-        this.bulk = initialBulk;
-    }
-
-    @Override
-    public void setBulk(final long count) {
-        this.bulk = count;
-    }
-
-    @Override
-    public long bulk() {
-        return this.bulk;
-    }
-
-    @Override
-    public void merge(final Traverser.Admin<?> other) {
-        this.bulk = this.bulk + other.bulk();
-    }
-
-    @Override
-    public String getStepId() {
-        return this.future;
-    }
-
-    @Override
-    public void setStepId(final String stepId) {
-        this.future = stepId;
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return object instanceof B_O_Traverser &&
-                ((B_O_Traverser) object).t.equals(this.t) &&
-                ((B_O_Traverser) object).future.equals(this.future);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java
deleted file mode 100644
index 6c6aa1f..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/B_O_TraverserGenerator.java
+++ /dev/null
@@ -1,55 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.EnumSet;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class B_O_TraverserGenerator implements TraverserGenerator {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
-            TraverserRequirement.BULK);
-
-    private static final B_O_TraverserGenerator INSTANCE = new B_O_TraverserGenerator();
-
-    private B_O_TraverserGenerator() {
-    }
-
-    @Override
-    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
-        return new B_O_Traverser<>(start, initialBulk);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getProvidedRequirements() {
-        return REQUIREMENTS;
-    }
-
-    public static B_O_TraverserGenerator instance() {
-        return INSTANCE;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java
deleted file mode 100644
index b28d9b8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_Traverser.java
+++ /dev/null
@@ -1,35 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.traverser.util.AbstractTraverser;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class O_Traverser<T> extends AbstractTraverser<T> {
-
-    protected O_Traverser() {
-    }
-
-    public O_Traverser(final T t) {
-        super(t);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java
deleted file mode 100644
index e0c7dd3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/O_TraverserGenerator.java
+++ /dev/null
@@ -1,52 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class O_TraverserGenerator implements TraverserGenerator {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = Collections.singleton(TraverserRequirement.OBJECT);
-    private static final O_TraverserGenerator INSTANCE = new O_TraverserGenerator();
-
-    private O_TraverserGenerator() {
-    }
-
-    @Override
-    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
-        return new O_Traverser<>(start);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getProvidedRequirements() {
-        return REQUIREMENTS;
-    }
-
-    public static O_TraverserGenerator instance() {
-        return INSTANCE;
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java
deleted file mode 100644
index ce29b87..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserGeneratorFactory.java
+++ /dev/null
@@ -1,33 +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.traverser;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-
-import java.io.Serializable;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraverserGeneratorFactory extends Serializable {
-
-    public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?, ?> traversal);
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java
deleted file mode 100644
index e37f83d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/TraverserRequirement.java
+++ /dev/null
@@ -1,39 +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.traverser;
-
-/**
- * A {@link TraverserRequirement} is a list of requirements that a {@link org.apache.tinkerpop.gremlin.process.Traversal} requires of a {@link org.apache.tinkerpop.gremlin.process.Traverser}.
- * The less requirements, the simpler the traverser can be (both in terms of space and time constraints).
- * Every {@link org.apache.tinkerpop.gremlin.process.Step} provides its specific requirements via {@link org.apache.tinkerpop.gremlin.process.Step#getRequirements()}.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public enum TraverserRequirement {
-
-    OBJECT,
-    BULK,
-    SINGLE_LOOP,
-    NESTED_LOOP,
-    PATH,
-    PATH_ACCESS,
-    SACK,
-    SIDE_EFFECTS,
-    // NESTED_TRAVERSALS
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java
deleted file mode 100644
index 82608c0..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractPathTraverser.java
+++ /dev/null
@@ -1,213 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
-
-import java.util.Optional;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractPathTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
-
-    protected T t;
-    protected Object sack = null;
-    protected String future = HALT;
-    protected short loops = 0;  // an optimization hack to use a short internally to save bits :)
-    protected transient TraversalSideEffects sideEffects;
-    protected long bulk = 1l;
-    protected Path path;
-
-    protected AbstractPathTraverser() {
-
-    }
-
-    public AbstractPathTraverser(final T t, final Step<T, ?> step) {
-        this.t = t;
-        this.sideEffects = step.getTraversal().getSideEffects();
-        this.sideEffects.getSackInitialValue().ifPresent(supplier -> this.sack = supplier.get());
-    }
-
-    /////////////////
-
-    @Override
-    public T get() {
-        return this.t;
-    }
-
-    @Override
-    public void set(final T t) {
-        this.t = t;
-    }
-
-    /////////////////
-
-    @Override
-    public Path path() {
-        return this.path;
-    }
-
-    /////////////////
-
-    @Override
-    public <S> S sack() {
-        return (S) this.sack;
-    }
-
-    @Override
-    public <S> void sack(final S object) {
-        this.sack = object;
-    }
-
-    /////////////////
-
-    @Override
-    public void setBulk(final long count) {
-        this.bulk = count;
-    }
-
-    @Override
-    public long bulk() {
-        return this.bulk;
-    }
-
-    /////////////////
-
-    @Override
-    public int loops() {
-        return this.loops;
-    }
-
-    @Override
-    public void incrLoops(final String stepLabel) {
-        this.loops++;
-    }
-
-    @Override
-    public void resetLoops() {
-        this.loops = 0;
-    }
-
-    /////////////////
-
-    @Override
-    public String getStepId() {
-        return this.future;
-    }
-
-    @Override
-    public void setStepId(final String stepId) {
-        this.future = stepId;
-    }
-
-    /////////////////
-
-    @Override
-    public TraversalSideEffects getSideEffects() {
-        return this.sideEffects;
-    }
-
-
-    @Override
-    public void setSideEffects(final TraversalSideEffects sideEffects) {
-        this.sideEffects = sideEffects;
-    }
-
-    /////////////////
-
-    @Override
-    public Traverser.Admin<T> detach() {
-        this.t = DetachedFactory.detach(this.t, false);
-        this.path = DetachedFactory.detach(this.path, true);
-        return this;
-    }
-
-    @Override
-    public Traverser.Admin<T> attach(final Vertex vertex) {
-        if (this.t instanceof DetachedElement)
-            this.t = (T) ((DetachedElement) this.t).attach(vertex);
-        else if (this.t instanceof DetachedProperty)
-            this.t = (T) ((DetachedProperty) this.t).attach(vertex);
-        // you do not want to attach a path because it will reference graph objects not at the current vertex
-        return this;
-    }
-
-    /////////////////
-
-    @Override
-    public void merge(final Traverser.Admin<?> other) {
-        this.bulk = this.bulk + other.bulk();
-    }
-
-    @Override
-    public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
-        try {
-            final AbstractPathTraverser<R> clone = (AbstractPathTraverser<R>) super.clone();
-            clone.t = r;
-            final Optional<String> stepLabel = step.getLabel();
-            clone.path = stepLabel.isPresent() ? clone.path.clone().extend(r, stepLabel.get()) : clone.path.clone().extend(r);
-            clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public Traverser.Admin<T> split() {
-        try {
-            final AbstractPathTraverser<T> clone = (AbstractPathTraverser<T>) super.clone();
-            clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    /////////////////
-
-    @Override
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public AbstractPathTraverser<T> clone() {
-        try {
-            return (AbstractPathTraverser<T>) super.clone();
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public int hashCode() {
-        return this.t.hashCode() + this.future.hashCode() + this.loops;
-    }
-
-    @Override
-    public String toString() {
-        return this.t.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java
deleted file mode 100644
index 34022cc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/AbstractTraverser.java
+++ /dev/null
@@ -1,187 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.util.path.EmptyPath;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
-
-    protected T t;
-
-    protected AbstractTraverser() {
-
-    }
-
-    public AbstractTraverser(final T t) {
-        this.t = t;
-    }
-
-    /////////////
-
-    @Override
-    public void merge(final Admin<?> other) {
-        throw new UnsupportedOperationException("This traverser does not support merging: " + this.getClass().getCanonicalName());
-    }
-
-    @Override
-    public <R> Admin<R> split(final R r, final Step<T, R> step) {
-        try {
-            final AbstractTraverser<R> clone = (AbstractTraverser<R>) super.clone();
-            clone.t = r;
-            return clone;
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public Admin<T> split() {
-        try {
-            return (AbstractTraverser<T>) super.clone();
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    @Override
-    public void set(final T t) {
-        this.t = t;
-    }
-
-    @Override
-    public void incrLoops(final String stepLabel) {
-
-    }
-
-    @Override
-    public void resetLoops() {
-
-    }
-
-    @Override
-    public String getStepId() {
-        throw new UnsupportedOperationException("This traverser does not support futures: " + this.getClass().getCanonicalName());
-    }
-
-    @Override
-    public void setStepId(final String stepId) {
-
-    }
-
-    @Override
-    public void setBulk(final long count) {
-
-    }
-
-    @Override
-    public Admin<T> detach() {
-        this.t = DetachedFactory.detach(this.t, false);
-        return this;
-    }
-
-    @Override
-    public Admin<T> attach(final Vertex hostVertex) {
-        if (this.t instanceof DetachedElement)
-            this.t = (T) ((DetachedElement) this.t).attach(hostVertex);
-        else if (this.t instanceof DetachedProperty)
-            this.t = (T) ((DetachedProperty) this.t).attach(hostVertex);
-        // you do not want to attach a path because it will reference graph objects not at the current vertex
-        return this;
-    }
-
-    @Override
-    public void setSideEffects(final TraversalSideEffects sideEffects) {
-
-    }
-
-    @Override
-    public TraversalSideEffects getSideEffects() {
-        return EmptyTraversalSideEffects.instance();
-        //throw new UnsupportedOperationException("This traverser does not support sideEffects: " + this.getClass().getCanonicalName());
-    }
-
-    @Override
-    public T get() {
-        return this.t;
-    }
-
-    @Override
-    public <S> S sack() {
-        throw new UnsupportedOperationException("This traverser does not support sacks: " + this.getClass().getCanonicalName());
-    }
-
-    @Override
-    public <S> void sack(final S object) {
-
-    }
-
-    @Override
-    public Path path() {
-        return EmptyPath.instance();
-    }
-
-    @Override
-    public int loops() {
-        throw new UnsupportedOperationException("This traverser does not support loops: " + this.getClass().getCanonicalName());
-    }
-
-    @Override
-    public long bulk() {
-        return 1l;
-    }
-
-    @Override
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public AbstractTraverser<T> clone() {
-        try {
-            return (AbstractTraverser<T>) super.clone();
-        } catch (final CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    ///////////
-
-    @Override
-    public int hashCode() {
-        return this.t.hashCode();
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return object instanceof AbstractTraverser && ((AbstractTraverser) object).get().equals(this.t);
-    }
-
-    @Override
-    public String toString() {
-        return this.t.toString();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java
deleted file mode 100644
index 341fcd5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/DefaultTraverserGeneratorFactory.java
+++ /dev/null
@@ -1,64 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.O_TraverserGenerator;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultTraverserGeneratorFactory implements TraverserGeneratorFactory {
-
-    private static DefaultTraverserGeneratorFactory INSTANCE = new DefaultTraverserGeneratorFactory();
-
-    public static DefaultTraverserGeneratorFactory instance() {
-        return INSTANCE;
-    }
-
-    private DefaultTraverserGeneratorFactory() {
-    }
-
-    @Override
-    public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?,?> traversal) {
-        final Set<TraverserRequirement> requirements = traversal.getTraverserRequirements();
-
-        if (O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return O_TraverserGenerator.instance();
-
-        if (B_O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return B_O_TraverserGenerator.instance();
-
-        if (B_O_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return B_O_PA_S_SE_SL_TraverserGenerator.instance();
-
-        if (B_O_P_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
-            return B_O_P_PA_S_SE_SL_TraverserGenerator.instance();
-
-        throw new IllegalStateException("The provided traverser generator factory does not support the requirements of the traversal: " + this.getClass().getCanonicalName() + requirements);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java
deleted file mode 100644
index 2d15ac4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traverser/util/EmptyTraverser.java
+++ /dev/null
@@ -1,153 +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.traverser.util;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.util.path.EmptyPath;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
-
-    private static final EmptyTraverser INSTANCE = new EmptyTraverser();
-
-    public static <R> EmptyTraverser<R> instance() {
-        return INSTANCE;
-    }
-
-    private EmptyTraverser() {
-
-    }
-
-    @Override
-    public void set(final T t) {
-
-    }
-
-    @Override
-    public void incrLoops(final String stepLabel) {
-
-    }
-
-    @Override
-    public void resetLoops() {
-
-    }
-
-    @Override
-    public String getStepId() {
-        return HALT;
-    }
-
-    @Override
-    public void setStepId(final String stepId) {
-
-    }
-
-    @Override
-    public void setBulk(long count) {
-
-    }
-
-    @Override
-    public <R> Admin<R> split(final R r, final Step<T, R> step) {
-        return INSTANCE;
-    }
-
-    @Override
-    public Admin<T> split() {
-        return this;
-    }
-
-    @Override
-    public Admin<T> detach() {
-        return this;
-    }
-
-    @Override
-    public Admin<T> attach(final Vertex hostVertex) {
-        return this;
-    }
-
-    @Override
-    public void setSideEffects(final TraversalSideEffects sideEffects) {
-
-    }
-
-    @Override
-    public T get() {
-        return null;
-    }
-
-    @Override
-    public <S> S sack() {
-        return null;
-    }
-
-    @Override
-    public <S> void sack(final S object) {
-
-    }
-
-    @Override
-    public void merge(final Traverser.Admin<?> other) {
-
-    }
-
-    @Override
-    public Path path() {
-        return EmptyPath.instance();
-    }
-
-    @Override
-    public int loops() {
-        return 0;
-    }
-
-    @Override
-    public long bulk() {
-        return 0l;
-    }
-
-    @Override
-    public TraversalSideEffects getSideEffects() {
-        return null;
-    }
-
-    @Override
-    public int hashCode() {
-        return 380473707;
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return object instanceof EmptyTraverser;
-    }
-
-    @Override
-    @SuppressWarnings("CloneDoesntCallSuperClone")
-    public EmptyTraverser<T> clone() {
-        return this;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java
deleted file mode 100644
index 70be9cc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/BulkSet.java
+++ /dev/null
@@ -1,186 +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.util;
-
-import java.io.Serializable;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Set;
-import java.util.Spliterator;
-import java.util.function.BiConsumer;
-import java.util.stream.Collectors;
-
-/**
- * BulkSet is a weighted set (i.e. a multi-set). Objects are added along with a bulk counter the denotes how many times the object was added to the set.
- * Given that count-based compression (vs. enumeration) can yield large sets, methods exist that are long-based (2^64).
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class BulkSet<S> extends AbstractSet<S> implements Set<S>, Serializable {
-    private final Map<S, Long> map = new LinkedHashMap<>();
-
-    @Override
-    public int size() {
-        return (int) this.longSize();
-    }
-
-    public int uniqueSize() {
-        return this.map.size();
-    }
-
-    public long longSize() {
-        return this.map.values().stream().collect(Collectors.summingLong(Long::longValue));
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return this.map.isEmpty();
-    }
-
-    @Override
-    public boolean contains(final Object s) {
-        return this.map.containsKey(s);
-    }
-
-    @Override
-    public boolean add(final S s) {
-        return this.add(s, 1l);
-    }
-
-    @Override
-    public boolean addAll(final Collection<? extends S> collection) {
-        if (collection instanceof BulkSet) {
-            ((BulkSet<S>) collection).map.forEach(this::add);
-        } else {
-            collection.iterator().forEachRemaining(this::add);
-        }
-        return true;
-    }
-
-    public void forEach(final BiConsumer<S, Long> consumer) {
-        this.map.forEach(consumer);
-    }
-
-    public boolean add(final S s, final long bulk) {
-        final Long current = this.map.get(s);
-        if (current != null) {
-            this.map.put(s, current + bulk);
-            return false;
-        } else {
-            this.map.put(s, bulk);
-            return true;
-        }
-    }
-
-    public long get(final S s) {
-        final Long bulk = this.map.get(s);
-        return null == bulk ? 0 : bulk;
-    }
-
-    /*public void set(final S s, final long bulk) {
-        this.map.remove(s);
-        this.map.put(s, bulk);
-    }*/
-
-    @Override
-    public boolean remove(final Object s) {
-        return this.map.remove(s) != null;
-    }
-
-    @Override
-    public void clear() {
-        this.map.clear();
-    }
-
-    @Override
-    public Spliterator<S> spliterator() {
-        return this.toList().spliterator();
-    }
-
-    @Override
-    public boolean removeAll(final Collection<?> collection) {
-        Objects.requireNonNull(collection);
-        boolean modified = false;
-        for (final Object object : collection) {
-            if (null != this.map.remove(object))
-                modified = true;
-        }
-        return modified;
-    }
-
-    @Override
-    public int hashCode() {
-        return this.map.hashCode();
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return this.map.equals(object);
-    }
-
-    @Override
-    public String toString() {
-        return this.map.toString();
-    }
-
-    private List<S> toList() {
-        final List<S> list = new ArrayList<>();
-        this.map.forEach((k, v) -> {
-            for (long i = 0; i < v; i++) {
-                list.add(k);
-            }
-        });
-        return list;
-    }
-
-    @Override
-    public Iterator<S> iterator() {
-        return new Iterator<S>() {
-            final Iterator<Map.Entry<S, Long>> entryIterator = map.entrySet().iterator();
-            S lastObject = null;
-            long lastCount = 0l;
-
-            public boolean hasNext() {
-                return this.lastCount > 0l || this.entryIterator.hasNext();
-            }
-
-            @Override
-            public S next() {
-                if (this.lastCount > 0l) {
-                    this.lastCount--;
-                    return this.lastObject;
-                }
-                final Map.Entry<S, Long> entry = entryIterator.next();
-                if (entry.getValue() == 1) {
-                    return entry.getKey();
-                } else {
-                    this.lastObject = entry.getKey();
-                    this.lastCount = entry.getValue() - 1;
-                    return this.lastObject;
-                }
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java
deleted file mode 100644
index 98d3c53..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/MapHelper.java
+++ /dev/null
@@ -1,48 +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.util;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MapHelper {
-
-    private MapHelper() {
-    }
-
-    public static <T> void incr(final Map<T, Long> map, final T key, final Long value) {
-        map.put(key, value + map.getOrDefault(key, 0l));
-    }
-
-    public static <T> void incr(final Map<T, Double> map, final T key, final Double value) {
-        map.put(key, value + map.getOrDefault(key, 0.0d));
-    }
-
-    public static <T, U> void incr(final Map<T, List<U>> map, final T key, final U value) {
-        map.compute(key, (k, v) -> {
-            if (null == v) v = new ArrayList<>();
-            v.add(value);
-            return v;
-        });
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java
deleted file mode 100644
index 37fb957..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/TraverserSet.java
+++ /dev/null
@@ -1,143 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.Traverser;
-
-import java.io.Serializable;
-import java.util.AbstractSet;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Queue;
-import java.util.Set;
-import java.util.Spliterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class TraverserSet<S> extends AbstractSet<Traverser.Admin<S>> implements Set<Traverser.Admin<S>>, Queue<Traverser.Admin<S>>, Serializable {
-
-    private final Map<Traverser.Admin<S>, Traverser.Admin<S>> map = new LinkedHashMap<>();
-
-    public TraverserSet() {
-
-    }
-
-    public TraverserSet(final Traverser.Admin<S> traverser) {
-        this.map.put(traverser, traverser);
-    }
-
-    @Override
-    public Iterator<Traverser.Admin<S>> iterator() {
-        return this.map.values().iterator();
-    }
-
-    public Traverser.Admin<S> get(final Traverser.Admin<S> traverser) {
-        return this.map.get(traverser);
-    }
-
-    @Override
-    public int size() {
-        return this.map.size();
-    }
-
-    public long bulkSize() {
-        return this.map.values().stream().map(Traverser::bulk).reduce(0l, (a, b) -> a + b);
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return this.map.isEmpty();
-    }
-
-    @Override
-    public boolean contains(final Object traverser) {
-        return this.map.containsKey(traverser);
-    }
-
-    @Override
-    public boolean add(final Traverser.Admin<S> traverser) {
-        final Traverser.Admin<S> existing = this.map.get(traverser);
-        if (null == existing) {
-            this.map.put(traverser, traverser);
-            return true;
-        } else {
-            existing.merge(traverser);
-            return false;
-        }
-    }
-
-    @Override
-    public boolean offer(final Traverser.Admin<S> traverser) {
-        return this.add(traverser);
-    }
-
-    @Override
-    public Traverser.Admin<S> remove() {  // pop, exception if empty
-        return this.map.remove(this.map.values().iterator().next());
-    }
-
-    @Override
-    public Traverser.Admin<S> poll() {  // pop, null if empty
-        return this.map.isEmpty() ? null : this.remove();
-    }
-
-    @Override
-    public Traverser.Admin<S> element() { // peek, exception if empty
-        return this.iterator().next();
-    }
-
-    @Override
-    public Traverser.Admin<S> peek() { // peek, null if empty
-        return this.map.isEmpty() ? null : this.iterator().next();
-    }
-
-    @Override
-    public boolean remove(final Object traverser) {
-        return this.map.remove(traverser) != null;
-    }
-
-    @Override
-    public void clear() {
-        this.map.clear();
-    }
-
-    @Override
-    public Spliterator<Traverser.Admin<S>> spliterator() {
-        return this.map.values().spliterator();
-    }
-
-    @Override
-    public String toString() {
-        return this.map.keySet().toString();
-    }
-
-    public void sort(final Comparator<Traverser<S>> comparator) {
-        final List<Traverser.Admin<S>> list = new ArrayList<>(this.map.values());
-        Collections.sort(list, comparator);
-        this.map.clear();
-        list.forEach(traverser -> this.map.put(traverser, traverser));
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java
deleted file mode 100644
index 7bb5c4d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/DependantMutableMetrics.java
+++ /dev/null
@@ -1,59 +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.util.metric;
-
-/**
- * This Metrics class handles a metrics chain in which durations are "double counted" by upstream metrics. Durations are
- * corrected on-the-fly by subtracting upstream durations on every call to stop().
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public class DependantMutableMetrics extends MutableMetrics {
-    private long prevDur = 0L;
-    private DependantMutableMetrics upStreamMetrics;
-
-    private DependantMutableMetrics() {
-        // necessary for gryo serialization
-        super();
-    }
-
-    public DependantMutableMetrics(final String id, final String name, final DependantMutableMetrics upStreamMetrics) {
-        super(id, name);
-        this.upStreamMetrics = upStreamMetrics;
-    }
-
-    public void start() {
-        super.start();
-    }
-
-    public void stop() {
-        super.stop();
-        // root step will not have an upstream metrics
-        if (upStreamMetrics != null) {
-            // subtract time that is "double counted" by upstream metrics
-            super.durationNs -= upStreamMetrics.getAndResetIncrementalDur();
-        }
-    }
-
-    public long getAndResetIncrementalDur() {
-        long incrementalDur = super.durationNs - prevDur;
-        prevDur = super.durationNs;
-        return incrementalDur;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java
deleted file mode 100644
index 0bd0c0a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/ImmutableMetrics.java
+++ /dev/null
@@ -1,103 +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.util.metric;
-
-import java.io.Serializable;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public class ImmutableMetrics implements Metrics, Serializable {
-
-    static final TimeUnit SOURCE_UNIT = TimeUnit.NANOSECONDS;
-
-    protected String id;
-    protected String name;
-    protected Map<String, AtomicLong> counts = new HashMap<>();
-    protected long durationNs = 0l;
-    protected final Map<String, Object> annotations = new HashMap<>();
-    protected final Map<String, ImmutableMetrics> nested = new LinkedHashMap<>();
-
-    protected ImmutableMetrics() {
-    }
-
-    @Override
-    public long getDuration(TimeUnit unit) {
-        return unit.convert(this.durationNs, SOURCE_UNIT);
-    }
-
-    @Override
-    public long getCount(String key) {
-        return counts.get(key).get();
-    }
-
-    @Override
-    public Map<String, Long> getCounts() {
-        Map<String, Long> ret = new HashMap<>();
-        for (Map.Entry<String, AtomicLong> count : counts.entrySet()) {
-            ret.put(count.getKey(), count.getValue().get());
-        }
-        return ret;
-    }
-
-    @Override
-    public String getName() {
-        return name;
-    }
-
-    public String getId() {
-        return id;
-    }
-
-    @Override
-    public Collection<ImmutableMetrics> getNested() {
-        return nested.values();
-    }
-
-    @Override
-    public ImmutableMetrics getNested(String metricsId) {
-        return nested.get(metricsId);
-    }
-
-    @Override
-    public Map<String, Object> getAnnotations() {
-        return annotations;
-    }
-
-    @Override
-    public Object getAnnotation(final String key) {
-        return annotations.get(key);
-    }
-
-    @Override
-    public String toString() {
-        return "ImmutableMetrics{" +
-                "id='" + id + '\'' +
-                ", name='" + name + '\'' +
-                ", counts=" + counts +
-                ", durationNs=" + durationNs +
-                '}';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java
deleted file mode 100644
index f6b5002..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/Metrics.java
+++ /dev/null
@@ -1,104 +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.util.metric;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Holds metrics data; typically for .profile()-step analysis. Metrics may be nested. Nesting enables the ability to
- * capture explicit metrics for multiple distinct operations. Annotations are used to store miscellaneous notes that
- * might be useful to a developer when examining results, such as index coverage for Steps in a Traversal.
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public interface Metrics {
-
-
-
-
-    /**
-     * Get the duration of execution time taken.
-     *
-     * @param units
-     * @return
-     */
-    public long getDuration(TimeUnit units);
-
-    /**
-     * Get the count for the corresponding countKey.
-     *
-     * @param countKey key for counter to get.
-     * @return
-     */
-    public long getCount(String countKey);
-
-    /**
-     * Get the map of all counters. This method copies the internal map.
-     *
-     * @return a Map where the key is the counter ID and the value is the counter value.
-     */
-    public Map<String, Long> getCounts();
-
-    /**
-     * Name of this Metrics.
-     *
-     * @return name of this Metrics.
-     */
-    public String getName();
-
-    /**
-     * Id of this Metrics.
-     *
-     * @return id of this Metrics.
-     */
-    public String getId();
-
-
-    /**
-     * Get the nested Metrics objects. Metrics will be ordered in the order they were inserted.
-     *
-     * @return the nested Metrics objects.
-     */
-    public Collection<? extends Metrics> getNested();
-
-    /**
-     * Get a nested Metrics object by Id.
-     *
-     * @param metricsId
-     * @return a nested Metrics object.
-     */
-    Metrics getNested(String metricsId);
-
-    /**
-     * Obtain the annotations for this Metrics. Values may be of type String or Number.
-     *
-     * @return the annotations for this Metrics. Modifications to the returned object are persisted in the original.
-     */
-    public Map<String, Object> getAnnotations();
-
-    /**
-     * Obtain the annotation with the specified key. Values may be of type String or Number.
-     *
-     * @param key key of the annotation to obtain.
-     * @return
-     */
-    public Object getAnnotation(String key);
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java
deleted file mode 100644
index d84ed40..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/MutableMetrics.java
+++ /dev/null
@@ -1,171 +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.util.metric;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-import java.util.concurrent.atomic.AtomicLong;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public class MutableMetrics extends ImmutableMetrics implements Cloneable {
-
-    // Note: if you add new members then you probably need to add them to the copy constructor;
-
-    private long tempTime = -1l;
-
-    protected MutableMetrics() {
-        // necessary for gryo serialization
-    }
-
-    public MutableMetrics(final String id, final String name) {
-        this.id = id;
-        this.name = name;
-    }
-
-
-    public void addNested(MutableMetrics metrics) {
-        this.nested.put(metrics.getId(), metrics);
-    }
-
-    public void start() {
-        if (-1 != this.tempTime) {
-            throw new IllegalStateException("Internal Error: Concurrent Metrics start. Stop timer before starting timer.");
-        }
-        this.tempTime = System.nanoTime();
-    }
-
-    public void stop() {
-        if (-1 == this.tempTime)
-            throw new IllegalStateException("Internal Error: Metrics has not been started. Start timer before stopping timer");
-        this.durationNs = this.durationNs + (System.nanoTime() - this.tempTime);
-        this.tempTime = -1;
-    }
-
-    public void incrementCount(String key, final long incr) {
-        AtomicLong count = this.counts.get(key);
-        if (count == null) {
-            count = new AtomicLong();
-            this.counts.put(key, count);
-        }
-        count.addAndGet(incr);
-    }
-
-    public void aggregate(MutableMetrics other) {
-        this.durationNs += other.durationNs;
-        for (Map.Entry<String, AtomicLong> otherCount : other.counts.entrySet()) {
-            AtomicLong thisCount = this.counts.get(otherCount.getKey());
-            if (thisCount == null) {
-                thisCount = new AtomicLong(otherCount.getValue().get());
-                this.counts.put(otherCount.getKey(), thisCount);
-            } else {
-                thisCount.addAndGet(otherCount.getValue().get());
-            }
-        }
-
-        // Merge annotations. If multiple values for a given key are found then append it to a comma-separated list.
-        for (Map.Entry<String, Object> p : other.annotations.entrySet()) {
-            if (this.annotations.containsKey(p.getKey())) {
-                // Strings are concatenated
-                Object existingVal = this.annotations.get(p.getKey());
-                if (existingVal instanceof String) {
-                    final List<String> existingValues = Arrays.asList(existingVal.toString().split(","));
-                    if (!existingValues.contains(p.getValue())) {
-                        // New value. Append to comma-separated list.
-                        this.annotations.put(p.getKey(), existingVal.toString() + ',' + p.getValue());
-                    }
-                } else {
-                    // Numbers are summed
-                    Number existingNum = (Number) existingVal;
-                    Number otherNum = (Number) p.getValue();
-                    Number newVal;
-                    if (existingNum instanceof Double || existingNum instanceof Float) {
-                        newVal =
-                                existingNum.doubleValue() + otherNum.doubleValue();
-                    } else {
-                        newVal = existingNum.longValue() + otherNum.longValue();
-                    }
-                    this.annotations.put(p.getKey(), newVal);
-                }
-            } else {
-                this.annotations.put(p.getKey(), p.getValue());
-            }
-        }
-        this.annotations.putAll(other.annotations);
-
-        // Merge nested Metrics
-        other.nested.values().forEach(nested -> {
-            MutableMetrics thisNested = (MutableMetrics) this.nested.get(nested.getId());
-            if (thisNested == null) {
-                thisNested = new MutableMetrics(nested.getId(), nested.getName());
-                this.nested.put(thisNested.getId(), thisNested);
-            }
-            thisNested.aggregate((MutableMetrics) nested);
-        });
-    }
-
-    /**
-     * Set an annotation value. Support exists for Strings and Numbers only. During a merge, Strings are concatenated
-     * into a "," (comma) separated list of distinct values (duplicates are ignored), and Numbers are summed.
-     *
-     * @param key
-     * @param value
-     */
-    public void setAnnotation(String key, Object value) {
-        if (!(value instanceof String) && !(value instanceof Number)) {
-            throw new IllegalArgumentException("Metrics annotations only support String and Number values.");
-        }
-        annotations.put(key, value);
-    }
-
-    @Override
-    public MutableMetrics getNested(String metricsId) {
-        return (MutableMetrics) nested.get(metricsId);
-    }
-
-    public ImmutableMetrics getImmutableClone() {
-        final ImmutableMetrics clone = new ImmutableMetrics();
-        copyMembers(clone);
-        this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).getImmutableClone()));
-        return clone;
-    }
-
-    private void copyMembers(final ImmutableMetrics clone) {
-        clone.id = this.id;
-        clone.name = this.name;
-        clone.durationNs = this.durationNs;
-        for (Map.Entry<String, AtomicLong> c : this.counts.entrySet()) {
-            clone.counts.put(c.getKey(), new AtomicLong(c.getValue().get()));
-        }
-        for (Map.Entry<String, Object> a : this.annotations.entrySet()) {
-            clone.annotations.put(a.getKey(), a.getValue());
-        }
-    }
-
-    @Override
-    public MutableMetrics clone() {
-        final MutableMetrics clone = new MutableMetrics();
-        copyMembers(clone);
-        this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).clone()));
-        return clone;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java
deleted file mode 100644
index 4431004..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/util/metric/StandardTraversalMetrics.java
+++ /dev/null
@@ -1,204 +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.util.metric;
-
-import org.apache.commons.lang.StringUtils;
-
-import java.io.Serializable;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class StandardTraversalMetrics implements TraversalMetrics, Serializable {
-    // toString() specific headers
-    private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
-
-    private boolean dirty = true;
-    private final Map<String, MutableMetrics> metrics = new HashMap<>();
-    private final Map<String, MutableMetrics> allMetrics = new HashMap<>();
-    private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
-
-    /*
-    The following are computed values upon the completion of profiling in order to report the results back to the user
-     */
-    private long totalStepDuration;
-    private Map<String, ImmutableMetrics> computedMetrics;
-
-    public StandardTraversalMetrics() {
-    }
-
-    public void start(final String metricsId) {
-        dirty = true;
-        if (allMetrics.get(metricsId) == null) {
-            System.out.println();
-        }
-        allMetrics.get(metricsId).start();
-    }
-
-    public void stop(final String metricsId) {
-        dirty = true;
-        allMetrics.get(metricsId).stop();
-    }
-
-    public void finish(final String metricsId, final long bulk) {
-        dirty = true;
-        final MutableMetrics metrics = allMetrics.get(metricsId);
-        metrics.stop();
-        metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 1);
-        metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, bulk);
-    }
-
-    @Override
-    public long getDuration(final TimeUnit unit) {
-        computeTotals();
-        return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
-    }
-
-    @Override
-    public Metrics getMetrics(final int index) {
-        computeTotals();
-        // adjust index to account for the injected profile steps
-        return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
-    }
-
-    @Override
-    public Metrics getMetrics(final String id) {
-        computeTotals();
-        return computedMetrics.get(id);
-    }
-
-    @Override
-    public Collection<ImmutableMetrics> getMetrics() {
-        computeTotals();
-        return computedMetrics.values();
-    }
-
-    @Override
-    public String toString() {
-        computeTotals();
-
-        // Build a pretty table of metrics data.
-
-        // Append headers
-        final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
-                .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
-
-        sb.append("\n=============================================================================================================");
-
-        appendMetrics(computedMetrics.values(), sb, 0);
-
-        // Append total duration
-        sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
-                ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
-
-        return sb.toString();
-    }
-
-    private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
-        // Append each StepMetric's row. indexToLabelMap values are ordered by index.
-        for (Metrics m : metrics) {
-            String rowName = m.getName();
-            for (int ii = 0; ii < indent; ii++) {
-                rowName = "  " + rowName;
-            }
-            rowName = StringUtils.abbreviate(rowName, 50);
-            final long itemCount = m.getCount(TraversalMetrics.ELEMENT_COUNT_ID);
-            final long traverserCount = m.getCount(TraversalMetrics.TRAVERSER_COUNT_ID);
-
-            Double percentDur = (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-            if (percentDur != null) {
-                sb.append(String.format("%n%-50s %21d %11d %15.3f %8.2f",
-                        rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0, percentDur));
-            } else {
-                sb.append(String.format("%n%-50s %21d %11d %15.3f",
-                        rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
-            }
-            appendMetrics(m.getNested(), sb, indent + 1);
-        }
-    }
-
-    private void computeTotals() {
-        if (!dirty) {
-            // already good to go
-            return;
-        }
-
-        // Create temp list of ordered metrics
-        List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
-        for (String label : indexToLabelMap.values()) {
-            // The indexToLabelMap is sorted by index (key)
-            tempMetrics.add(metrics.get(label).clone());
-        }
-
-        // Calculate total duration
-        this.totalStepDuration = 0;
-        tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
-
-        // Assign %'s
-        tempMetrics.forEach(m -> {
-            double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
-            m.setAnnotation(TraversalMetrics.PERCENT_DURATION_KEY, dur);
-        });
-
-        // Store immutable instances of the calculated metrics
-        computedMetrics = new LinkedHashMap<>(metrics.size());
-        tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
-
-        dirty = false;
-    }
-
-    public static StandardTraversalMetrics merge(final Iterator<StandardTraversalMetrics> toMerge) {
-        final StandardTraversalMetrics newTraversalMetrics = new StandardTraversalMetrics();
-
-        // iterate the incoming TraversalMetrics
-        toMerge.forEachRemaining(inTraversalMetrics -> {
-            // aggregate the internal Metrics
-            inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
-
-                MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
-                if (null == aggregateMetrics) {
-                    // need to create a Metrics to aggregate into
-                    aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
-
-                    newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
-                    // Set the index of the Metrics
-                    for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
-                        if (metricsId.equals(entry.getValue())) {
-                            newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
-                            break;
-                        }
-                    }
-                }
-                aggregateMetrics.aggregate(toAggregate);
-            });
-        });
-        return newTraversalMetrics;
-    }
-
-    public void addMetrics(final MutableMetrics newMetrics, final String id, final int index, final boolean isTopLevel, final String profileStepId) {
-        if (isTopLevel) {
-            // The index is necessary to ensure that step order is preserved after a merge.
-            indexToLabelMap.put(index, id);
-            metrics.put(id, newMetrics);
-        }
-        allMetrics.put(profileStepId, newMetrics);
-    }
-}


[24/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
new file mode 100644
index 0000000..a423512
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
@@ -0,0 +1,182 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+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.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.TreeSupplier;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TreeSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<Object, Tree, Object, Tree, Tree> {
+
+    private TraversalRing<Object, Object> traversalRing;
+    private String sideEffectKey;
+
+    public TreeSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
+        super(traversal);
+        this.sideEffectKey = sideEffectKey;
+        this.traversalRing = new TraversalRing<>();
+        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, TreeSupplier.instance());
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<S> traverser) {
+        Tree depth = traverser.sideEffects(this.sideEffectKey);
+        final Path path = traverser.path();
+        for (int i = 0; i < path.size(); i++) {
+            final Object object = TraversalUtil.apply(path.<Object>get(i), this.traversalRing.next());
+            if (!depth.containsKey(object))
+                depth.put(object, new Tree<>());
+            depth = (Tree) depth.get(object);
+        }
+        this.traversalRing.reset();
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    @Override
+    public MapReduce<Object, Tree, Object, Tree, Tree> getMapReduce() {
+        return new TreeSideEffectMapReduce(this);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.traversalRing.reset();
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.traversalRing);
+    }
+
+    @Override
+    public TreeSideEffectStep<S> clone()  {
+        final TreeSideEffectStep<S> clone = (TreeSideEffectStep<S>) super.clone();
+        clone.traversalRing = new TraversalRing<>();
+        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+        }
+        return clone;
+    }
+
+    @Override
+    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+        return this.traversalRing.getTraversals();
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
+        this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
+    }
+
+    ////////////////
+
+    public static final class TreeSideEffectMapReduce extends StaticMapReduce<Object, Tree, Object, Tree, Tree> {
+
+        public static final String TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.treeSideEffectStep.sideEffectKey";
+
+        private String sideEffectKey;
+
+        private TreeSideEffectMapReduce() {
+
+        }
+
+        public TreeSideEffectMapReduce(final TreeSideEffectStep step) {
+            this.sideEffectKey = step.getSideEffectKey();
+        }
+
+        @Override
+        public void storeState(final Configuration configuration) {
+            super.storeState(configuration);
+            configuration.setProperty(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+        }
+
+        @Override
+        public void loadState(final Configuration configuration) {
+            this.sideEffectKey = configuration.getString(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return stage.equals(Stage.MAP);
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<Object, Tree> emitter) {
+            VertexTraversalSideEffects.of(vertex).<Tree<?>>ifPresent(this.sideEffectKey, tree -> tree.splitParents().forEach(branches -> emitter.emit(branches.keySet().iterator().next(), branches)));
+        }
+
+        /*
+        @Override
+        public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+            this.reduce(key, values, emitter);
+        }
+
+        @Override
+        public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+            final Tree tree = new Tree();
+            values.forEachRemaining(tree::addTree);
+            emitter.emit(tree);
+        }
+        */
+
+        @Override
+        public Tree generateFinalResult(final Iterator<KeyValue<Object, Tree>> keyValues) {
+            final Tree result = new Tree();
+            keyValues.forEachRemaining(keyValue -> result.addTree(keyValue.getValue()));
+            return result;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return this.sideEffectKey;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
new file mode 100644
index 0000000..14c3b36
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/AbstractStep.java
@@ -0,0 +1,183 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.Objects;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractStep<S, E> implements Step<S, E> {
+
+    protected String label = null;
+    protected String id = Traverser.Admin.HALT;
+    protected Traversal.Admin traversal;
+    protected ExpandableStepIterator<S> starts;
+    protected Traverser<E> nextEnd = null;
+    protected boolean traverserStepIdSetByChild = false; // TODO: Step.teleport(traverser, step)
+
+    protected Step<?, S> previousStep = EmptyStep.instance();
+    protected Step<E, ?> nextStep = EmptyStep.instance();
+
+    public AbstractStep(final Traversal.Admin traversal) {
+        this.traversal = traversal;
+        this.starts = new ExpandableStepIterator<S>((Step) this);
+    }
+
+    @Override
+    public void setId(final String id) {
+        Objects.nonNull(id);
+        this.id = id;
+    }
+
+    @Override
+    public String getId() {
+        return this.id;
+    }
+
+    @Override
+    public void setLabel(final String label) {
+        Objects.nonNull(label);
+        this.label = label;
+    }
+
+    @Override
+    public Optional<String> getLabel() {
+        return Optional.ofNullable(this.label);
+    }
+
+    @Override
+    public void reset() {
+        this.starts.clear();
+        this.nextEnd = null;
+    }
+
+    @Override
+    public void addStarts(final Iterator<Traverser<S>> starts) {
+        this.starts.add((Iterator) starts);
+    }
+
+    @Override
+    public void addStart(final Traverser<S> start) {
+        this.starts.add((Traverser.Admin<S>) start);
+    }
+
+    @Override
+    public void setPreviousStep(final Step<?, S> step) {
+        this.previousStep = step;
+    }
+
+    @Override
+    public Step<?, S> getPreviousStep() {
+        return this.previousStep;
+    }
+
+    @Override
+    public void setNextStep(final Step<E, ?> step) {
+        this.nextStep = step;
+    }
+
+    @Override
+    public Step<E, ?> getNextStep() {
+        return this.nextStep;
+    }
+
+    @Override
+    public Traverser<E> next() {
+        if (null != this.nextEnd) {
+            try {
+                return this.prepareTraversalForNextStep(this.nextEnd);
+            } finally {
+                this.nextEnd = null;
+            }
+        } else {
+            while (true) {
+                final Traverser<E> traverser = this.processNextStart();
+                if (0 != traverser.bulk()) {
+                    return this.prepareTraversalForNextStep(traverser);
+                }
+            }
+        }
+    }
+
+    @Override
+    public boolean hasNext() {
+        if (null != this.nextEnd)
+            return true;
+        else {
+            try {
+                while (true) {
+                    this.nextEnd = this.processNextStart();
+                    if (0 != this.nextEnd.bulk())
+                        return true;
+                    else
+                        this.nextEnd = null;
+                }
+            } catch (final NoSuchElementException e) {
+                return false;
+            }
+        }
+    }
+
+    @Override
+    public <A, B> Traversal.Admin<A, B> getTraversal() {
+        return this.traversal;
+    }
+
+    @Override
+    public void setTraversal(final Traversal.Admin<?, ?> traversal) {
+        this.traversal = traversal;
+    }
+
+    protected abstract Traverser<E> processNextStart() throws NoSuchElementException;
+
+    public String toString() {
+        return TraversalHelper.makeStepString(this);
+    }
+
+    @Override
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public AbstractStep<S, E> clone() {
+        try {
+            final AbstractStep clone = (AbstractStep) super.clone();
+            clone.starts = new ExpandableStepIterator<S>(clone);
+            clone.previousStep = EmptyStep.instance();
+            clone.nextStep = EmptyStep.instance();
+            clone.nextEnd = null;
+            return clone;
+        } catch (CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    private final Traverser<E> prepareTraversalForNextStep(final Traverser<E> traverser) {
+        if (!this.traverserStepIdSetByChild) ((Traverser.Admin<E>) traverser).setStepId(this.nextStep.getId());
+        if (null != this.label) traverser.path().addLabel(this.label);
+        return traverser;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java
new file mode 100644
index 0000000..a90b009
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/BulkSet.java
@@ -0,0 +1,186 @@
+/*
+ * 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.util;
+
+import java.io.Serializable;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.function.BiConsumer;
+import java.util.stream.Collectors;
+
+/**
+ * BulkSet is a weighted set (i.e. a multi-set). Objects are added along with a bulk counter the denotes how many times the object was added to the set.
+ * Given that count-based compression (vs. enumeration) can yield large sets, methods exist that are long-based (2^64).
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class BulkSet<S> extends AbstractSet<S> implements Set<S>, Serializable {
+    private final Map<S, Long> map = new LinkedHashMap<>();
+
+    @Override
+    public int size() {
+        return (int) this.longSize();
+    }
+
+    public int uniqueSize() {
+        return this.map.size();
+    }
+
+    public long longSize() {
+        return this.map.values().stream().collect(Collectors.summingLong(Long::longValue));
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return this.map.isEmpty();
+    }
+
+    @Override
+    public boolean contains(final Object s) {
+        return this.map.containsKey(s);
+    }
+
+    @Override
+    public boolean add(final S s) {
+        return this.add(s, 1l);
+    }
+
+    @Override
+    public boolean addAll(final Collection<? extends S> collection) {
+        if (collection instanceof BulkSet) {
+            ((BulkSet<S>) collection).map.forEach(this::add);
+        } else {
+            collection.iterator().forEachRemaining(this::add);
+        }
+        return true;
+    }
+
+    public void forEach(final BiConsumer<S, Long> consumer) {
+        this.map.forEach(consumer);
+    }
+
+    public boolean add(final S s, final long bulk) {
+        final Long current = this.map.get(s);
+        if (current != null) {
+            this.map.put(s, current + bulk);
+            return false;
+        } else {
+            this.map.put(s, bulk);
+            return true;
+        }
+    }
+
+    public long get(final S s) {
+        final Long bulk = this.map.get(s);
+        return null == bulk ? 0 : bulk;
+    }
+
+    /*public void set(final S s, final long bulk) {
+        this.map.remove(s);
+        this.map.put(s, bulk);
+    }*/
+
+    @Override
+    public boolean remove(final Object s) {
+        return this.map.remove(s) != null;
+    }
+
+    @Override
+    public void clear() {
+        this.map.clear();
+    }
+
+    @Override
+    public Spliterator<S> spliterator() {
+        return this.toList().spliterator();
+    }
+
+    @Override
+    public boolean removeAll(final Collection<?> collection) {
+        Objects.requireNonNull(collection);
+        boolean modified = false;
+        for (final Object object : collection) {
+            if (null != this.map.remove(object))
+                modified = true;
+        }
+        return modified;
+    }
+
+    @Override
+    public int hashCode() {
+        return this.map.hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return this.map.equals(object);
+    }
+
+    @Override
+    public String toString() {
+        return this.map.toString();
+    }
+
+    private List<S> toList() {
+        final List<S> list = new ArrayList<>();
+        this.map.forEach((k, v) -> {
+            for (long i = 0; i < v; i++) {
+                list.add(k);
+            }
+        });
+        return list;
+    }
+
+    @Override
+    public Iterator<S> iterator() {
+        return new Iterator<S>() {
+            final Iterator<Map.Entry<S, Long>> entryIterator = map.entrySet().iterator();
+            S lastObject = null;
+            long lastCount = 0l;
+
+            public boolean hasNext() {
+                return this.lastCount > 0l || this.entryIterator.hasNext();
+            }
+
+            @Override
+            public S next() {
+                if (this.lastCount > 0l) {
+                    this.lastCount--;
+                    return this.lastObject;
+                }
+                final Map.Entry<S, Long> entry = entryIterator.next();
+                if (entry.getValue() == 1) {
+                    return entry.getKey();
+                } else {
+                    this.lastObject = entry.getKey();
+                    this.lastCount = entry.getValue() - 1;
+                    return this.lastObject;
+                }
+            }
+        };
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
new file mode 100644
index 0000000..83907fa
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
@@ -0,0 +1,67 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> {
+    private TraverserSet<S> traverserSet = new TraverserSet<>();
+
+    public CollectingBarrierStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    public abstract void barrierConsumer(final TraverserSet<S> traverserSet);
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.BULK);
+    }
+
+    @Override
+    public Traverser<S> processNextStart() {
+        if (this.starts.hasNext()) {
+            this.starts.forEachRemaining(this.traverserSet::add);
+            this.barrierConsumer(this.traverserSet);
+        }
+        return this.traverserSet.remove();
+    }
+
+    @Override
+    public CollectingBarrierStep<S> clone() {
+        final CollectingBarrierStep<S> clone = (CollectingBarrierStep<S>) super.clone();
+        clone.traverserSet = new TraverserSet<>();
+        return clone;
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.traverserSet.clear();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
new file mode 100644
index 0000000..7dcdc70
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ComputerAwareStep.java
@@ -0,0 +1,94 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> implements EngineDependent {
+
+    private Iterator<Traverser<E>> previousIterator = EmptyIterator.instance();
+
+    public ComputerAwareStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<E> processNextStart() throws NoSuchElementException {
+        while (true) {
+            if (this.previousIterator.hasNext())
+                return this.previousIterator.next();
+            this.previousIterator = this.traverserStepIdSetByChild ? this.computerAlgorithm() : this.standardAlgorithm();
+        }
+    }
+
+    @Override
+    public void onEngine(final TraversalEngine engine) {
+        this.traverserStepIdSetByChild = engine.isComputer();
+    }
+
+    @Override
+    public ComputerAwareStep<S, E> clone() {
+        final ComputerAwareStep<S, E> clone = (ComputerAwareStep<S, E>) super.clone();
+        clone.previousIterator = Collections.emptyIterator();
+        return clone;
+    }
+
+    protected abstract Iterator<Traverser<E>> standardAlgorithm() throws NoSuchElementException;
+
+    protected abstract Iterator<Traverser<E>> computerAlgorithm() throws NoSuchElementException;
+
+    //////
+
+    public class EndStep extends AbstractStep<S, S> implements EngineDependent {
+
+        public EndStep(final Traversal.Admin traversal) {
+            super(traversal);
+        }
+
+        @Override
+        protected Traverser<S> processNextStart() throws NoSuchElementException {
+            final Traverser.Admin<S> start = this.starts.next();
+            if (this.traverserStepIdSetByChild) start.setStepId(ComputerAwareStep.this.getNextStep().getId());
+            return start;
+        }
+
+        @Override
+        public String toString() {
+            return TraversalHelper.makeStepString(this);
+        }
+
+        @Override
+        public void onEngine(final TraversalEngine engine) {
+            this.traverserStepIdSetByChild = engine.isComputer();
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java
new file mode 100644
index 0000000..8e008b0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementFunctionComparator.java
@@ -0,0 +1,57 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.io.Serializable;
+import java.util.Comparator;
+import java.util.function.Function;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ElementFunctionComparator<V> implements Comparator<Element>, Serializable {
+
+    private final Function<Element, V> elementFunction;
+    private final Comparator<V> valueComparator;
+
+    public ElementFunctionComparator(final Function<Element, V> elementFunction, final Comparator<V> valueComparator) {
+        this.elementFunction = elementFunction;
+        this.valueComparator = valueComparator;
+    }
+
+    public Function<Element, V> getElementFunction() {
+        return this.elementFunction;
+    }
+
+    public Comparator<V> getValueComparator() {
+        return this.valueComparator;
+    }
+
+    @Override
+    public int compare(final Element elementA, final Element elementB) {
+        return this.valueComparator.compare(this.elementFunction.apply(elementA), this.elementFunction.apply(elementB));
+    }
+
+    @Override
+    public String toString() {
+        return this.valueComparator.toString() + "(" + this.elementFunction + ')';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java
new file mode 100644
index 0000000..ba91f94
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ElementValueComparator.java
@@ -0,0 +1,56 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ElementValueComparator<V> implements Comparator<Element>, Serializable {
+
+    private final String propertyKey;
+    private final Comparator<V> valueComparator;
+
+    public ElementValueComparator(final String propertyKey, final Comparator<V> valueComparator) {
+        this.propertyKey = propertyKey;
+        this.valueComparator = valueComparator;
+    }
+
+    public String getPropertyKey() {
+        return this.propertyKey;
+    }
+
+    public Comparator<V> getValueComparator() {
+        return this.valueComparator;
+    }
+
+    @Override
+    public int compare(final Element elementA, final Element elementB) {
+        return this.valueComparator.compare(elementA.value(this.propertyKey), elementB.value(this.propertyKey));
+    }
+
+    @Override
+    public String toString() {
+        return this.valueComparator.toString() + '(' + this.propertyKey + ')';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
new file mode 100644
index 0000000..8be354d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyPath.java
@@ -0,0 +1,102 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyPath implements Path, Serializable {
+
+    private static final EmptyPath INSTANCE = new EmptyPath();
+
+    private EmptyPath() {
+
+    }
+
+    @Override
+    public int size() {
+        return 0;
+    }
+
+    @Override
+    public Path extend(final Object object, final String... labels) {
+        return this;
+    }
+
+    @Override
+    public <A> A get(final String label) {
+        throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+    }
+
+    @Override
+    public <A> A get(final int index) {
+        return (A) Collections.emptyList().get(index);
+    }
+
+    @Override
+    public boolean hasLabel(final String label) {
+        return false;
+    }
+
+    @Override
+    public void addLabel(final String label) {
+
+    }
+
+    @Override
+    public List<Object> objects() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public List<Set<String>> labels() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public boolean isSimple() {
+        return true;
+    }
+
+    @Override
+    public EmptyPath clone() {
+        return this;
+    }
+
+    public static Path instance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public int hashCode() {
+        return -1424379551;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object instanceof EmptyPath;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
new file mode 100644
index 0000000..ee6a5d6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
@@ -0,0 +1,143 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Optional;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyStep<S, E> implements Step<S, E>, TraversalParent {
+
+    private static final EmptyStep INSTANCE = new EmptyStep<>();
+
+    public static <S, E> Step<S, E> instance() {
+        return INSTANCE;
+    }
+
+    private EmptyStep() {
+    }
+
+    @Override
+    public void addStarts(final Iterator<Traverser<S>> starts) {
+
+    }
+
+    @Override
+    public void addStart(final Traverser<S> start) {
+
+    }
+
+    @Override
+    public void setPreviousStep(final Step<?, S> step) {
+
+    }
+
+    @Override
+    public void reset() {
+
+    }
+
+    @Override
+    public Step<?, S> getPreviousStep() {
+        return INSTANCE;
+    }
+
+    @Override
+    public void setNextStep(final Step<E, ?> step) {
+
+    }
+
+    @Override
+    public Step<E, ?> getNextStep() {
+        return INSTANCE;
+    }
+
+    @Override
+    public <A, B> Traversal.Admin<A, B> getTraversal() {
+        return EmptyTraversal.instance();
+    }
+
+    @Override
+    public void setTraversal(final Traversal.Admin<?, ?> traversal) {
+
+    }
+
+    @Override
+    @SuppressWarnings("CloneDoesntCallSuperClone")
+    public EmptyStep<S, E> clone() {
+        return INSTANCE;
+    }
+
+    @Override
+    public Optional<String> getLabel() {
+        return Optional.empty();
+    }
+
+    @Override
+    public void setLabel(final String label) {
+
+    }
+
+    @Override
+    public void setId(final String id) {
+
+    }
+
+    @Override
+    public String getId() {
+        return Traverser.Admin.HALT;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return false;
+    }
+
+    @Override
+    public Traverser<E> next() {
+        throw FastNoSuchElementException.instance();
+    }
+
+    @Override
+    public int hashCode() {
+        return -1691648095;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object instanceof EmptyStep;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.emptySet();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
new file mode 100644
index 0000000..57687c1
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ExpandableStepIterator.java
@@ -0,0 +1,77 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.util.iterator.MultiIterator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+
+import java.io.Serializable;
+import java.util.Iterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin<E>>, Serializable {
+
+    private final TraverserSet<E> traverserSet = new TraverserSet<>();
+    private final MultiIterator<Traverser.Admin<E>> traverserIterators = new MultiIterator<>();
+    private final Step<?, E> hostStep;
+
+    public ExpandableStepIterator(final Step<?, E> hostStep) {
+        this.hostStep = hostStep;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return !this.traverserSet.isEmpty() || this.hostStep.getPreviousStep().hasNext() || this.traverserIterators.hasNext();
+    }
+
+    @Override
+    public Traverser.Admin<E> next() {
+        if (!this.traverserSet.isEmpty())
+            return this.traverserSet.remove();
+        if (this.traverserIterators.hasNext())
+            return this.traverserIterators.next();
+        /////////////
+        if (this.hostStep.getPreviousStep().hasNext())
+            return (Traverser.Admin<E>) this.hostStep.getPreviousStep().next();
+        /////////////
+        return this.traverserSet.remove();
+    }
+
+    public void add(final Iterator<Traverser.Admin<E>> iterator) {
+        this.traverserIterators.addIterator(iterator);
+    }
+
+    public void add(final Traverser.Admin<E> traverser) {
+        this.traverserSet.add(traverser);
+    }
+
+    @Override
+    public String toString() {
+        return this.traverserSet.toString();
+    }
+
+    public void clear() {
+        this.traverserIterators.clear();
+        this.traverserSet.clear();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
new file mode 100644
index 0000000..cc98041
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/HasContainer.java
@@ -0,0 +1,113 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class HasContainer implements Serializable {
+
+    public String key;
+    public BiPredicate predicate;
+    public Object value;
+
+    public HasContainer(final String key, final BiPredicate predicate, final Object value) {
+        this.key = key;
+        this.predicate = predicate;
+        this.value = value;
+        if (null == this.value && !(this.predicate instanceof Contains)) {
+            throw new IllegalArgumentException("For determining the existence of a property, use the Contains predicate");
+        }
+    }
+
+    public HasContainer(final String key, final Contains contains) {
+        this(key, contains, null);
+    }
+
+    public HasContainer(final T accessor, final BiPredicate predicate, final Object value) {
+        this(accessor.getAccessor(), predicate, value);
+    }
+
+    public HasContainer(final T accessor, final Contains contains) {
+        this(accessor.getAccessor(), contains, null);
+    }
+
+    public boolean test(final Element element) {
+        if (null != this.value) {
+            if (this.key.equals(T.id.getAccessor()))
+                return this.predicate.test(element.id(), this.value);
+            else if (this.key.equals(T.label.getAccessor()))
+                return this.predicate.test(element.label(), this.value);
+            else if (element instanceof VertexProperty && this.key.equals(T.value.getAccessor()))
+                return this.predicate.test(((VertexProperty) element).value(), this.value);
+            else if (element instanceof VertexProperty && this.key.equals(T.key.getAccessor()))
+                return this.predicate.test(((VertexProperty) element).key(), this.value);
+            else {
+                if (element instanceof Vertex) {
+                    final Iterator<? extends Property> itty = element.properties(this.key);
+                    while (itty.hasNext()) {
+                        if (this.predicate.test(itty.next().value(), this.value))
+                            return true;
+                    }
+                    return false;
+                } else {
+                    final Property property = element.property(this.key);
+                    return property.isPresent() && this.predicate.test(property.value(), this.value);
+                }
+            }
+        } else {
+            return Contains.within.equals(this.predicate) ?
+                    element.property(this.key).isPresent() :
+                    !element.property(this.key).isPresent();
+        }
+    }
+
+    public static boolean testAll(final Element element, final List<HasContainer> hasContainers) {
+        if (hasContainers.size() == 0)
+            return true;
+        else {
+            for (final HasContainer hasContainer : hasContainers) {
+                if (!hasContainer.test(element))
+                    return false;
+            }
+            return true;
+        }
+    }
+
+    // note that if the user is looking for a label property key (e.g.), then it will look the same as looking for the label of the element.
+    public String toString() {
+        return this.value == null ?
+                (this.predicate == Contains.within ?
+                        '[' + this.key + ']' :
+                        "[!" + this.key + ']') :
+                '[' + this.key + ',' + this.predicate + ',' + this.value + ']';
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
new file mode 100644
index 0000000..608c3f6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ImmutablePath.java
@@ -0,0 +1,182 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ImmutablePath implements Path, Serializable, Cloneable {
+
+    private Path previousPath = HeadPath.instance();
+    private Object currentObject;
+    private Set<String> currentLabels = new HashSet<>();
+
+    protected ImmutablePath() {
+
+    }
+
+    public static Path make() {
+        return HeadPath.instance();
+    }
+
+    @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
+    @Override
+    public ImmutablePath clone() {
+        return this;
+    }
+
+    private ImmutablePath(final Object currentObject, final String... currentLabels) {
+        this(HeadPath.instance(), currentObject, currentLabels);
+    }
+
+    private ImmutablePath(final Path previousPath, final Object currentObject, final String... currentLabels) {
+        this.previousPath = previousPath;
+        this.currentObject = currentObject;
+        if (currentLabels.length > 0)
+            Stream.of(currentLabels).forEach(this.currentLabels::add);
+    }
+
+    @Override
+    public int size() {
+        return this.previousPath.size() + 1;
+    }
+
+    @Override
+    public Path extend(final Object object, final String... labels) {
+        return new ImmutablePath(this, object, labels);
+    }
+
+    @Override
+    public <A> A get(final int index) {
+        return (this.size() - 1) == index ? (A) this.currentObject : this.previousPath.get(index);
+    }
+
+    @Override
+    public boolean hasLabel(final String label) {
+        return this.currentLabels.contains(label) || this.previousPath.hasLabel(label);
+    }
+
+    @Override
+    public void addLabel(final String label) {
+        this.currentLabels.add(label);
+    }
+
+    @Override
+    public List<Object> objects() {
+        final List<Object> objectPath = new ArrayList<>();
+        objectPath.addAll(this.previousPath.objects());
+        objectPath.add(this.currentObject);
+        return Collections.unmodifiableList(objectPath);
+    }
+
+    @Override
+    public List<Set<String>> labels() {
+        final List<Set<String>> labelPath = new ArrayList<>();
+        labelPath.addAll(this.previousPath.labels());
+        labelPath.add(this.currentLabels);
+        return Collections.unmodifiableList(labelPath);
+    }
+
+    @Override
+    public String toString() {
+        return this.objects().toString();
+    }
+
+    private static class HeadPath implements Path {
+        private static final HeadPath INSTANCE = new HeadPath();
+
+        private HeadPath() {
+
+        }
+
+        @Override
+        public int size() {
+            return 0;
+        }
+
+        @Override
+        public Path extend(final Object object, final String... labels) {
+            return new ImmutablePath(object, labels);
+        }
+
+        @Override
+        public <A> A get(final String label) {
+            throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+        }
+
+        @Override
+        public <A> A get(final int index) {
+            return (A) Collections.emptyList().get(index);
+        }
+
+        @Override
+        public boolean hasLabel(final String label) {
+            return false;
+        }
+
+        @Override
+        public void addLabel(final String label) {
+            throw new UnsupportedOperationException("A head path can not have labels added to it");
+        }
+
+        @Override
+        public List<Object> objects() {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public List<Set<String>> labels() {
+            return Collections.emptyList();
+        }
+
+        @Override
+        public boolean isSimple() {
+            return true;
+        }
+
+        @Override
+        public HeadPath clone() {
+            return this;
+        }
+
+        public static Path instance() {
+            return INSTANCE;
+        }
+
+        @Override
+        public boolean equals(final Object object) {
+            return object instanceof HeadPath;
+        }
+
+        @Override
+        public String toString() {
+            return Collections.emptyList().toString();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java
new file mode 100644
index 0000000..261742c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MapHelper.java
@@ -0,0 +1,48 @@
+/*
+ * 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.util;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MapHelper {
+
+    private MapHelper() {
+    }
+
+    public static <T> void incr(final Map<T, Long> map, final T key, final Long value) {
+        map.put(key, value + map.getOrDefault(key, 0l));
+    }
+
+    public static <T> void incr(final Map<T, Double> map, final T key, final Double value) {
+        map.put(key, value + map.getOrDefault(key, 0.0d));
+    }
+
+    public static <T, U> void incr(final Map<T, List<U>> map, final T key, final U value) {
+        map.compute(key, (k, v) -> {
+            if (null == v) v = new ArrayList<>();
+            v.add(value);
+            return v;
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java
new file mode 100644
index 0000000..b62370f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MarkerIdentityStep.java
@@ -0,0 +1,39 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MarkerIdentityStep<S> extends AbstractStep<S, S> {
+
+    public MarkerIdentityStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() throws NoSuchElementException {
+        return this.starts.next();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
new file mode 100644
index 0000000..d458bfb
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/MutablePath.java
@@ -0,0 +1,107 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class MutablePath implements Path, Serializable {
+
+    final protected List<Object> objects;
+    final protected List<Set<String>> labels;
+
+    protected MutablePath() {
+        this(0);
+    }
+
+    private MutablePath(final int capacity) {
+        this.objects = new ArrayList<>(capacity);
+        this.labels = new ArrayList<>(capacity);
+    }
+
+    public static Path make() {
+        return new MutablePath();
+    }
+
+    @Override
+    @SuppressWarnings("CloneDoesntCallSuperClone,CloneDoesntDeclareCloneNotSupportedException")
+    public MutablePath clone() {
+        final MutablePath clone = new MutablePath(this.objects.size());
+        // TODO: Why is this not working Hadoop serialization-wise?... Its cause DetachedPath's clone needs to detach on clone.
+        /*final MutablePath clone = (MutablePath) super.clone();
+        clone.objects = new ArrayList<>();
+        clone.labels = new ArrayList<>();*/
+        clone.objects.addAll(this.objects);
+        clone.labels.addAll(this.labels);
+        return clone;
+    }
+
+
+    @Override
+    public int size() {
+        return this.objects.size();
+    }
+
+    @Override
+    public Path extend(final Object object, final String... labels) {
+        this.objects.add(object);
+        this.labels.add(Stream.of(labels).collect(Collectors.toSet()));
+        return this;
+    }
+
+    @Override
+    public <A> A get(int index) {
+        return (A) this.objects.get(index);
+    }
+
+    @Override
+    public boolean hasLabel(final String label) {
+        return this.labels.stream().filter(l -> l.contains(label)).findAny().isPresent();
+    }
+
+    @Override
+    public void addLabel(final String label) {
+        this.labels.get(this.labels.size() - 1).add(label);
+    }
+
+    @Override
+    public List<Object> objects() {
+        return Collections.unmodifiableList(this.objects);
+    }
+
+    @Override
+    public List<Set<String>> labels() {
+        return Collections.unmodifiableList(this.labels);
+    }
+
+    @Override
+    public String toString() {
+        return this.objects.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
new file mode 100644
index 0000000..ef26d9e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/PathIdentityStep.java
@@ -0,0 +1,48 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PathIdentityStep<S> extends AbstractStep<S, S> {
+
+    public PathIdentityStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() throws NoSuchElementException {
+        return this.starts.next();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.PATH);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
new file mode 100644
index 0000000..e709741
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ReducingBarrierStep.java
@@ -0,0 +1,179 @@
+/*
+ * 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.util;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.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.computer.util.VertexProgramHelper;
+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.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Iterator;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer, EngineDependent {
+
+    public static final String REDUCING = Graph.Hidden.hide("reducing");
+
+    protected Supplier<E> seedSupplier;
+    protected BiFunction<E, Traverser<S>, E> reducingBiFunction;
+    private boolean done = false;
+    protected boolean byPass = false;
+
+    public ReducingBarrierStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    public void setSeedSupplier(final Supplier<E> seedSupplier) {
+        this.seedSupplier = seedSupplier;
+    }
+
+    public void setBiFunction(final BiFunction<E, Traverser<S>, E> reducingBiFunction) {
+        this.reducingBiFunction = reducingBiFunction;
+    }
+
+    @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        this.byPass = traversalEngine.isComputer();
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.done = false;
+    }
+
+    @Override
+    public Traverser<E> processNextStart() {
+        if (this.byPass) {
+            return (Traverser<E>) this.starts.next();
+        } else {
+            if (this.done)
+                throw FastNoSuchElementException.instance();
+            E seed = this.seedSupplier.get();
+            while (this.starts.hasNext())
+                seed = this.reducingBiFunction.apply(seed, this.starts.next());
+            this.done = true;
+            return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(seed), (Step) this, 1l);
+        }
+    }
+
+    @Override
+    public ReducingBarrierStep<S, E> clone() {
+        final ReducingBarrierStep<S, E> clone = (ReducingBarrierStep<S, E>) super.clone();
+        clone.done = false;
+        return clone;
+    }
+
+    @Override
+    public MapReduce getMapReduce() {
+        return new DefaultMapReduce(this.seedSupplier, this.reducingBiFunction);
+    }
+
+    ///////
+
+    public static class DefaultMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Object> {
+
+        private static final String REDUCING_BARRIER_STEP_SEED_SUPPLIER = "gremlin.reducingBarrierStep.seedSupplier";
+        private static final String REDUCING_BARRIER_STEP_BI_FUNCTION = "gremlin.reducingBarrierStep.biFunction";
+
+        private BiFunction biFunction;
+        private Supplier seedSupplier;
+
+        private DefaultMapReduce() {
+        }
+
+        public DefaultMapReduce(final Supplier seedSupplier, final BiFunction biFunction) {
+            this.seedSupplier = seedSupplier;
+            this.biFunction = biFunction;
+
+        }
+
+        @Override
+        public void storeState(final Configuration configuration) {
+            super.storeState(configuration);
+            VertexProgramHelper.serialize(this.seedSupplier, configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
+            VertexProgramHelper.serialize(this.biFunction, configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
+
+        }
+
+        public void loadState(final Configuration configuration) {
+            this.seedSupplier = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
+            this.biFunction = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return !stage.equals(Stage.COMBINE);
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public Object generateFinalResult(final Iterator keyValues) {
+            return ((KeyValue) keyValues.next()).getValue();
+
+        }
+
+        @Override
+        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 NullObject key, final Iterator<Object> values, final ReduceEmitter<NullObject, Object> emitter) {
+            Object mutatingSeed = this.seedSupplier.get();
+            while (values.hasNext()) {
+                mutatingSeed = this.biFunction.apply(mutatingSeed, values.next());
+            }
+            emitter.emit(FinalGet.tryFinalGet(mutatingSeed));
+        }
+    }
+
+    /////
+
+    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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java
new file mode 100644
index 0000000..2f55759
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SparsePath.java
@@ -0,0 +1,95 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class SparsePath implements Path, Serializable {
+
+    private final Map<String, Object> map = new HashMap<>();
+    private Object currentObject = null;
+
+    protected SparsePath() {
+
+    }
+
+    public static SparsePath make() {
+        return new SparsePath();
+    }
+
+    @Override
+    public Path extend(final Object object, final String... labels) {
+        this.currentObject = object;
+        if (labels.length > 0)
+            Stream.of(labels).forEach(label -> this.map.put(label, object));
+        return this;
+    }
+
+    @Override
+    public void addLabel(final String label) {
+        this.map.put(label, this.currentObject);
+    }
+
+    @Override
+    public List<Object> objects() {
+        return Collections.unmodifiableList(new ArrayList<>(this.map.values()));
+    }
+
+    @Override
+    public List<Set<String>> labels() {
+        final List<Set<String>> labels = new ArrayList<>();
+        this.map.forEach((k, v) -> labels.add(Collections.singleton(k)));
+        return Collections.unmodifiableList(labels);
+    }
+
+
+    public <A> A get(final String label) throws IllegalArgumentException {
+        final Object object = this.map.get(label);
+        if (null == object)
+            throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
+        return (A) object;
+    }
+
+    @Override
+    public boolean hasLabel(final String label) {
+        return this.map.containsKey(label);
+    }
+
+    @Override
+    public Path clone() {
+        return this;
+    }
+
+    @Override
+    public int size() {
+        return this.map.size();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
new file mode 100644
index 0000000..42f4394
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
@@ -0,0 +1,63 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SupplyingBarrierStep<S, E> extends AbstractStep<S, E> {
+
+    private boolean done = false;
+
+    public SupplyingBarrierStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    public abstract E supply();
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.done = false;
+    }
+
+    @Override
+    public Traverser<E> processNextStart() {
+        if (this.done)
+            throw FastNoSuchElementException.instance();
+        while (this.starts.hasNext())
+            this.starts.next();
+        this.done = true;
+        return this.getTraversal().asAdmin().getTraverserGenerator().generate(this.supply(), (Step) this, 1l);
+    }
+
+    @Override
+    public SupplyingBarrierStep<S, E> clone() {
+        final SupplyingBarrierStep<S, E> clone = (SupplyingBarrierStep<S, E>) super.clone();
+        clone.done = false;
+        return clone;
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java
new file mode 100644
index 0000000..2fe164b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/TraversalComparator.java
@@ -0,0 +1,57 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalComparator<S, E> implements Comparator<S>, Serializable, Cloneable {
+
+    private Traversal.Admin<S, E> traversal;
+    private final Comparator<E> comparator;
+
+    public TraversalComparator(final Traversal.Admin<S, E> traversal, final Comparator<E> comparator) {
+        this.traversal = traversal;
+        this.comparator = comparator;
+    }
+
+    @Override
+    public String toString() {
+        return this.comparator.toString() + "(" + this.traversal + ")";
+    }
+
+    @Override
+    public int compare(final S start1, final S start2) {
+        return this.comparator.compare(TraversalUtil.apply(start1, this.traversal), TraversalUtil.apply(start2, this.traversal));
+    }
+
+    @Override
+    public TraversalComparator clone() throws CloneNotSupportedException {
+        final TraversalComparator clone = (TraversalComparator) super.clone();
+        clone.traversal = this.traversal.clone();
+        return clone;
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java
new file mode 100644
index 0000000..be60a27
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Tree.java
@@ -0,0 +1,134 @@
+/*
+ * 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.util;
+
+import java.io.Serializable;
+import java.util.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class Tree<T> extends HashMap<T, Tree<T>> implements Serializable {
+
+    public Tree() {
+        super();
+    }
+
+    @SafeVarargs
+    public Tree(final T... children) {
+        this();
+        for (final T t : children) {
+            this.put(t, new Tree<>());
+        }
+    }
+
+    @SafeVarargs
+    public Tree(final Map.Entry<T, Tree<T>>... children) {
+        this();
+        for (final Map.Entry<T, Tree<T>> entry : children) {
+            this.put(entry.getKey(), entry.getValue());
+        }
+    }
+
+
+    public List<Tree<T>> getTreesAtDepth(final int depth) {
+        List<Tree<T>> currentDepth = Collections.singletonList(this);
+        for (int i = 0; i < depth; i++) {
+            if (i == depth - 1) {
+                return currentDepth;
+            } else {
+                final List<Tree<T>> temp = new ArrayList<Tree<T>>();
+                for (final Tree<T> t : currentDepth) {
+                    temp.addAll(t.values());
+                }
+                currentDepth = temp;
+            }
+        }
+        return Collections.emptyList();
+    }
+
+    public List<T> getObjectsAtDepth(final int depth) {
+        final List<T> list = new ArrayList<T>();
+        for (final Tree<T> t : this.getTreesAtDepth(depth)) {
+            list.addAll(t.keySet());
+        }
+        return list;
+    }
+
+    public List<Tree<T>> getLeafTrees() {
+        final List<Tree<T>> leaves = new ArrayList<>();
+        List<Tree<T>> currentDepth = Collections.singletonList(this);
+        boolean allLeaves = false;
+        while (!allLeaves) {
+            allLeaves = true;
+            final List<Tree<T>> temp = new ArrayList<>();
+            for (final Tree<T> t : currentDepth) {
+                if (t.isLeaf()) {
+                    for (Map.Entry<T, Tree<T>> t2 : t.entrySet()) {
+                        leaves.add(new Tree<T>(t2));
+                    }
+                } else {
+                    allLeaves = false;
+                    temp.addAll(t.values());
+                }
+            }
+            currentDepth = temp;
+
+        }
+        return leaves;
+    }
+
+    public List<T> getLeafObjects() {
+        final List<T> leaves = new ArrayList<T>();
+        for (final Tree<T> t : this.getLeafTrees()) {
+            leaves.addAll(t.keySet());
+        }
+        return leaves;
+    }
+
+    public boolean isLeaf() {
+        final Collection<Tree<T>> values = this.values();
+        return values.iterator().next().isEmpty();
+
+    }
+
+    public void addTree(final Tree<T> tree) {
+        tree.forEach((k, t) -> {
+            if (this.containsKey(k)) {
+                this.get(k).addTree(t);
+            } else {
+                this.put(k, t);
+            }
+        });
+    }
+
+    public List<Tree<T>> splitParents() {
+        if (this.keySet().size() == 1) {
+            return Collections.singletonList(this);
+        } else {
+            final List<Tree<T>> parents = new ArrayList<>();
+            this.forEach((k, t) -> {
+                final Tree<T> parentTree = new Tree<>();
+                parentTree.put(k, t);
+                parents.add(parentTree);
+            });
+            return parents;
+        }
+    }
+}


[07/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java
new file mode 100644
index 0000000..f88ff13
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java
@@ -0,0 +1,255 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class LocalTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
+
+    public abstract Traversal<Vertex, Long> get_g_V_localXoutE_countX();
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
+
+    public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id);
+
+    public abstract Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name();
+
+    @Test
+    @LoadGraphWith(CREW)
+    public void g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+        final Traversal<Vertex, String> traversal = get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("brussels", "san diego", "centreville", "dulles", "baltimore", "bremen", "aachen", "kaiserslautern"), traversal);
+
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_by() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            final Map<String, Object> map = traversal.next();
+            counter++;
+            assertEquals(2, map.size());
+            if (map.get("a").equals("marko")) {
+                assertEquals(convertToVertexId("lop"), map.get("b"));
+            } else if (map.get("a").equals("josh")) {
+                assertTrue(convertToVertexId("lop").equals(map.get("b")) || convertToVertexId("ripple").equals(map.get("b")));
+            } else if (map.get("a").equals("peter")) {
+                assertEquals(convertToVertexId("lop"), map.get("b"));
+            } else {
+                fail("The following map should not have been returned: " + map);
+            }
+        }
+        assertEquals(4, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_localXoutE_countX() {
+        final Traversal<Vertex, Long> traversal = get_g_V_localXoutE_countX();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList(3l, 0l, 0l, 0l, 1l, 2l), traversal);
+
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_localXbothEXknows_createdX_limitX1XX() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEXknows_createdX_limitX1XX(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        final Edge edge = traversal.next();
+        assertTrue(edge.label().equals("created") || edge.label().equals("knows"));
+        assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_localXbothE_limitX1XX_otherV_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX1XX_otherV_name(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String name = traversal.next();
+            assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
+        }
+        assertEquals(1, counter);
+        assertFalse(traversal.hasNext());
+
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_localXbothE_limitX2XX_otherV_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX2XX_otherV_name(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String name = traversal.next();
+            assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
+        }
+        assertEquals(2, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_localXinEXknowsX_limitX2XX_outV_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_localXinEXknowsX_limitX2XX_outV_name();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertEquals(traversal.next(), "marko");
+        }
+        assertFalse(traversal.hasNext());
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_localXbothEX1_createdX_limitX1XX() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEX1_createdX_limitX1XX(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        final Edge edge = traversal.next();
+        assertEquals("created", edge.label());
+        assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_localXoutEXknowsX_limitX1XX_inV_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        final String name = traversal.next();
+        assertTrue(name.equals("vadas") || name.equals("josh"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String name = traversal.next();
+            assertTrue(name.equals("marko") || name.equals("lop") || name.equals("josh") || name.equals("ripple") || name.equals("peter"));
+        }
+        assertEquals(5, counter);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends LocalTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+            return g.V().local(properties("location").order().by(T.value, Order.incr).range(0, 2)).value();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
+            return g.V().has(T.label, "person").as("a").local(out("created").as("b")).select("a", "b").by("name").by(T.id);
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
+            return g.V().local(outE().count());
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
+            return g.V(v1Id).local(outE("knows").limit(1)).inV().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+            return g.V().local(bothE("created").limit(1)).otherV().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
+            return g.V(v4Id).local(bothE("created").limit(1));
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
+            return g.V(v4Id).local(bothE("knows", "created").limit(1));
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
+            return g.V(v4Id).local(bothE().limit(1)).otherV().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
+            return g.V(v4Id).local(bothE().limit(2)).otherV().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
+            return g.V().local(inE("knows").limit(2)).outV().values("name");
+        }
+
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
new file mode 100644
index 0000000..1d26d88
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatTest.java
@@ -0,0 +1,272 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class RepeatTest extends AbstractGremlinProcessTest {
+
+    // DO/WHILE
+
+    public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path();
+
+    public abstract Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit();
+
+    // WHILE/DO
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path();
+
+    public abstract Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path();
+
+    public abstract Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id);
+
+    // SIDE-EFFECTS
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX();
+
+    // TODO:
+    /*
+    gremlin> g.V(1).repeat(out()).until(outE().count().cap().filter{it.get() == 0}).path().by('name') (3)
+    ==>[marko, lop]
+    ==>[marko, vadas]
+    ==>[marko, josh, ripple]
+    ==>[marko, josh, lop]
+     */
+
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXoutX_timesX2X_emit_path() {
+        final List<Traversal<Vertex, Path>> traversals = new ArrayList<>();
+        traversals.add(get_g_V_repeatXoutX_timesX2X_emit_path());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<Integer, Long> pathLengths = new HashMap<>();
+            int counter = 0;
+            while (traversal.hasNext()) {
+                counter++;
+                MapHelper.incr(pathLengths, traversal.next().size(), 1l);
+            }
+            assertEquals(2, pathLengths.size());
+            assertEquals(8, counter);
+            assertEquals(new Long(6), pathLengths.get(2));
+            assertEquals(new Long(2), pathLengths.get(3));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+        final List<Traversal<Vertex, String>> traversals = new ArrayList<>();
+        traversals.add(get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            checkResults(Arrays.asList("marko", "marko"), traversal);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXoutX_timesX2X() {
+        final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
+        traversals.add(get_g_V_repeatXoutX_timesX2X());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            int counter = 0;
+            while (traversal.hasNext()) {
+                counter++;
+                Vertex vertex = traversal.next();
+                assertTrue(vertex.value("name").equals("lop") || vertex.value("name").equals("ripple"));
+            }
+            assertEquals(2, counter);
+            assertFalse(traversal.hasNext());
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXoutX_timesX2X_emit() {
+        final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
+        traversals.add(get_g_V_repeatXoutX_timesX2X_emit());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            Map<String, Long> map = new HashMap<>();
+            while (traversal.hasNext()) {
+                Vertex vertex = traversal.next();
+                MapHelper.incr(map, vertex.value("name"), 1l);
+            }
+            assertEquals(4, map.size());
+            assertTrue(map.containsKey("vadas"));
+            assertTrue(map.containsKey("josh"));
+            assertTrue(map.containsKey("ripple"));
+            assertTrue(map.containsKey("lop"));
+            assertEquals(new Long(1), map.get("vadas"));
+            assertEquals(new Long(1), map.get("josh"));
+            assertEquals(new Long(2), map.get("ripple"));
+            assertEquals(new Long(4), map.get("lop"));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_timesX2X_repeatXoutX_name() {
+        final List<Traversal<Vertex, String>> traversals = Arrays.asList(
+                get_g_VX1X_timesX2X_repeatXoutX_name(convertToVertexId("marko")));
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            checkResults(Arrays.asList("lop", "ripple"), traversal);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_emit_timesX2X_repeatXoutX_path() {
+        final List<Traversal<Vertex, Path>> traversals = Arrays.asList(
+                get_g_V_emit_timesX2X_repeatXoutX_path(),
+                get_g_V_emit_repeatXoutX_timesX2X_path());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            int path1 = 0;
+            int path2 = 0;
+            int path3 = 0;
+            while (traversal.hasNext()) {
+                final Path path = traversal.next();
+                if (path.size() == 1) {
+                    path1++;
+                } else if (path.size() == 2) {
+                    path2++;
+                } else if (path.size() == 3) {
+                    path3++;
+                } else {
+                    fail("Only path lengths of 1, 2, or 3 should be seen");
+                }
+            }
+            assertEquals(6, path1);
+            assertEquals(6, path2);
+            assertEquals(2, path3);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_emitXhasXlabel_personXX_repeatXoutX_name() {
+        final List<Traversal<Vertex, String>> traversals = Arrays.asList(get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(convertToVertexId("marko")));
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            checkResults(Arrays.asList("marko", "josh", "vadas"), traversal);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+        final List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Map<String, Long> map = traversal.next();
+            assertFalse(traversal.hasNext());
+            //[ripple:2, peter:1, vadas:2, josh:2, lop:4, marko:1]
+            assertEquals(6, map.size());
+            assertEquals(1l, map.get("marko").longValue());
+            assertEquals(2l, map.get("vadas").longValue());
+            assertEquals(2l, map.get("josh").longValue());
+            assertEquals(4l, map.get("lop").longValue());
+            assertEquals(2l, map.get("ripple").longValue());
+            assertEquals(1l, map.get("peter").longValue());
+        });
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends RepeatTest {
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
+            return g.V().repeat(out()).times(2).emit().path();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+            return g.V().repeat(out()).times(2).repeat(in()).times(2).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
+            return g.V().repeat(out()).times(2);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
+            return g.V().repeat(out()).times(2).emit();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
+            return g.V(v1Id).times(2).repeat(out()).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
+            return g.V().emit().repeat(out()).times(2).path();
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
+            return g.V().emit().times(2).repeat(out()).path();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
+            return g.V(v1Id).emit(has(T.label, "person")).repeat(out()).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+            return g.V().repeat(groupCount("m").by("name").out()).times(2).cap("m");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
new file mode 100644
index 0000000..6c90288
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionTest.java
@@ -0,0 +1,194 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class UnionTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_V_unionXout__inX_name();
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
+
+    public abstract Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_unionXout__inX_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_unionXout__inX_name();
+        printTraversalForm(traversal);
+        checkResults(new HashMap<String, Long>() {{
+            put("marko", 3l);
+            put("lop", 3l);
+            put("peter", 1l);
+            put("ripple", 1l);
+            put("josh", 3l);
+            put("vadas", 1l);
+        }}, traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_unionXrepeatXoutX_timesX2X__outX_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        checkResults(new HashMap<String, Long>() {{
+            put("lop", 2l);
+            put("ripple", 1l);
+            put("josh", 1l);
+            put("vadas", 1l);
+        }}, traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX() {
+        final Traversal<Vertex, String> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
+        printTraversalForm(traversal);
+        checkResults(new HashMap<String, Long>() {{
+            put("lop", 3l);
+            put("ripple", 1l);
+            put("java", 4l);
+            put("josh", 1l);
+            put("vadas", 1l);
+            put("person", 4l);
+        }}, traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
+        printTraversalForm(traversal);
+        final Map<String, Long> groupCount = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(3l, groupCount.get("lop").longValue());
+        assertEquals(1l, groupCount.get("ripple").longValue());
+        assertEquals(4l, groupCount.get("java").longValue());
+        assertEquals(1l, groupCount.get("josh").longValue());
+        assertEquals(1l, groupCount.get("vadas").longValue());
+        assertEquals(4l, groupCount.get("person").longValue());
+        assertEquals(6, groupCount.size());
+
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
+        printTraversalForm(traversal);
+        final Map<String, Long> groupCount = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(12l, groupCount.get("software").longValue());
+        assertEquals(20l, groupCount.get("person").longValue());
+        assertEquals(2, groupCount.size());
+
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX() {
+        final Traversal<Vertex, Number> traversal = get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(convertToVertexId("marko"), convertToVertexId("vadas"));
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Number startNumber = traversal.next();
+        assertTrue(traversal.hasNext());
+        if (startNumber.longValue() == 3l) {
+            assertEquals(0l, traversal.next().longValue());
+            assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
+            //
+            assertEquals(0l, traversal.next().longValue());
+            assertEquals(1l, traversal.next().longValue());
+            assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
+        } else {
+            assertEquals(1l, traversal.next().longValue());
+            assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
+            //
+            assertEquals(3l, traversal.next().longValue());
+            assertEquals(0l, traversal.next().longValue());
+            assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
+        }
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends UnionTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
+            return g.V().union(out(), in()).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
+            return g.V(v1Id).union(repeat(out()).times(2), out()).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
+            return g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label());
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+            return (Traversal) g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label()).groupCount();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+            return (Traversal) g.V().union(
+                    repeat(union(
+                            out("created"),
+                            in("created"))).times(2),
+                    repeat(union(
+                            in("created"),
+                            out("created"))).times(2)).label().groupCount();
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id) {
+            return g.V(v1Id, v2Id).union(outE().count(), inE().count(), (Traversal) outE().values("weight").sum());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
new file mode 100644
index 0000000..baf5e4f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndTest.java
@@ -0,0 +1,79 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AndTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
+
+    public abstract Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("marko", "josh"), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_andXout__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("josh", "peter"), traversal);
+    }
+
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends AndTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+            return g.V().and(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+            return g.V().and(outE(), has(T.label, "person").and().has("age", Compare.gte, 32)).values("name");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java
new file mode 100644
index 0000000..40a8eb2
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinTest.java
@@ -0,0 +1,84 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CoinTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_coinX1X();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_coinX0X();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_coinX1X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_coinX1X();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            traversal.next();
+        }
+        assertEquals(6, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_coinX0X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_coinX0X();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            traversal.next();
+        }
+        assertEquals(0, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends CoinTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
+            return g.V().coin(1.0d);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
+            return g.V().coin(0.0d);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java
new file mode 100644
index 0000000..6dce036
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CyclicPathTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1);
+
+    public abstract Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            assertEquals("marko", vertex.<String>value("name"));
+        }
+        assertEquals(1, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path() {
+        final Traversal<Vertex, Path> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Path path = traversal.next();
+            assertFalse(path.isSimple());
+        }
+        assertEquals(1, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends CyclicPathTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
+            return g.V(v1Id).out("created").in("created").cyclicPath();
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
+            return g.V(v1Id).out("created").in("created").cyclicPath().path();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java
new file mode 100644
index 0000000..fd199c5
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.dedup;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class DedupTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_V_both_dedup_name();
+
+    public abstract Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
+
+    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();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_both_dedup_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_both_dedup_name();
+        printTraversalForm(traversal);
+        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(6, names.size());
+        assertTrue(names.contains("marko"));
+        assertTrue(names.contains("vadas"));
+        assertTrue(names.contains("lop"));
+        assertTrue(names.contains("josh"));
+        assertTrue(names.contains("ripple"));
+        assertTrue(names.contains("peter"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
+        printTraversalForm(traversal);
+        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(1, names.size());
+        assertTrue(names.contains("lop") || names.contains("ripple"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_both_name_orderXa_bX_dedup() {
+        final Traversal<Vertex, String> traversal = get_g_V_both_name_orderXa_bX_dedup();
+        printTraversalForm(traversal);
+        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(6, names.size());
+        assertEquals("josh", names.get(0));
+        assertEquals("lop", names.get(1));
+        assertEquals("marko", names.get(2));
+        assertEquals("peter", names.get(3));
+        assertEquals("ripple", names.get(4));
+        assertEquals("vadas", names.get(5));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
+        final Traversal<Vertex, Map<String, Set<Double>>> traversal =
+                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Set<Double>> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertEquals(3, map.get("software").size());
+        assertEquals(4, map.get("person").size());
+        assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 1.0)), map.get("software"));
+        assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 0.5, 1.0)), map.get("person"));
+    }
+
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends DedupTest {
+        @Override
+        public Traversal<Vertex, String> get_g_V_both_dedup_name() {
+            return g.V().both().dedup().values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+            return g.V().both().has(T.label, "software").dedup().by("lang").values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
+            return g.V().both().<String>properties("name").order().by((a, b) -> a.value().compareTo(b.value())).dedup().value();
+        }
+
+        @Override
+        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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java
new file mode 100644
index 0000000..c7bce37
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptTest.java
@@ -0,0 +1,186 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class ExceptTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_exceptXX();
+
+    public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_out_exceptXg_v2X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_exceptXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("lop"));
+        }
+        assertEquals(2, counter);
+        assertEquals(2, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_aggregateXxX_out_exceptXxX() {
+        Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_exceptXxX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertEquals("ripple", traversal.next().<String>value("name"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name() {
+        Traversal<Vertex, String> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        List<String> names = Arrays.asList(traversal.next(), traversal.next());
+        assertFalse(traversal.hasNext());
+        assertEquals(2, names.size());
+        assertTrue(names.contains("peter"));
+        assertTrue(names.contains("josh"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_exceptXg_V_toListX() {
+        Traversal<Vertex, Vertex> traversal = get_g_V_exceptXg_V_toListX();
+        printTraversalForm(traversal);
+        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(0, vertices.size());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_exceptXX() {
+        Traversal<Vertex, Vertex> traversal = get_g_V_exceptXX();
+        printTraversalForm(traversal);
+        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(6, vertices.size());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path() {
+        Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(4, paths.size());
+        assertEquals(1, paths.stream().filter(path -> path.size() == 3).count());
+        assertEquals(2, paths.stream().filter(path -> path.size() == 5).count());
+        assertEquals(1, paths.stream().filter(path -> path.size() == 7).count());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("peter", "josh"), traversal);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class StandardTest extends ExceptTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
+            return g.V(v1Id).out().except(g.V(v2Id).next());
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
+            return g.V(v1Id).out().aggregate("x").out().except("x");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
+            return g.V(v1Id).out("created").in("created").except(g.V(v1Id).next()).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
+            return g.V().except(g.V().toList());
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
+            return g.V().except(Collections.emptyList());
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id) {
+            return g.V(v1Id).repeat(bothE("created").except("e").aggregate("e").otherV()).emit().path();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
+            return g.V(v1Id).as("a").out("created").in("created").except("a").values("name");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java
new file mode 100644
index 0000000..eff88b8
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterTest.java
@@ -0,0 +1,221 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class FilterTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_filterXfalseX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_filterXtrueX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
+
+    public abstract Traversal<Edge, Edge> get_g_E_filterXfalseX();
+
+    public abstract Traversal<Edge, Edge> get_g_E_filterXtrueX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_filterXfalseX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXfalseX();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_filterXtrueX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXtrueX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        final Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            vertices.add(traversal.next());
+        }
+        assertEquals(6, counter);
+        assertEquals(6, vertices.size());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_filterXlang_eq_javaX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXlang_eq_javaX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("ripple") ||
+                    vertex.value("name").equals("lop"));
+        }
+        assertEquals(2, counter);
+        assertEquals(2, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_filterXage_gt_30X() {
+        Traversal<Vertex, Vertex> traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+        traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_out_filterXage_gt_30X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_filterXage_gt_30X(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            vertices.add(vertex);
+            assertTrue(vertex.value("name").equals("marko") ||
+                    vertex.value("name").equals("peter"));
+        }
+        assertEquals(counter, 2);
+        assertEquals(vertices.size(), 2);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_E_filterXfalseX() {
+        final Traversal<Edge, Edge> traversal = get_g_E_filterXfalseX();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_E_filterXtrueX() {
+        final Traversal<Edge, Edge> traversal = get_g_E_filterXtrueX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        final Set<Edge> edges = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            edges.add(traversal.next());
+        }
+        assertEquals(6, counter);
+        assertEquals(6, edges.size());
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends FilterTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
+            return g.V().filter(v -> false);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
+            return g.V().filter(v -> true);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
+            return g.V().filter(v -> v.get().<String>property("lang").orElse("none").equals("java"));
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
+            return g.V(v1Id).filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
+            return g.V(v1Id).out().filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+            return g.V().filter(v -> {
+                final String name = v.get().value("name");
+                return name.startsWith("m") || name.startsWith("p");
+            });
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
+            return g.E().filter(e -> false);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
+            return g.E().filter(e -> true);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
new file mode 100644
index 0000000..e7b5b8b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasNotTest.java
@@ -0,0 +1,98 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class HasNotTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey);
+
+    public abstract Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_hasNotXprop() {
+        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "circumference");
+        printTraversalForm(traversal);
+        assertEquals("marko", traversal.next().<String>value("name"));
+        assertFalse(traversal.hasNext());
+        traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "name");
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasNotXprop() {
+        Traversal<Vertex, Vertex> traversal = get_g_V_hasNotXprop("circumference");
+        printTraversalForm(traversal);
+        final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(6, list.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasNotXoutXcreatedXX() {
+        Traversal<Vertex, String> traversal = get_g_V_hasNotXoutXcreatedXX();
+        checkResults(Arrays.asList("vadas", "lop", "ripple"), traversal);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends HasNotTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
+            return g.V(v1Id).hasNot(propertyKey);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
+            return g.V().hasNot(propertyKey);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
+            return g.V().hasNot(__.out("created")).values("name");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
new file mode 100644
index 0000000..ad5db85
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java
@@ -0,0 +1,325 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+import static org.junit.Assume.assumeTrue;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class HasTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name();
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_markoX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_blahX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasXblahX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X();
+
+    public abstract Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id);
+
+    public abstract Traversal<Edge, Edge> get_g_E_hasLabelXknowsX();
+
+    public abstract Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX();
+
+    public abstract Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age();
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_outXknowsX_hasXoutXcreatedXX_valuesXnameX() {
+        Traversal<Vertex, String> traversal = get_g_V_outXknowsX_hasXoutXcreatedXX_name();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("josh"), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_hasXkeyX() {
+        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "name");
+        printTraversalForm(traversal);
+        assertEquals("marko", traversal.next().<String>value("name"));
+        assertFalse(traversal.hasNext());
+        //
+        traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "circumference");
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_hasXname_markoX() {
+        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertEquals("marko", traversal.next().<String>value("name"));
+        assertFalse(traversal.hasNext());
+        traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("vadas"));
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXname_markoX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_markoX();
+        printTraversalForm(traversal);
+        assertEquals("marko", traversal.next().<String>value("name"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXname_blahX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_blahX();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXage_gt_30X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXage_gt_30X();
+        printTraversalForm(traversal);
+        final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(2, list.size());
+        for (final Element v : list) {
+            assertTrue(v.<Integer>value("age") > 30);
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_hasXage_gt_30X() {
+        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+        traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_hasXid_2X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_hasIdX2X(convertToVertexId("marko"), convertToVertexId("vadas"));
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        assertEquals(convertToVertexId("vadas"), traversal.next().id());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXblahX() {
+        assumeTrue(graphMeetsTestRequirements());
+        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXblahX();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_EX7X_hasXlabelXknowsX() {
+        //System.out.println(convertToEdgeId("marko", "knows", "vadas"));
+        Traversal<Edge, Edge> traversal = get_g_EX7X_hasLabelXknowsX(convertToEdgeId("marko", "knows", "vadas"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertEquals("knows", traversal.next().label());
+        }
+        assertEquals(1, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_E_hasXlabelXknowsX() {
+        final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXknowsX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertEquals("knows", traversal.next().label());
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(CREW)
+    public void g_E_hasXlabelXuses_traversesX() {
+        final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXuses_traversesX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String label = traversal.next().label();
+            assertTrue(label.equals("uses") || label.equals("traverses"));
+        }
+        assertEquals(9, counter);
+    }
+
+    @Test
+    @LoadGraphWith(CREW)
+    public void g_V_hasXlabelXperson_software_blahX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_hasLabelXperson_software_blahX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String label = traversal.next().label();
+            assertTrue(label.equals("software") || label.equals("person"));
+        }
+        assertEquals(6, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXperson_name_markoX_age() {
+        final Traversal<Vertex, Integer> traversal = get_g_V_hasXperson_name_markoX_age();
+        printTraversalForm(traversal);
+        assertEquals(29, traversal.next().intValue());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outE_hasXweight_inside_0_06X_inV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_hasXweight_inside_0_06X_inV(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        while (traversal.hasNext()) {
+            Vertex vertex = traversal.next();
+            assertTrue(vertex.value("name").equals("vadas") || vertex.value("name").equals("lop"));
+        }
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends HasTest {
+        @Override
+        public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
+            return g.V().out("knows").has(out("created")).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
+            return g.V(v1Id).has(key);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
+            return g.V(v1Id).has("name", "marko");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
+            return g.V().has("name", "marko");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
+            return g.V().has("name", "blah");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
+            return g.V().has("blah");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
+            return g.V(v1Id).has("age", Compare.gt, 30);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
+            return g.V(v1Id).out().hasId(v2Id);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
+            return g.V().has("age", Compare.gt, 30);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
+            return g.E(e7Id).hasLabel("knows");
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
+            return g.E().hasLabel("knows");
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
+            return g.E().hasLabel("uses", "traverses");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
+            return g.V().hasLabel("person", "software", "blah");
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
+            return g.V().has("person", "name", "marko").values("age");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
+            return g.V(v1Id).outE().has("weight", Compare.inside, Arrays.asList(0.0d, 0.6d)).inV();
+        }
+    }
+}
\ No newline at end of file


[05/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java
new file mode 100644
index 0000000..5061b55
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapTest.java
@@ -0,0 +1,152 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.List;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.*;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class MapTest extends AbstractGremlinProcessTest {
+    public abstract Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX();
+
+    public abstract Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_mapXnameX() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_mapXnameX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertEquals(traversal.next(), "marko");
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_outE_label_mapXlengthX() {
+        final Traversal<Vertex, Integer> traversal = get_g_VX1X_outE_label_mapXlengthX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        List<Integer> lengths = traversal.toList();
+        assertTrue(lengths.contains("created".length()));
+        assertTrue(lengths.contains("knows".length()));
+        assertEquals(lengths.size(), 3);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_out_mapXnameX_mapXlengthX() {
+        final Traversal<Vertex, Integer> traversal = get_g_VX1X_out_mapXnameX_mapXlengthX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        final List<Integer> lengths = traversal.toList();
+        assertTrue(lengths.contains("josh".length()));
+        assertTrue(lengths.contains("vadas".length()));
+        assertTrue(lengths.contains("lop".length()));
+        assertEquals(lengths.size(), 3);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_asXaX_out_mapXa_nameX() {
+        int marko = 0;
+        int peter = 0;
+        int josh = 0;
+        int other = 0;
+
+        final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_mapXa_nameX();
+        printTraversalForm(traversal);
+        while (traversal.hasNext()) {
+            final String name = traversal.next();
+            if (name.equals("marko")) marko++;
+            else if (name.equals("peter")) peter++;
+            else if (name.equals("josh")) josh++;
+            else other++;
+        }
+        assertEquals(marko, 3);
+        assertEquals(josh, 2);
+        assertEquals(peter, 1);
+        assertEquals(other, 0);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
+        final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_out_mapXa_name_it_nameX();
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String doubleName = traversal.next();
+            assertTrue("markoripple".equals(doubleName) || "markolop".equals(doubleName));
+        }
+        assertEquals(2, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends MapTest {
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
+            return g.V(v1Id).<String>map(v -> v.get().value("name"));
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
+            return g.V(v1Id).outE().label().map(l -> l.get().length());
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
+            return g.V(v1Id).out().map(v -> v.get().value("name")).map(n -> n.get().toString().length());
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
+            return g.V().as("a").out().<String>map(v -> v.<Vertex>path("a").value("name"));
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
+            return g.V().as("a").out().out().map(v -> v.<Vertex>path("a").<String>value("name") + v.get().<String>value("name"));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
new file mode 100644
index 0000000..b60506d
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
@@ -0,0 +1,931 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.Bindings;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.CrossJoinEnumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.Enumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.InnerJoinEnumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.IteratorEnumerator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.MatchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MatchTest extends AbstractGremlinProcessTest {
+
+    // very basic query
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX();
+
+    // query with selection
+    public abstract Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX();
+
+    // linked traversals
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX();
+
+    // a basic tree with two leaves
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX();
+
+    // a tree with three leaves
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
+
+    // illustrates early deduplication in "predicate" traversals
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX();
+
+    public abstract Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
+
+    // contains a cycle
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX();
+
+    // contains an unreachable label
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX();
+
+    // nested match()
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
+
+    // contains a pair of traversals which connect the same labels, together with a predicate traversal
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
+
+    // contains an identical pair of sets of traversals, up to variable names and has() conditions
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
+
+    // forms a non-trivial DAG
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX();
+
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX();
+
+    // inclusion of where
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
+
+    //TODO: with Traversal.reverse()
+    //public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
+
+    //TODO: with Traversal.reverse()
+    // public abstract Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_out_bX() throws Exception {
+        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_out_bX();
+        printTraversalForm(traversal);
+        assertResults(vertexToStr, traversal,
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "lop")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "ripple")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "lop")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "peter")).put("b", convertToVertex(graph, "lop")));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_out_bX_selectXb_idX() throws Exception {
+        final Traversal<Vertex, Object> traversal = get_g_V_matchXa_out_bX_selectXb_idX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        final Object vadasId = convertToVertexId("vadas");
+        final Object joshId = convertToVertexId("josh");
+        final Object lopId = convertToVertexId("lop");
+        final Object rippleId = convertToVertexId("ripple");
+        Map<Object, Long> idCounts = new HashMap<>();
+        while (traversal.hasNext()) {
+            counter++;
+            MapHelper.incr(idCounts, traversal.next(), 1l);
+        }
+        assertFalse(traversal.hasNext());
+        assertEquals(idCounts.get(vadasId), Long.valueOf(1l));
+        assertEquals(idCounts.get(lopId), Long.valueOf(3l));
+        assertEquals(idCounts.get(joshId), Long.valueOf(1l));
+        assertEquals(idCounts.get(rippleId), Long.valueOf(1l));
+        assertEquals(6, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_knows_b__b_created_cX() throws Exception {
+        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__b_created_cX();
+        printTraversalForm(traversal);
+        assertResults(vertexToStr, traversal,
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_knows_b__a_created_cX() throws Exception {
+        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__a_created_cX();
+        printTraversalForm(traversal);
+        assertResults(vertexToStr, traversal,
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")).put("c", convertToVertex(graph, "lop")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() throws Exception {
+        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
+        printTraversalForm(traversal);
+        assertResults(vertexToStr, traversal,
+                new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
+                new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() throws Exception {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        assertResults(Function.identity(), traversal, new Bindings<String>().put("a", "marko").put("b", "lop"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() throws Exception {
+        final List<Traversal<Vertex, Map<String, String>>> traversals = Arrays.asList(
+                get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX(),
+                get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            assertResults(Function.identity(), traversal,
+                    new Bindings<String>().put("a", "marko").put("b", "lop").put("c", "marko"),
+                    new Bindings<String>().put("a", "josh").put("b", "lop").put("c", "marko"),
+                    new Bindings<String>().put("a", "peter").put("b", "lop").put("c", "marko"));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() throws Exception {
+        final Traversal<Vertex, String> traversal = get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
+        printTraversalForm(traversal);
+        assertEquals("lop", traversal.next());
+        assertEquals("lop", traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_created_b__b_0created_aX() {
+        get_g_V_matchXa_created_b__b_0created_aX();
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_knows_b__c_knows_bX() {
+        get_g_V_matchXa_knows_b__c_knows_bX();
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() throws Exception {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
+        printTraversalForm(traversal);
+        assertResults(Function.identity(), traversal,
+                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"),
+                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"), // expected duplicate: two paths to this solution
+                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "marko"),
+                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "peter"));
+    }
+
+    /* TODO: this test requires Traversal.reverse()
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_created_b__c_created_bX_selectXnameX() throws Exception {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Long> countMap = new HashMap<>();
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Map<String, String> bindings = traversal.next();
+            // TODO: c is not being bound
+            // assertEquals(3, bindings.size());
+            assertEquals("lop", bindings.get("b"));
+            MapHelper.incr(countMap, bindings.get("a") + ":" + bindings.get("c"), 1l);
+        }
+        // TODO: without 'c' binding, cant check results
+        // assertEquals(Long.valueOf(1), countMap.get("marko:marko"));
+        //assertEquals(Long.valueOf(1), countMap.get("marko:josh"));
+        //assertEquals(Long.valueOf(1), countMap.get("marko:peter"));
+        //assertEquals(Long.valueOf(1), countMap.get("josh:marko"));
+        //assertEquals(Long.valueOf(1), countMap.get("josh:josh"));
+        //assertEquals(Long.valueOf(1), countMap.get("josh:peter"));
+        //assertEquals(Long.valueOf(1), countMap.get("peter:marko"));
+        //assertEquals(Long.valueOf(1), countMap.get("peter:josh"));
+        //assertEquals(Long.valueOf(1), countMap.get("peter:peter"));
+        //assertEquals(countMap.size(), 9);
+        //assertEquals(9, counter);
+        assertFalse(traversal.hasNext());
+    }
+    */
+
+    /* TODO: this test requires Traversal.reverse()
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() throws Exception {
+        // TODO: Doesn't work, only bindings to 'a' in binding set.
+        final Traversal<Vertex, String> traversal = get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final List<String> results = traversal.toList();
+        assertEquals(2, results.size());
+        assertTrue(results.contains("josh"));
+        assertTrue(results.contains("vadas"));
+    }
+    */
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() throws Exception {
+        Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
+        printTraversalForm(traversal);
+        assertResults(vertexToStr, traversal,
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CREAM PUFF WAR")),
+                new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT")));
+    }
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() throws Exception {
+        Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
+        printTraversalForm(traversal);
+        assertResults(vertexToStr, traversal,
+                new Bindings<Vertex>()
+                        .put("a", convertToVertex(graph, "Garcia"))
+                        .put("b", convertToVertex(graph, "I WANT TO TELL YOU"))
+                        .put("c", convertToVertex(graph, "STIR IT UP"))
+                        .put("d", convertToVertex(graph, "George_Harrison"))
+                        .put("e", convertToVertex(graph, "Bob_Marley")));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() throws Exception {
+        Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
+        assertResults(Function.identity(), traversal,
+                new Bindings<String>().put("a", "marko").put("c", "josh"),
+                new Bindings<String>().put("a", "marko").put("c", "peter"),
+                new Bindings<String>().put("a", "josh").put("c", "marko"),
+                new Bindings<String>().put("a", "josh").put("c", "peter"),
+                new Bindings<String>().put("a", "peter").put("c", "marko"),
+                new Bindings<String>().put("a", "peter").put("c", "josh"));
+    }
+
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() throws Exception {
+        final List<Traversal<Vertex, Map<String, Vertex>>> traversals = Arrays.asList(
+                get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX(),
+                get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX());
+
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            assertResults(vertexToStr, traversal,
+                    new Bindings<Vertex>()
+                            .put("a", convertToVertex(graph, "Garcia"))
+                            .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
+                            .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
+                            .put("d", convertToVertex(graph, "Garcia")),
+                    new Bindings<Vertex>()
+                            .put("a", convertToVertex(graph, "Garcia"))
+                            .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
+                            .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+                            .put("d", convertToVertex(graph, "Garcia")),
+                    new Bindings<Vertex>()
+                            .put("a", convertToVertex(graph, "Garcia"))
+                            .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+                            .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
+                            .put("d", convertToVertex(graph, "Garcia")),
+                    new Bindings<Vertex>()
+                            .put("a", convertToVertex(graph, "Garcia"))
+                            .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+                            .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
+                            .put("d", convertToVertex(graph, "Garcia")),
+                    new Bindings<Vertex>()
+                            .put("a", convertToVertex(graph, "Grateful_Dead"))
+                            .put("b", convertToVertex(graph, "CANT COME DOWN"))
+                            .put("c", convertToVertex(graph, "DOWN SO LONG"))
+                            .put("d", convertToVertex(graph, "Garcia")),
+                    new Bindings<Vertex>()
+                            .put("a", convertToVertex(graph, "Grateful_Dead"))
+                            .put("b", convertToVertex(graph, "THE ONLY TIME IS NOW"))
+                            .put("c", convertToVertex(graph, "DOWN SO LONG"))
+                            .put("d", convertToVertex(graph, "Garcia")));
+        });
+    }
+
+
+    /* TODO: is it necessary to implement each of these traversals three times?
+    @Test
+    @LoadGraphWith(MODERN)
+    public void testTraversalUpdater() throws Exception {
+        assertBranchFactor(
+                2.0,
+                as("a").out("knows").as("b"),
+                new SingleIterator<>(g.V(1)));
+
+        assertBranchFactor(
+                0.0,
+                as("a").out("foo").as("b"),
+                new SingleIterator<>(g.V(1)));
+
+        assertBranchFactor(
+                7.0,
+                as("a").both().both().as("b"),
+                new SingleIterator<>(g.V(1)));
+
+        assertBranchFactor(
+                0.5,
+                as("a").outV().has("name", "marko").as("b"),
+                g.E());
+    }
+    */
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void testOptimization() throws Exception {
+        MatchStep<Object, Object> query;
+        Iterator iter;
+
+        query = new MatchStep<>(g.V().asAdmin(), "d",
+                as("d").in("knows").as("a"),
+                as("d").has("name", "vadas"),
+                as("a").out("knows").as("b"),
+                as("b").out("created").as("c"));
+        iter = g.V();
+        query.optimize();
+        //System.out.println(query.summarize());
+
+        // c costs nothing (no outgoing traversals)
+        assertEquals(0.0, query.findCost("c"), 0);
+        // b-created->c has a cost equal to its branch factor, 1.0
+        // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
+        assertEquals(1.0, query.findCost("b"), 0);
+        // the cost of a-knows->b is its branch factor (1.0) plus the branch factor times the cost of b-created->c (1.0), so 2.0
+        // a has only one outgoing traversal, a-knows->b, so its total cost is 2.0
+        assertEquals(2.0, query.findCost("a"), 0);
+        // the cost of d<-knows-a is its branch factor (1.0) plus the branch factor times the cost of a-knows->b (2.0), so 3.0
+        // the cost of d->has(name,vadas) is its branch factor (1.0)
+        // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
+        //     or 3.0 + 1.0*1.0 = 4.0
+        assertEquals(4.0, query.findCost("d"), 0);
+
+        // apply the query to the graph, gathering non-trivial branch factors
+        assertResults(query.solveFor(iter),
+                new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
+                new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
+        query.optimize();
+        //System.out.println(query.summarize());
+
+        // c still costs nothing (no outgoing traversals)
+        assertEquals(0.0, query.findCost("c"), 0);
+        // b-created->c still has a branch factor of 1.0, as we have put two items in (josh and vadas) and gotten two out (lop and ripple)
+        // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
+        /* TODO: adjust and restore
+        assertEquals(1.0, query.findCost("b"), 0);
+        // a-knows->b now has a branch factor of 2.0 -- we put in marko and got out josh and vadas
+        // the cost of a-knows->b is its branch factor (2.0) plus the branch factor times the cost of b-created->c (1.0), so 4.0
+        // a has only one outgoing traversal, a-knows->b, so its total cost is 4.0
+        assertEquals(4.0, query.findCost("a"), 0);
+        // d<-knows-a has a branch factor of 1/6 -- we put in all six vertices and got out marko
+        //     we get out marko only once, because d-name->"vadas" is tried first and rules out all but one "d"
+        // the cost of d<-knows-a is its branch factor (1/6) plus the branch factor times the cost of a-knows->b (4.0), so 5/6
+        // since we optimized to put the has step first (it immediately eliminates most vertices),
+        //     the cost of d->has(name,vadas) is 1/6 -- we put in all six vertices and got out one
+        // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
+        //     or 1/6 + 1/6*5/6 = 11/36
+        */
+    }
+
+    // TODO: uncomment when query cycles are supported
+    /*
+    @Test
+    @LoadGraphWith(MODERN)
+    public void testCyclicPatterns() throws Exception {
+        MatchStep<Object, Object> query;
+        Iterator iter;
+
+        iter = g.V();
+        query = new MatchStep<>(g.V(), "a",
+                as("a").out("uses").as("b"),
+                as("b").out("dependsOn").as("c"),
+                as("c").in("created").as("a"));
+
+        assertResults(query.solve(iter),
+                new Bindings<>().put("a", "v[1]").put("b", "v[10]").put("c", "v[11]"));
+    }
+    */
+
+    @Test
+    public void testIteratorEnumerator() throws Exception {
+        IteratorEnumerator<String> ie;
+        final Map<String, String> map = new HashMap<>();
+        BiConsumer<String, String> visitor = map::put;
+
+        ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
+            add("foo");
+            add("bar");
+        }}.iterator());
+        assertEquals(0, ie.size());
+        assertTrue(ie.visitSolution(0, visitor));
+        assertEquals(1, ie.size());
+        assertEquals(1, map.size());
+        assertEquals("foo", map.get("a"));
+        map.clear();
+        assertTrue(ie.visitSolution(1, visitor));
+        assertEquals(2, ie.size());
+        assertEquals(1, map.size());
+        assertEquals("bar", map.get("a"));
+        map.clear();
+        assertFalse(ie.visitSolution(2, visitor));
+        assertEquals(2, ie.size());
+        assertEquals(0, map.size());
+        // revisit previous solutions at random
+        assertTrue(ie.visitSolution(1, visitor));
+        assertEquals(2, ie.size());
+        assertEquals(1, map.size());
+        assertEquals("bar", map.get("a"));
+
+        // empty enumerator
+        ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
+        }}.iterator());
+        map.clear();
+        assertEquals(0, ie.size());
+        assertFalse(ie.visitSolution(0, visitor));
+        assertEquals(0, ie.size());
+        assertEquals(0, map.size());
+    }
+
+    @Test
+    public void testCrossJoin() throws Exception {
+        String[] a1 = new String[]{"a", "b", "c"};
+        String[] a2 = new String[]{"1", "2", "3", "4"};
+        String[] a3 = new String[]{"@", "#"};
+
+        Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
+        Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
+        Enumerator<String> e3 = new IteratorEnumerator<>("punc", Arrays.asList(a3).iterator());
+
+        Enumerator<String> e1e2 = new CrossJoinEnumerator<>(e1, e2);
+        Enumerator<String> e2e1 = new CrossJoinEnumerator<>(e2, e1);
+        BiConsumer<String, String> visitor = (name, value) -> {
+            System.out.println("\t" + name + ":\t" + value);
+        };
+        Enumerator<String> e1e2e3 = new CrossJoinEnumerator<>(e1e2, e3);
+
+        Enumerator<String> result;
+
+        result = e1e2;
+        assertEquals(12, exhaust(result));
+        assertEquals(12, result.size());
+
+        result = e2e1;
+        assertEquals(12, exhaust(result));
+        assertEquals(12, result.size());
+
+        result = e1e2e3;
+        assertEquals(24, exhaust(result));
+        assertEquals(24, result.size());
+
+        /*
+        int i = 0;
+        while (result.visitSolution(i, visitor)) {
+            System.out.println("solution #" + (i + 1) + "^^");
+            i++;
+        }
+        */
+    }
+
+    /* TODO: uncomment when optimized cross-joins are available
+    @Test
+    public void testCrossJoinLaziness() throws Exception {
+        List<Integer> value = new LinkedList<>();
+        for (int j = 0; j < 1000; j++) {
+            value.add(j);
+        }
+
+        int base = 3;
+        List<Enumerator<Integer>> enums = new LinkedList<>();
+        for (int k = 0; k < base; k++) {
+            List<Integer> lNew = new LinkedList<>();
+            lNew.addAll(value);
+            Enumerator<Integer> ek = new IteratorEnumerator<>("" + (char) ('a' + k), lNew.iterator());
+            enums.add(ek);
+        }
+
+        Enumerator<Integer> e = new NewCrossJoinEnumerator<>(enums);
+
+        // we now have an enumerator of 5^3^10 elements
+        EnumeratorIterator<Integer> iter = new EnumeratorIterator<>(e);
+
+        int count = 0;
+        // each binding set is unique
+        Set<String> values = new HashSet<>();
+        String s;
+        s = iter.next().toString();
+        values.add(s);
+        assertEquals(++count, values.size());
+        // begin at the head of all iterators
+        assertEquals("{a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0}", s);
+        int lim0 = (int) Math.pow(1, base);
+        // first 2^10 results are binary (0's and 1's)
+        int lim1 = (int) Math.pow(2, base);
+        for (int i = lim0; i < lim1; i++) {
+            s = iter.next().toString();
+            System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
+            assertTrue(s.contains("1"));
+            assertFalse(s.contains("2"));
+            values.add(s);
+            assertEquals(++count, values.size());
+        }
+        int lim2 = (int) Math.pow(3, base);
+        for (int i = lim1; i < lim2; i++) {
+            s = iter.next().toString();
+            System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
+
+            if (!s.contains("2")) {
+                findMissing(null, 0, base, "abcdefghij".getBytes(), values);
+            }
+
+
+            assertTrue(s.contains("2"));
+            assertFalse(s.contains("3"));
+            values.add(s);
+            assertEquals(++count, values.size());
+        }
+    }
+    */
+
+    @Test
+    public void testInnerJoin() throws Exception {
+        String[] a1 = new String[]{"a", "b", "c"};
+        String[] a2 = new String[]{"1", "2", "3", "4"};
+        String[] a3 = new String[]{"2", "4", "6", "8", "10"};
+
+        Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
+        Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
+        Enumerator<String> e3 = new IteratorEnumerator<>("number", Arrays.asList(a3).iterator());
+
+        Enumerator<String> e4 = new CrossJoinEnumerator<>(e1, e3);
+        Enumerator<String> e5 = new CrossJoinEnumerator<>(e2, e4);
+
+        // without AND semantics, we have all 60 combinations, including two "number" bindings per solution
+        exhaust(e5);
+        assertEquals(60, e5.size());
+
+        // with AND semantics, we have only those six solutions for which a2 and a3 align
+        Enumerator<String> join = new InnerJoinEnumerator<>(e5, new HashSet<String>() {{
+            add("number");
+        }});
+        exhaust(join);
+        assertEquals(6, join.size());
+
+        assertResults(join,
+                new Bindings<String>().put("letter", "a").put("number", "2"),
+                new Bindings<String>().put("letter", "a").put("number", "4"),
+                new Bindings<String>().put("letter", "b").put("number", "2"),
+                new Bindings<String>().put("letter", "b").put("number", "4"),
+                new Bindings<String>().put("letter", "c").put("number", "2"),
+                new Bindings<String>().put("letter", "c").put("number", "4"));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class Traversals extends MatchTest {
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
+            return g.V().match("a", as("a").out().as("b"));
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
+            return g.V().match("a", as("a").out().as("b")).select("b").by(T.id);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
+            return g.V().match("a",
+                    as("a").out("knows").as("b"),
+                    as("b").out("created").as("c"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
+            return g.V().match("a",
+                    as("a").out("knows").as("b"),
+                    as("a").out("created").as("c"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
+            return g.V().match("d",
+                    as("d").in("knows").as("a"),
+                    as("d").has("name", "vadas"),
+                    as("a").out("knows").as("b"),
+                    as("b").out("created").as("c"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
+            return g.V().match("a",
+                    as("a").out("created").as("b"),
+                    __.<Vertex>as("a").repeat(out()).times(2).as("b")).<String>select("a", "b").by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
+            return g.V().match("a",
+                    as("a").out("created").has("name", "lop").as("b"),
+                    as("b").in("created").has("age", 29).as("c"),
+                    __.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
+            return g.V().match("a",
+                    as("a").out("created").has("name", "lop").as("b"),
+                    as("b").in("created").has("age", 29).as("c"))
+                    .where(__.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
+            return g.V().out().out().match("a",
+                    as("a").in("created").as("b"),
+                    as("b").in("knows").as("c")).select("c").out("created").values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
+            return g.V().match("a",
+                    as("a").out("created").as("b"),
+                    as("b").in("created").as("a"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
+            return g.V().match("a", as("a").out("knows").as("b"),
+                    as("c").out("knows").as("b"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
+            return g.V().match("a",
+                    as("a").out("knows").as("b"),
+                    as("b").out("created").has("name", "lop"),
+                    as("b").match("a1",
+                            as("a1").out("created").as("b1"),
+                            as("b1").in("created").as("c1")).select("c1").as("c")).<String>select().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
+            return g.V().match("a",
+                    as("a").has("name", "Garcia"),
+                    as("a").in("writtenBy").as("b"),
+                    as("a").in("sungBy").as("b"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
+            return g.V().match("a",
+                    as("a").in("sungBy").as("b"),
+                    as("a").in("sungBy").as("c"),
+                    as("b").out("writtenBy").as("d"),
+                    as("c").out("writtenBy").as("e"),
+                    as("d").has("name", "George_Harrison"),
+                    as("e").has("name", "Bob_Marley"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
+            return g.V().match("a",
+                    as("a").in("sungBy").as("b"),
+                    as("a").in("writtenBy").as("c"),
+                    as("b").out("writtenBy").as("d"),
+                    as("c").out("sungBy").as("d"),
+                    as("d").has("name", "Garcia"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
+            return g.V().match("a",
+                    as("a").in("sungBy").as("b"),
+                    as("a").in("writtenBy").as("c"),
+                    as("b").out("writtenBy").as("d"))
+                    .where(as("c").out("sungBy").as("d"))
+                    .where(as("d").has("name", "Garcia"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
+            return g.V().match("a",
+                    as("a").out("created").as("b"),
+                    as("b").in("created").as("c"))
+                    .where("a", Compare.neq, "c")
+                    .<String>select("a", "c").by("name");
+        }
+
+        /*@Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
+            return g.V().match("a",
+                    as("a").out("created").as("b"),
+                    as("c").out("created").as("b")).select(v -> ((Vertex) v).value("name"));
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
+            return g.V().out().out().match("a",
+                    as("b").out("created").as("a"),
+                    as("c").out("knows").as("b")).select("c").out("knows").value("name");
+        }*/
+
+    }
+
+    private static final Function<Vertex, String> vertexToStr = v -> v.id().toString();
+
+    private <S, E> void assertResults(final Function<E, String> toStringFunction,
+                                      final Traversal<S, Map<String, E>> actual,
+                                      final Bindings<E>... expected) {
+        Comparator<Bindings<E>> comp = new Bindings.BindingsComparator<>(toStringFunction);
+
+        List<Bindings<E>> actualList = toBindings(actual);
+        List<Bindings<E>> expectedList = new LinkedList<>();
+        Collections.addAll(expectedList, expected);
+
+        if (expectedList.size() > actualList.size()) {
+            fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
+        } else if (actualList.size() > expectedList.size()) {
+            fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
+        }
+
+        Collections.sort(actualList, comp);
+        Collections.sort(expectedList, comp);
+
+        for (int j = 0; j < actualList.size(); j++) {
+            Bindings<E> a = actualList.get(j);
+            Bindings<E> e = expectedList.get(j);
+
+            if (0 != comp.compare(a, e)) {
+                fail("unexpected result(s), including " + a);
+            }
+        }
+        assertFalse(actual.hasNext());
+    }
+
+    private static final Function<Object, String> simpleToStringFunction = Object::toString;
+
+    private <T> void assertResults(final Enumerator<T> actual,
+                                   final Bindings<T>... expected) {
+        Comparator<Bindings<T>> comp = new Bindings.BindingsComparator<>((Function<T, String>) simpleToStringFunction);
+
+        List<Bindings<T>> actualList = toBindings(actual);
+        List<Bindings<T>> expectedList = new LinkedList<>();
+        Collections.addAll(expectedList, expected);
+
+        Collections.sort(actualList, comp);
+        Collections.sort(expectedList, comp);
+
+        for (int j = 0; j < actualList.size(); j++) {
+            if (j == expectedList.size()) {
+                fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
+            }
+
+            Bindings<T> a = actualList.get(j);
+            Bindings<T> e = expectedList.get(j);
+
+            if (0 != comp.compare(a, e)) {
+                fail("unexpected result(s), including " + a);
+            }
+        }
+        if (expectedList.size() > actualList.size()) {
+            fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
+        }
+    }
+
+    private <S, E> List<Bindings<E>> toBindings(final Traversal<S, Map<String, E>> traversal) {
+        List<Bindings<E>> result = new LinkedList<>();
+        traversal.forEachRemaining(o -> {
+            result.add(new Bindings<>(o));
+        });
+        return result;
+    }
+
+    private <T> List<Bindings<T>> toBindings(final Enumerator<T> enumerator) {
+        List<Bindings<T>> bindingsList = new LinkedList<>();
+        int i = 0;
+        bindingsList.add(new Bindings<>());
+        while (enumerator.visitSolution(i++, (name, value) -> {
+            bindingsList.get(bindingsList.size() - 1).put(name, value);
+        })) {
+            bindingsList.add(new Bindings<>());
+        }
+        bindingsList.remove(bindingsList.size() - 1);
+
+        return bindingsList;
+    }
+
+    private void assertBranchFactor(final double branchFactor,
+                                    final Traversal t,
+                                    final Iterator inputs) {
+        Traverser start = new B_O_PA_S_SE_SL_Traverser(null, null);
+        MatchStep.TraversalWrapper w = new MatchStep.TraversalWrapper(t, "a", "b");
+        MatchStep.TraversalUpdater updater = new MatchStep.TraversalUpdater<>(w, inputs, start, "x");
+        while (updater.hasNext()) {
+            updater.next();
+        }
+        assertEquals(branchFactor, w.findBranchFactor(), 0);
+    }
+
+    private <T> int exhaust(Enumerator<T> enumerator) {
+        BiConsumer<String, T> visitor = (s, t) -> {
+        };
+        int i = 0;
+        while (enumerator.visitSolution(i, visitor)) i++;
+        return i;
+    }
+
+    private void findMissing(String s, final int i, final int n, final byte[] names, final Set<String> actual) {
+        if (0 == i) {
+            s = "{";
+        } else {
+            s += ", ";
+        }
+
+        s += (char) names[i];
+        s += "=";
+        String tmp = s;
+        for (int j = 0; j < 3; j++) {
+            s += j;
+
+            if (n - 1 == i) {
+                s += "}";
+                if (!actual.contains(s)) {
+                    fail("not in set: " + s);
+                }
+            } else {
+                findMissing(s, i + 1, n, names, actual);
+            }
+
+            s = tmp;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
new file mode 100644
index 0000000..dca94e7
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MaxTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Integer> get_g_V_age_max();
+
+    public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max();
+
+    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_age_max() {
+        final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
+                get_g_V_age_max(),
+                get_g_V_repeatXbothX_timesX5X_age_max());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            checkResults(Arrays.asList(35), traversal);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmaxXlocalXX() {
+        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Number> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertEquals(1.0, map.get("ripple"));
+        assertEquals(0.4, map.get("lop"));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends MaxTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_max() {
+            return g.V().values("age").max();
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
+            return g.V().repeat(both()).times(5).values("age").max();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
+            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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
new file mode 100644
index 0000000..ace1c55
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanTest.java
@@ -0,0 +1,88 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.mean;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MeanTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Double> get_g_V_age_mean();
+
+    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_age_mean() {
+        final List<Traversal<Vertex, Double>> traversals = Arrays.asList(get_g_V_age_mean());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            final Double mean = traversal.next();
+            assertEquals(30.75, mean, 0.05);
+            assertFalse(traversal.hasNext());
+
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmeanXlocalXX() {
+        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Number> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertEquals(1.0, map.get("ripple"));
+        assertEquals(1.0 / 3, map.get("lop"));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends MeanTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_age_mean() {
+            return g.V().values("age").mean();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
+            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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
new file mode 100644
index 0000000..1c55532
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MinTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Integer> get_g_V_age_min();
+
+    public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min();
+
+    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_age_min() {
+        final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
+                get_g_V_age_min(),
+                get_g_V_repeatXbothX_timesX5X_age_min());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            checkResults(Arrays.asList(27), traversal);
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXminXlocalXX() {
+        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Number> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertEquals(1.0, map.get("ripple"));
+        assertEquals(0.2, map.get("lop"));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends MinTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_min() {
+            return g.V().values("age").min();
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
+            return g.V().repeat(both()).times(5).values("age").min();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
+            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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
new file mode 100644
index 0000000..3b690a5
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderTest.java
@@ -0,0 +1,288 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class OrderTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_V_name_order();
+
+    public abstract Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X();
+
+    public abstract Traversal<Vertex, String> get_g_V_order_byXname_incrX_name();
+
+    public abstract Traversal<Vertex, String> get_g_V_order_byXnameX_name();
+
+    public abstract Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight();
+
+    public abstract Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
+
+    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
+
+    public abstract Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_name_order() {
+
+        final Traversal<Vertex, String> traversal = get_g_V_name_order();
+        printTraversalForm(traversal);
+        final List<String> names = traversal.toList();
+        assertEquals(names.size(), 6);
+        assertEquals("josh", names.get(0));
+        assertEquals("lop", names.get(1));
+        assertEquals("marko", names.get(2));
+        assertEquals("peter", names.get(3));
+        assertEquals("ripple", names.get(4));
+        assertEquals("vadas", names.get(5));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
+        final Traversal<Vertex, String> traversal = get_g_V_name_order_byXa1_b1X_byXb2_a2X();
+        printTraversalForm(traversal);
+        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(names.size(), 6);
+        assertEquals("marko", names.get(0));
+        assertEquals("vadas", names.get(1));
+        assertEquals("peter", names.get(2));
+        assertEquals("ripple", names.get(3));
+        assertEquals("josh", names.get(4));
+        assertEquals("lop", names.get(5));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_order_byXname_incrX_name() {
+        Arrays.asList(get_g_V_order_byXname_incrX_name(), get_g_V_order_byXnameX_name()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+            assertEquals(names.size(), 6);
+            assertEquals("josh", names.get(0));
+            assertEquals("lop", names.get(1));
+            assertEquals("marko", names.get(2));
+            assertEquals("peter", names.get(3));
+            assertEquals("ripple", names.get(4));
+            assertEquals("vadas", names.get(5));
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_outE_order_byXweight_decrX_weight() {
+        final Traversal<Vertex, Double> traversal = get_g_V_outE_order_byXweight_decrX_weight();
+        printTraversalForm(traversal);
+        final List<Double> weights = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(6, weights.size());
+        assertEquals(Double.valueOf(1.0d), weights.get(0));
+        assertEquals(Double.valueOf(1.0d), weights.get(1));
+        assertEquals(Double.valueOf(0.5d), weights.get(2));
+        assertEquals(Double.valueOf(0.4d), weights.get(3));
+        assertEquals(Double.valueOf(0.4d), weights.get(4));
+        assertEquals(Double.valueOf(0.2d), weights.get(5));
+
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
+        printTraversalForm(traversal);
+        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
+        assertEquals(names.size(), 6);
+        assertEquals("marko", names.get(0));
+        assertEquals("vadas", names.get(1));
+        assertEquals("peter", names.get(2));
+        assertEquals("ripple", names.get(3));
+        assertEquals("josh", names.get(4));
+        assertEquals("lop", names.get(5));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
+        printTraversalForm(traversal);
+        int counter = 0;
+        int markoCounter = 0;
+        int joshCounter = 0;
+        int peterCounter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Map<String, Vertex> bindings = traversal.next();
+            assertEquals(2, bindings.size());
+            if (bindings.get("a").id().equals(convertToVertexId("marko"))) {
+                assertEquals(convertToVertexId("lop"), bindings.get("b").id());
+                markoCounter++;
+            } else if (bindings.get("a").id().equals(convertToVertexId("josh"))) {
+                assertTrue((bindings.get("b")).id().equals(convertToVertexId("lop")) || bindings.get("b").id().equals(convertToVertexId("ripple")));
+                joshCounter++;
+            } else if (bindings.get("a").id().equals(convertToVertexId("peter"))) {
+                assertEquals(convertToVertexId("lop"), bindings.get("b").id());
+                peterCounter++;
+            } else {
+                fail("This state should not have been reachable");
+            }
+
+
+        }
+        assertEquals(4, markoCounter + joshCounter + peterCounter);
+        assertEquals(1, markoCounter);
+        assertEquals(1, peterCounter);
+        assertEquals(2, joshCounter);
+        assertEquals(4, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX() {
+        final Traversal<Vertex, Map<Integer, Integer>> traversal = get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        final Map<Integer, Integer> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(4, map.size());
+        final Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
+        Map.Entry<Integer, Integer> entry = iterator.next();
+        assertEquals(3, entry.getKey().intValue());
+        assertEquals(87, entry.getValue().intValue());
+        entry = iterator.next();
+        assertEquals(2, entry.getKey().intValue());
+        assertEquals(58, entry.getValue().intValue());
+        entry = iterator.next();
+        assertEquals(1, entry.getKey().intValue());
+        assertEquals(29, entry.getValue().intValue());
+        entry = iterator.next();
+        assertEquals(4, entry.getKey().intValue());
+        assertEquals(29, entry.getValue().intValue());
+        assertFalse(iterator.hasNext());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_order_byXoutE_count__decrX() {
+        Arrays.asList(get_g_V_order_byXoutE_count__decrX()).forEach(traversal -> {
+            printTraversalForm(traversal);
+            final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
+            assertEquals(vertices.size(), 6);
+            assertEquals("marko", vertices.get(0).value("name"));
+            assertEquals("josh", vertices.get(1).value("name"));
+            assertEquals("peter", vertices.get(2).value("name"));
+            assertTrue(vertices.get(3).value("name").equals("vadas") || vertices.get(3).value("name").equals("ripple") || vertices.get(3).value("name").equals("lop"));
+            assertTrue(vertices.get(4).value("name").equals("vadas") || vertices.get(4).value("name").equals("ripple") || vertices.get(4).value("name").equals("lop"));
+            assertTrue(vertices.get(5).value("name").equals("vadas") || vertices.get(5).value("name").equals("ripple") || vertices.get(5).value("name").equals("lop"));
+        });
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends OrderTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_name_order() {
+            return g.V().<String>values("name").order();
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
+            return g.V().<String>values("name").order().by((a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).by((a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3)));
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
+            return g.V().order().by("name", Order.incr).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
+            return g.V().order().by("name", Order.incr).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
+            return g.V().outE().order().by("weight", Order.decr).values("weight");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+            return g.V().order().
+                    <String>by("name", (a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).
+                    <String>by("name", (a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3))).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+            return g.V().as("a").out("created").as("b").order().by(Order.shuffle).select();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id) {
+            return g.V(v1Id).map(v -> {
+                final Map<Integer, Integer> map = new HashMap<>();
+                map.put(1, (int) v.get().value("age"));
+                map.put(2, (int) v.get().value("age") * 2);
+                map.put(3, (int) v.get().value("age") * 3);
+                map.put(4, (int) v.get().value("age"));
+                return map;
+            }).order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+            return g.V().order().by(outE().count(), Order.decr);
+        }
+
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java
new file mode 100644
index 0000000..a8a6f2b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathTest.java
@@ -0,0 +1,165 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class PathTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id);
+
+    public abstract Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
+
+    public abstract Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX();
+
+    public abstract Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_name_path() {
+        final Traversal<Vertex, Path> traversal = get_g_VX1X_name_path(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        final Path path = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, path.size());
+        assertEquals(convertToVertexId("marko"), ((Vertex) path.get(0)).<String>id());
+        assertEquals("marko", path.<String>get(1));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_path_byXageX_byXnameX() {
+        final Traversal<Vertex, Path> traversal = get_g_VX1X_out_path_byXageX_byXnameX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        final Set<String> names = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            final Path path = traversal.next();
+            assertEquals(Integer.valueOf(29), path.<Integer>get(0));
+            assertTrue(path.get(1).equals("josh") || path.get(1).equals("vadas") || path.get(1).equals("lop"));
+            names.add(path.get(1));
+        }
+        assertEquals(3, counter);
+        assertEquals(3, names.size());
+    }
+
+    @Test
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
+        final Traversal<Vertex, Path> traversal = get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Path path = traversal.next();
+            assertEquals(3, path.size());
+            assertEquals("marko", ((Vertex) path.get(0)).<String>value("name"));
+            assertEquals("josh", path.<String>get(1));
+            assertEquals("java", path.<String>get(2));
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_path_byXnameX_byXageX() {
+        final Traversal<Vertex, Path> traversal = get_g_V_out_out_path_byXnameX_byXageX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Path path = traversal.next();
+            assertEquals(3, path.size());
+            assertEquals("marko", path.<String>get(0));
+            assertEquals(Integer.valueOf(32), path.<Integer>get(1));
+            assertTrue(path.get(2).equals("lop") || path.get(2).equals("ripple"));
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+        final Traversal<Vertex, Path> traversal = get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
+        printTraversalForm(traversal);
+        final Path path = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(1, path.size());
+        assertTrue(path.hasLabel("a"));
+        assertTrue(path.hasLabel("b"));
+        assertTrue(path.hasLabel("c"));
+        assertEquals(1, path.labels().size());
+        assertEquals(3, path.labels().get(0).size());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends PathTest {
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
+            return g.V(v1Id).values("name").path();
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
+            return g.V(v1Id).out().path().by("age").by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
+            return g.V().repeat(out()).times(2).path().by().by("name").by("lang");
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
+            return g.V().out().out().path().by("name").by("age");
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+            return g.V().as("a").has("name", "marko").as("b").has("age", 29).as("c").path();
+        }
+    }
+}
\ No newline at end of file


[17/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy
deleted file mode 100644
index 29d3ac9..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPathTest.groovy
+++ /dev/null
@@ -1,115 +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.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.Path
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyPathTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends PathTest {
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
-            g.V(v1Id).identity.name.path
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
-            g.V(v1Id).out.path.by('age').by('name');
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
-            g.V.repeat(__.out).times(2).path.by.by('name').by('lang');
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
-            g.V.out.out.path.by('name').by('age');
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
-            g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path;
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends PathTest {
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).identity.name.path", g);
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_out_path_byXageX_byXnameX() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_out_out_path_byXnameX_byXageX() {
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
-            ComputerTestHelper.compute("g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path", g);
-        }
-
-        @Override
-        Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy
deleted file mode 100644
index 1332e1e..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyPropertiesTest.groovy
+++ /dev/null
@@ -1,61 +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.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyPropertiesTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends PropertiesTest {
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
-            g.V.has('age').properties('name', 'age').value;
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
-            g.V.has('age').properties('age', 'name').value;
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends PropertiesTest {
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
-            ComputerTestHelper.compute("g.V.has('age').properties('name', 'age').value", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
-            ComputerTestHelper.compute("g.V.has('age').properties('age', 'name').value", g);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index d953e72..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySelectTest.groovy
+++ /dev/null
@@ -1,208 +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.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Order
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.values
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySelectTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SelectTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
-            g.V(v1Id).as('a').out('knows').as('b').select()
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(
-                final Object v1Id) {
-            g.V(v1Id).as('a').out('knows').as('b').select.by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
-            g.V(v1Id).as('a').out('knows').as('b').select('a')
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(
-                final Object v1Id) {
-            g.V(v1Id).as('a').out('knows').as('b').select('a').by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
-            g.V.as('a').out.as('b').select.by('name')
-        }
-
-        @Override
-        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
-        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
-            g.V().as('a').name.order().as('b').select.by('name').by
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
-            g.V.has('name', 'gremlin').inE('uses').order.by('skill', Order.incr).as('a').outV.as('b').select.by('skill').by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
-            return g.V.has(values('name').is('marko')).as('a').select
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
-            return g.V().label().groupCount().as('x').select()
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
-            return g.V().hasLabel('person').as('person').local(__.bothE().label().groupCount()).as('relations').select().by('name').by()
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends SelectTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select()", g);
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select('a')", g);
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_asXaX_out_asXbX_select_byXnameX() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
-            ComputerTestHelper.compute("g.V.has(values('name').is('marko')).as('a').select", g)
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_label_groupCount_asXxX_select() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        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
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 03545a5..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovySumTest.groovy
+++ /dev/null
@@ -1,63 +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.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-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.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.sum
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovySumTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SumTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
-            g.V().values('age').sum()
-        }
-
-        @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))
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends SumTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
-            ComputerTestHelper.compute("g.V.age.sum", g)
-        }
-
-        @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))", g)
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy
deleted file mode 100644
index 5822898..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyUnfoldTest.groovy
+++ /dev/null
@@ -1,63 +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.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyUnfoldTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends UnfoldTest {
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
-            g.V.local(__.outE.fold).unfold
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
-            g.V.valueMap.unfold.map { it.key }
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends UnfoldTest {
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
-            ComputerTestHelper.compute("g.V.local(__.outE.fold).unfold", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
-            ComputerTestHelper.compute("g.V.valueMap.unfold.map { it.key }", g)
-        }
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy
deleted file mode 100644
index 4bb6941..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyValueMapTest.groovy
+++ /dev/null
@@ -1,68 +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.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.ValueMapTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyValueMapTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends ValueMapTest {
-        @Override
-        public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
-            g.V.valueMap
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
-            g.V.valueMap('name', 'age')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
-            g.V(v1Id).out('created').valueMap
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends ValueMapTest {
-        @Override
-        public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
-            ComputerTestHelper.compute("g.V.valueMap", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
-            ComputerTestHelper.compute("g.V.valueMap('name', 'age')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out('created').valueMap", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy
deleted file mode 100644
index 25fb5a1..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyVertexTest.groovy
+++ /dev/null
@@ -1,294 +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.map
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexTest
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Direction
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyVertexTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends VertexTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V() {
-            g.V
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
-            g.V(v1Id).out
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
-            g.V(v2Id).in
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
-            g.V(v4Id).both
-        }
-
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E() {
-            g.E
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
-            g.V(v1Id).outE
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
-            g.V(v2Id).inE
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
-            g.V(v4Id).bothE
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
-            g.V(v4Id).bothE('created')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
-            g.V(v1Id).outE.inV
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
-            g.V(v2Id).inE.outV
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
-            g.V.outE.has('weight', 1.0d).outV
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
-            g.V.out.outE.inV.inE.inV.both.name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
-            g.V(v1Id).outE('knows').bothV.name
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
-            g.V(v1Id).out('knows')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
-            g.V(v1Id).out('knows', 'created')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
-            g.V(v1Id).outE('knows').inV()
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
-            g.V(v1Id).outE('knows', 'created').inV
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out() {
-            g.V().out().out()
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
-            g.V(v1Id).out.out.out
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
-            g.V(v1Id).out.name
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
-            g.V(v1Id).outE.otherV
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
-            g.V(v4Id).bothE.otherV
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
-            g.V(v4Id).bothE.has('weight', Compare.lt, 1.0d).otherV
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
-            g.V(v1Id).to(Direction.OUT, 'knows');
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends VertexTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V() {
-            ComputerTestHelper.compute("g.V", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
-            ComputerTestHelper.compute("g.V(${v2Id}).in", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).both", g);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E() {
-            ComputerTestHelper.compute("g.E", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
-            ComputerTestHelper.compute("g.V(${v2Id}).inE", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).bothE", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).bothE('created')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE.inV", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
-            ComputerTestHelper.compute("g.V(${v2Id}).inE.outV", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
-            ComputerTestHelper.compute("g.V.outE.has('weight', 1.0d).outV", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
-            ComputerTestHelper.compute("g.V.out.outE.inV.inE.inV.both.name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').bothV.name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out('knows')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out('knows', 'created')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').inV()", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows', 'created').inV", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out() {
-            ComputerTestHelper.compute("g.V().out().out()", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.out.out", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE.otherV", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).bothE.otherV", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).bothE.has('weight', Compare.lt, 1.0d).otherV", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).to(Direction.OUT, 'knows')", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 3edd991..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyAggregateTest.groovy
+++ /dev/null
@@ -1,71 +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.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAggregateTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends AggregateTest {
-
-        @Override
-        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_aggregateXxX_byXnameX_capXxX() {
-            g.V.aggregate('x').by('name').cap('x')
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
-            g.V.out.aggregate('a').path;
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends AggregateTest {
-
-        @Override
-        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_aggregateXxX_byXnameX_capXxX() {
-            ComputerTestHelper.compute("g.V.aggregate('x').by('name').cap('x')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
-            ComputerTestHelper.compute("g.V.out.aggregate('a').path", g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy
deleted file mode 100644
index 6505384..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupCountTest.groovy
+++ /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
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyGroupCountTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends GroupCountTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
-            g.V.out('created').groupCount.by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
-            g.V.out('created').groupCount('a').by('name').cap('a')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
-            g.V.out('created').name.groupCount
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
-            g.V.out('created').name.groupCount('a').cap('a')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
-            g.V.has('no').groupCount;
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
-            g.V.has('no').groupCount('a').cap('a');
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
-            g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
-            g.V.union(
-                    __.repeat(__.out).times(2).groupCount('m').by('lang'),
-                    __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends GroupCountTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
-            ComputerTestHelper.compute("g.V.out('created').groupCount.by('name')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
-            ComputerTestHelper.compute("g.V.out('created').groupCount('a').by('name').cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
-            ComputerTestHelper.compute("g.V.out('created').name.groupCount", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
-            ComputerTestHelper.compute("g.V.out('created').name.groupCount('a').cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
-            ComputerTestHelper.compute("g.V.has('no').groupCount", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
-            ComputerTestHelper.compute("g.V.has('no').groupCount('a').cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
-            ComputerTestHelper.compute("g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
-            ComputerTestHelper.compute("""
-            g.V.union(
-                    __.repeat(__.out).times(2).groupCount('m').by('lang'),
-                    __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
-            """, g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy
deleted file mode 100644
index db721de..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyGroupTest.groovy
+++ /dev/null
@@ -1,97 +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.*
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyGroupTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends GroupTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
-            g.V.group.by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
-            g.V.group('a').by('name').cap('a')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
-            g.V.has('lang').group('a').by('lang').by('name').out.cap('a')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
-            g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
-            g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
-            g.V.group.by(__.outE.count).by('name')
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends GroupTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
-            ComputerTestHelper.compute("g.V.group.by('name')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
-            ComputerTestHelper.compute("g.V.group('a').by('name').cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
-            ComputerTestHelper.compute("g.V.has('lang').group('a').by('lang').by('name').out.cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
-            ComputerTestHelper.compute("g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local))", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
-            ComputerTestHelper.compute("g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
-            ComputerTestHelper.compute("g.V.group.by(__.outE.count).by('name')", g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy
deleted file mode 100644
index df30874..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyInjectTest.groovy
+++ /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.graph.traversal.step.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.Path
-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.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyInjectTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends InjectTest {
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
-            g.V(v1Id).out.inject(g.V(v2Id).next()).name
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
-            g.V(v1Id).out().name.inject('daniel').as('a').map { it.length() }.path
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends InjectTest {
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_VX1X_out_injectXv2X_name() {
-            super.g_VX1X_out_injectXv2X_name()
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
-            super.g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path()
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(Object v1Id, Object v2Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy
deleted file mode 100644
index ba3bfd1..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyProfileTest.groovy
+++ /dev/null
@@ -1,95 +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.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.junit.Ignore
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyProfileTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends ProfileTest {
-
-        @Override
-        Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
-            g.V.out.out.profile();
-        }
-
-        @Override
-        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
-            g.V.repeat(__.both()).times(3).profile();
-        }
-
-        @Override
-        Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-            g.V().has(__.in("created").count().is(1l)).values("name").profile();
-        }
-
-        @org.junit.Ignore
-        @Override
-        void g_V_sleep_sleep_profile() {
-        }
-
-        @Override
-        Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
-            return null
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends ProfileTest {
-
-        @Override
-        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
-            ComputerTestHelper.compute("g.V.out.out.profile()", g);
-        }
-
-
-        @Override
-        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
-            ComputerTestHelper.compute("g.V.repeat(__.both()).times(3).profile()", g);
-        }
-
-        @Override
-        Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-            ComputerTestHelper.compute(" g.V().has(__.in('created').count().is(1l)).values('name').profile()", g);
-        }
-
-        @Override
-        @org.junit.Ignore
-        void g_V_sleep_sleep_profile() {
-        }
-
-        @Override
-        Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
-            return null
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy
deleted file mode 100644
index d2c3aa5..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySackTest.groovy
+++ /dev/null
@@ -1,72 +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.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.structure.Operator.sum
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySackTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SackTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
-            g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()
-        }
-
-        @Override
-        public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
-            g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack
-        }
-
-        @Override
-        public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
-            g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends SackTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
-            ComputerTestHelper.compute("g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
-            ComputerTestHelper.compute("g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
-            ComputerTestHelper.compute("g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
deleted file mode 100644
index 02d7896..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
+++ /dev/null
@@ -1,65 +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.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySideEffectCapTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SideEffectCapTest {
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
-            g.V.has('age').groupCount('a').by('name').out.cap('a')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
-            g.V.choose(__.has(T.label, 'person'),
-                    __.age.groupCount('a'),
-                    __.values("name").groupCount('b')).cap('a', 'b')
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends SideEffectCapTest {
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
-            ComputerTestHelper.compute("g.V.has('age').groupCount('a').by('name').out.cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
-            ComputerTestHelper.compute("""
-            g.V.choose(__.has(T.label, 'person'),
-                    __.age.groupCount('a'),
-                    __.values("name").groupCount('b')).cap('a', 'b')
-            """, g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy
deleted file mode 100644
index 7ef92d6..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySideEffectTest.groovy
+++ /dev/null
@@ -1,57 +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.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySideEffectTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SideEffectTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
-            g.V(v1Id).withSideEffect('a') { [] }.sideEffect {
-                it.sideEffects('a').clear();
-                it.sideEffects('a').add(it.get());
-            }.name;
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
-            g.V(v1Id).withSideEffect('c') { [0] }.out.sideEffect {
-                def temp = it.sideEffects('c')[0];
-                it.sideEffects('c').clear();
-                it.sideEffects('c').add(temp + 1);
-            }.name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
-            g.V(v1Id).out().sideEffect {}.name
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy
deleted file mode 100644
index e2c4b1a..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyStoreTest.groovy
+++ /dev/null
@@ -1,84 +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.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyStoreTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends StoreTest {
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
-            g.V().store('a').by('name').out().cap('a');
-        }
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
-                final Object v1Id) {
-            g.V(v1Id).store('a').by('name').out().store('a').by('name').name.cap('a');
-        }
-
-        @Override
-        public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
-            g.V.withSideEffect('a') { [] as Set }.both.name.store('a').cap('a')
-        }
-
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
-            g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a');
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends StoreTest {
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
-            ComputerTestHelper.compute("g.V().store('a').by('name').out().cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
-                final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).store('a').by('name').out().store('a').by('name').name.cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
-            ComputerTestHelper.compute("g.V.withSideEffect('a'){[] as Set}.both.name.store('a').cap('a')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
-            ComputerTestHelper.compute("g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a')", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy
deleted file mode 100644
index 40e62e0..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovySubgraphTest.groovy
+++ /dev/null
@@ -1,49 +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.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SubgraphTest
-import org.apache.tinkerpop.gremlin.structure.Graph
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySubgraphTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SubgraphTest {
-
-        @Override
-        public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(
-                final Object v1Id, final Graph subgraph) {
-            g.V(v1Id).withSideEffect('sg') { subgraph }.outE('knows').subgraph('sg').name.cap('sg')
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(
-                final Graph subgraph) {
-            g.V.withSideEffect('sg') { subgraph }.repeat(__.bothE('created').subgraph('sg').outV).times(5).name.dedup
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy
deleted file mode 100644
index 337d2ba..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroovyTreeTest.groovy
+++ /dev/null
@@ -1,105 +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.*
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyTreeTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends TreeTest {
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
-            g.V.out.out.tree.by(T.id);
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
-            g.V.out.out.tree('a').by(T.id).cap('a');
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
-            g.V(v1Id).out.out.tree.by('name');
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
-            g.V(v1Id).out.out.tree('a').by('name').both.both.cap('a');
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
-            g.V.out.out.tree();
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
-            g.V.out.out.tree('a').cap('a');
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends TreeTest {
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
-            ComputerTestHelper.compute("g.V.out.out.tree.by(id)", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
-            ComputerTestHelper.compute("g.V.out.out.tree('a').by(id).cap('a')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
-            ComputerTestHelper.compute("g.V.out.out.tree()", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
-            ComputerTestHelper.compute("g.V.out.out.tree('a').cap('a')", g)
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_VX1X_out_out_tree_byXnameX() {
-
-        }
-
-        @Override
-        Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(Object v1Id) {
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(Object v1Id) {
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy
new file mode 100644
index 0000000..d1671a4
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyBranchTest.groovy
@@ -0,0 +1,80 @@
+/*
+ * 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.branch
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyBranchTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends BranchTest {
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+            g.V.branch(__.label.is('person').count)
+                    .option(1L, __.age)
+                    .option(0L, __.lang)
+                    .option(0L, __.name)
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+            g.V.branch(__.label)
+                    .option('person', __.age)
+                    .option('software', __.lang)
+                    .option('software', __.name);
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends BranchTest {
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+            super.g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
+            ComputerTestHelper.compute("g.V.branch(__.label.is('person').count).option(1L, __.age).option(0L, __.lang).option(0L,__.name)", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
+            ComputerTestHelper.compute("""
+            g.V.branch(__.label)
+                    .option('person', __.age)
+                    .option('software', __.lang)
+                    .option('software', __.name)
+            """, g)
+        }
+    }
+}


[27/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
new file mode 100644
index 0000000..d43d694
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupCountStep.java
@@ -0,0 +1,170 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+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.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
+
+import java.io.Serializable;
+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.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class GroupCountStep<S, E> extends ReducingBarrierStep<S, Map<E, Long>> implements MapReducer, TraversalParent {
+
+    private Traversal.Admin<S, E> groupTraversal = null;
+
+    public GroupCountStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier(HashMapSupplier.instance());
+        this.setBiFunction(new GroupCountBiFunction());
+    }
+
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
+        this.groupTraversal = this.integrateChild(groupTraversal);
+    }
+
+    @Override
+    public List<Traversal.Admin<S, E>> getLocalChildren() {
+        return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
+    }
+
+    @Override
+    public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
+        return GroupCountMapReduce.instance();
+    }
+
+    @Override
+    public GroupCountStep<S, E> clone() {
+        final GroupCountStep<S, E> clone = (GroupCountStep<S, E>) super.clone();
+        if (null != this.groupTraversal)
+            clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
+        return clone;
+    }
+
+    @Override
+    public Traverser<Map<E, Long>> processNextStart() {
+        if (this.byPass) {
+            final Traverser.Admin<S> traverser = this.starts.next();
+            return traverser.asAdmin().split(TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map<E, Long>>) this.groupTraversal), this);
+        } else {
+            return super.processNextStart();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.groupTraversal);
+    }
+
+    ///////////
+
+    private class GroupCountBiFunction implements BiFunction<Map<E, Long>, Traverser<S>, Map<E, Long>>, Serializable {
+
+        private GroupCountBiFunction() {
+
+        }
+
+        @Override
+        public Map<E, Long> apply(final Map<E, Long> mutatingSeed, final Traverser<S> traverser) {
+            MapHelper.incr(mutatingSeed, TraversalUtil.applyNullable(traverser.asAdmin(), GroupCountStep.this.groupTraversal), traverser.bulk());
+            return mutatingSeed;
+        }
+    }
+
+    ///////////
+
+    public static final class GroupCountMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
+
+        private static final GroupCountMapReduce INSTANCE = new GroupCountMapReduce();
+
+        private GroupCountMapReduce() {
+
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return true;
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
+            vertex.<TraverserSet<E>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
+        }
+
+        @Override
+        public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+            long counter = 0;
+            while (values.hasNext()) {
+                counter = counter + values.next();
+            }
+            emitter.emit(key, counter);
+        }
+
+        @Override
+        public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+            reduce(key, values, emitter);
+        }
+
+        @Override
+        public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
+            final Map<E, Long> map = new HashMap<>();
+            keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+            return map;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        public static final <E> GroupCountMapReduce<E> instance() {
+            return INSTANCE;
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
new file mode 100644
index 0000000..2dc1be6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java
@@ -0,0 +1,277 @@
+/*
+ * 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.map;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
+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.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+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;
+import java.util.function.Supplier;
+
+/**
+ * @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 = null;
+    private Traversal.Admin<S, V> valueTraversal = null;
+    private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
+
+    public GroupStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier((Supplier) new GroupMapSupplier());
+        this.setBiFunction((BiFunction) new GroupBiFunction());
+    }
+
+    @Override
+    public <A, B> List<Traversal.Admin<A, B>> getLocalChildren() {
+        final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
+        if (null != this.keyTraversal)
+            children.add((Traversal.Admin) this.keyTraversal);
+        if (null != this.valueTraversal)
+            children.add((Traversal.Admin) this.valueTraversal);
+        if (null != this.reduceTraversal)
+            children.add((Traversal.Admin) this.reduceTraversal);
+        return children;
+    }
+
+    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() {
+        final GroupStep<S, K, V, R> clone = (GroupStep<S, K, V, R>) super.clone();
+        if (null != this.keyTraversal)
+            clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
+        if (null != this.valueTraversal)
+            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 GroupMapReduce<>(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.applyNullable(traverser, (Traversal.Admin<S, Map>) this.keyTraversal), TraversalUtil.applyNullable(traverser, (Traversal.Admin<S, Map>) this.valueTraversal)};
+            return traverser.asAdmin().split(kvPair, (Step) this);
+        } else {
+            return super.processNextStart();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.keyTraversal, this.valueTraversal, this.reduceTraversal);
+    }
+
+    ///////////
+
+    private class GroupBiFunction implements BiFunction<Map<K, Collection<V>>, Traverser.Admin<S>, Map<K, Collection<V>>>, Serializable {
+
+        private GroupBiFunction() {
+
+        }
+
+        @Override
+        public Map<K, Collection<V>> apply(final Map<K, Collection<V>> mutatingSeed, final Traverser.Admin<S> traverser) {
+            final K key = TraversalUtil.applyNullable(traverser, GroupStep.this.keyTraversal);
+            final V value = TraversalUtil.applyNullable(traverser, GroupStep.this.valueTraversal);
+            Collection<V> values = mutatingSeed.get(key);
+            if (null == values) {
+                values = new BulkSet<>();
+                mutatingSeed.put(key, values);
+            }
+            TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
+            return mutatingSeed;
+        }
+    }
+
+    //////////
+
+    private class GroupMap extends HashMap<K, Collection<V>> implements FinalGet<Map<K, R>> {
+
+        @Override
+        public Map<K, R> getFinal() {
+            if (null == GroupStep.this.reduceTraversal)
+                return (Map<K, R>) this;
+            else {
+                final Map<K, R> reduceMap = new HashMap<>();
+                this.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, GroupStep.this.reduceTraversal)));
+                return reduceMap;
+            }
+        }
+    }
+
+    private class GroupMapSupplier implements Supplier<GroupMap>, Serializable {
+
+        private GroupMapSupplier() {
+        }
+
+        @Override
+        public GroupMap get() {
+            return new GroupMap();
+        }
+    }
+
+    ///////////
+
+    public static final class GroupMapReduce<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 GroupMapReduce() {
+
+        }
+
+        public GroupMapReduce(final GroupStep<?, K, V, R> 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 GroupStep groupStep = new TraversalMatrix<>(traversal).getStepById(this.groupStepId);
+            this.reduceTraversal = groupStep.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();
+                if (objects[1] instanceof Collection)
+                    emitter.emit((K) objects[0], (Collection<V>) objects[1]);
+                else {
+                    final List<V> collection = new ArrayList<>();
+                    collection.add((V) objects[1]);
+                    emitter.emit((K) objects[0], collection);
+                }
+            }));
+        }
+
+        @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, TraversalUtil.applyNullable(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 GroupMapReduce<K, V, R> clone() {
+            try {
+                final GroupMapReduce<K, V, R> clone = (GroupMapReduce<K, V, R>) super.clone();
+                if (null != clone.reduceTraversal)
+                    clone.reduceTraversal = this.reduceTraversal.clone();
+                return clone;
+            } catch (final CloneNotSupportedException e) {
+                throw new IllegalStateException(e.getMessage(), e);
+            }
+        }
+
+        @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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.java
new file mode 100644
index 0000000..018c91e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/IdStep.java
@@ -0,0 +1,47 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class IdStep<S extends Element> extends MapStep<S, Object> {
+
+    public IdStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Object map(final Traverser.Admin<S> traverser) {
+        return traverser.get().id();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.java
new file mode 100644
index 0000000..1666c6c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/KeyStep.java
@@ -0,0 +1,47 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Property;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class KeyStep extends MapStep<Property, String> {
+
+    public KeyStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected String map(final Traverser.Admin<Property> traverser) {
+        return traverser.get().key();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.java
new file mode 100644
index 0000000..2b2313f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LabelStep.java
@@ -0,0 +1,47 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LabelStep<S extends Element> extends MapStep<S, String> {
+
+    public LabelStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected String map(final Traverser.Admin<S> traverser) {
+        return traverser.get().label();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java
new file mode 100644
index 0000000..3a039c3
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaFlatMapStep.java
@@ -0,0 +1,49 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Iterator;
+import java.util.function.Function;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaFlatMapStep<S, E> extends FlatMapStep<S, E> {
+
+    private final Function<Traverser<S>, Iterator<E>> function;
+
+    public LambdaFlatMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, Iterator<E>> function) {
+        super(traversal);
+        this.function = function;
+    }
+
+    @Override
+    protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
+        return this.function.apply(traverser);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.function);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java
new file mode 100644
index 0000000..4d505b7
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/LambdaMapStep.java
@@ -0,0 +1,48 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.function.Function;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaMapStep<S, E> extends MapStep<S, E> {
+
+    private final Function<Traverser<S>, E> function;
+
+    public LambdaMapStep(final Traversal.Admin traversal, final Function<Traverser<S>, E> function) {
+        super(traversal);
+        this.function = function;
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<S> traverser) {
+        return this.function.apply(traverser);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.function);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
new file mode 100644
index 0000000..4d1dc9d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MapStep.java
@@ -0,0 +1,53 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class MapStep<S, E> extends AbstractStep<S, E> {
+
+    public MapStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<E> processNextStart() {
+        while (true) {
+            final Traverser.Admin<S> traverser = this.starts.next();
+            return traverser.split(this.map(traverser), this);
+        }
+    }
+
+    protected abstract E map(final Traverser.Admin<S> traverser);
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.PATH_ACCESS); // TODO: this is bad -- just a hack right now.
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
new file mode 100644
index 0000000..c59ef33
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxGlobalStep.java
@@ -0,0 +1,133 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import 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 MapReducer {
+
+    public MaxGlobalStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier(new ConstantSupplier<>(null));
+        this.setBiFunction(MaxGlobalBiFunction.<S>instance());
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
+        return MaxGlobalMapReduce.instance();
+    }
+
+    /////
+
+    private static class MaxGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+        private static final MaxGlobalBiFunction INSTANCE = new MaxGlobalBiFunction();
+
+        private MaxGlobalBiFunction() {
+
+        }
+
+        @Override
+        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed != null && mutatingSeed.doubleValue() >= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+        }
+
+        public final static <S extends Number> MaxGlobalBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
+
+    ///////////
+
+    private static class MaxGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
+
+        private static final MaxGlobalMapReduce INSTANCE = new MaxGlobalMapReduce();
+
+        private MaxGlobalMapReduce() {
+
+        }
+
+        @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) {
+            if (values.hasNext()) {
+                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 Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+            return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
+        }
+
+        public static final MaxGlobalMapReduce instance() {
+            return INSTANCE;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
new file mode 100644
index 0000000..6d2a228
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MaxLocalStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MaxLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
+
+    public MaxLocalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<S> traverser) {
+        Number result;
+        final Iterator<E> iterator = traverser.get().iterator();
+        if (iterator.hasNext()) {
+            result = iterator.next();
+            while (iterator.hasNext()) {
+                final Number curr = iterator.next();
+                if (result.doubleValue() < curr.doubleValue()) result = curr;
+            }
+        } else {
+            result = Double.NaN;
+        }
+        return (E) result;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
new file mode 100644
index 0000000..7f2b39d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanGlobalStep.java
@@ -0,0 +1,218 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.MeanNumberSupplier;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MeanGlobalStep<S extends Number, E extends Number> extends ReducingBarrierStep<S, E> implements MapReducer {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT, TraverserRequirement.BULK);
+
+    public MeanGlobalStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier((Supplier) MeanNumberSupplier.instance());
+        this.setBiFunction((BiFunction) MeanGlobalBiFunction.instance());
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+
+    @Override
+    public MapReduce<Number, Long, Number, Long, Double> getMapReduce() {
+        return MeanGlobalMapReduce.instance();
+    }
+
+    /////
+
+    private static class MeanGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+        private static final MeanGlobalBiFunction INSTANCE = new MeanGlobalBiFunction();
+
+        private MeanGlobalBiFunction() {
+
+        }
+
+        @Override
+        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+            return (S) ((MeanNumber) mutatingSeed).add(traverser.get(), traverser.bulk());
+        }
+
+        public final static <S extends Number> MeanGlobalBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
+
+    ///////////
+
+    private static final class MeanGlobalMapReduce extends StaticMapReduce<Number, Long, Number, Long, Double> {
+
+        private static final MeanGlobalMapReduce INSTANCE = new MeanGlobalMapReduce();
+
+        private MeanGlobalMapReduce() {
+
+        }
+
+        @Override
+        public boolean doStage(final MapReduce.Stage stage) {
+            return true;
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<Number, Long> emitter) {
+            vertex.<TraverserSet<Number>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get(), traverser.bulk())));
+        }
+
+        @Override
+        public void combine(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
+            this.reduce(key, values, emitter);
+        }
+
+        @Override
+        public void reduce(final Number key, final Iterator<Long> values, final ReduceEmitter<Number, Long> emitter) {
+            long counter = 0;
+            while (values.hasNext()) {
+                counter = counter + values.next();
+            }
+            emitter.emit(key, counter);
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public Double generateFinalResult(final Iterator<KeyValue<Number, Long>> keyValues) {
+            if (keyValues.hasNext()) {
+                KeyValue<Number, Long> pair = keyValues.next();
+                double result = pair.getKey().doubleValue() * pair.getValue();
+                long counter = pair.getValue();
+                while (keyValues.hasNext()) {
+                    pair = keyValues.next();
+                    result += pair.getKey().doubleValue() * pair.getValue();
+                    counter += pair.getValue();
+                }
+                return result / counter;
+            }
+            return Double.NaN;
+        }
+
+        public static final MeanGlobalMapReduce instance() {
+            return INSTANCE;
+        }
+    }
+
+    ///
+
+    public static final class MeanNumber extends Number implements Comparable<Number>, FinalGet<Double> {
+
+        private long count;
+        private double sum;
+
+        public MeanNumber() {
+            this(0.0d, 0l);
+        }
+
+        public MeanNumber(final double number, final long count) {
+            this.count = count;
+            this.sum = number * count;
+        }
+
+        public MeanNumber add(final Number amount, final long count) {
+            this.count += count;
+            this.sum += amount.doubleValue() * count;
+            return this;
+        }
+
+        public MeanNumber add(final MeanNumber other) {
+            this.count += other.count;
+            this.sum += other.sum;
+            return this;
+        }
+
+        @Override
+        public int intValue() {
+            return (int) (this.sum / this.count);
+        }
+
+        @Override
+        public long longValue() {
+            return (long) (this.sum / this.count);
+        }
+
+        @Override
+        public float floatValue() {
+            return (float) (this.sum / this.count);
+        }
+
+        @Override
+        public double doubleValue() {
+            return this.sum / this.count;
+        }
+
+        @Override
+        public String toString() {
+            return Double.toString(this.doubleValue());
+        }
+
+        @Override
+        public int compareTo(final Number number) {
+            return Double.valueOf(this.doubleValue()).compareTo(number.doubleValue());
+        }
+
+        @Override
+        public boolean equals(final Object object) {
+            return object instanceof Number && Double.valueOf(this.doubleValue()).equals(((Number) object).doubleValue());
+        }
+
+        @Override
+        public int hashCode() {
+            return Double.valueOf(this.doubleValue()).hashCode();
+        }
+
+        @Override
+        public Double getFinal() {
+            return this.doubleValue();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
new file mode 100644
index 0000000..e2db6af
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MeanLocalStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MeanLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, Double> {
+
+    public MeanLocalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Double map(final Traverser.Admin<S> traverser) {
+        final Iterator<E> iterator = traverser.get().iterator();
+        if (iterator.hasNext()) {
+            Long counter = 1L;
+            Double result = iterator.next().doubleValue();
+            while (iterator.hasNext()) {
+                result += iterator.next().doubleValue();
+                counter++;
+            }
+            return result / counter;
+        } else {
+            return Double.NaN;
+        }
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
new file mode 100644
index 0000000..ef28d79
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinGlobalStep.java
@@ -0,0 +1,133 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import 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 MinGlobalStep<S extends Number> extends ReducingBarrierStep<S, S> implements MapReducer {
+
+    public MinGlobalStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier(new ConstantSupplier<>(null));
+        this.setBiFunction(MinGlobalBiFunction.instance());
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
+        return MinGlobalMapReduce.instance();
+    }
+
+    /////
+
+    private static class MinGlobalBiFunction<S extends Number> implements BiFunction<S, Traverser<S>, S>, Serializable {
+
+        private static final MinGlobalBiFunction INSTANCE = new MinGlobalBiFunction();
+
+        private MinGlobalBiFunction() {
+
+        }
+
+        @Override
+        public S apply(final S mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed != null && mutatingSeed.doubleValue() <= traverser.get().doubleValue() ? mutatingSeed : traverser.get();
+        }
+
+        public final static <S extends Number> MinGlobalBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
+
+    ///////////
+
+    private static class MinGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
+
+        private static final MinGlobalMapReduce INSTANCE = new MinGlobalMapReduce();
+
+        private MinGlobalMapReduce() {
+
+        }
+
+        @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) {
+            if (values.hasNext()) {
+                Number min = Double.MAX_VALUE;
+                while (values.hasNext()) {
+                    final Number value = values.next();
+                    if (value.doubleValue() < min.doubleValue())
+                        min = value;
+                }
+                emitter.emit(min);
+            }
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+            return keyValues.hasNext() ? keyValues.next().getValue() : Double.NaN;
+        }
+
+        public static final MinGlobalMapReduce instance() {
+            return INSTANCE;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
new file mode 100644
index 0000000..2959285
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MinLocalStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class MinLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
+
+    public MinLocalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<S> traverser) {
+        Number result;
+        final Iterator<E> iterator = traverser.get().iterator();
+        if (iterator.hasNext()) {
+            result = iterator.next();
+            while (iterator.hasNext()) {
+                final Number curr = iterator.next();
+                if (result.doubleValue() > curr.doubleValue()) result = curr;
+            }
+        } else {
+            result = Double.NaN;
+        }
+        return (E) result;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
new file mode 100644
index 0000000..39d98ef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
@@ -0,0 +1,95 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Order;
+import org.apache.tinkerpop.gremlin.util.function.ChainedComparator;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S> {
+
+    private final List<Comparator<S>> comparators = new ArrayList<>();
+
+    public OrderGlobalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    public void barrierConsumer(final TraverserSet<S> traverserSet) {
+        traverserSet.sort(this.comparators.isEmpty() ? new ComparatorTraverser(Order.incr) : new ChainedComparator(ComparatorTraverser.convertComparator((List) this.comparators)));
+    }
+
+    @Override
+    public void addComparator(final Comparator<S> comparator) {
+        this.comparators.add(comparator);
+    }
+
+    @Override
+    public List<Comparator<S>> getComparators() {
+        return this.comparators.isEmpty() ? Arrays.asList((Comparator) Order.incr) : this.comparators;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.comparators);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+
+    /////
+
+    private static class ComparatorTraverser<S> implements Comparator<Traverser<S>>, Serializable {
+
+        private final Comparator<S> comparator;
+
+        public ComparatorTraverser(final Comparator<S> comparator) {
+            this.comparator = comparator;
+        }
+
+        @Override
+        public int compare(final Traverser<S> traverserA, final Traverser<S> traverserB) {
+            return this.comparator.compare(traverserA.get(), traverserB.get());
+        }
+
+        public static <S> List<ComparatorTraverser<S>> convertComparator(final List<Comparator<S>> comparators) {
+            return comparators.stream().map(comparator -> new ComparatorTraverser<>(comparator)).collect(Collectors.toList());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
new file mode 100644
index 0000000..cdd8f2b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderLocalStep.java
@@ -0,0 +1,100 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class OrderLocalStep<S, M> extends MapStep<S, S> implements ComparatorHolder<M> {
+
+    private final List<Comparator<M>> comparators = new ArrayList<>();
+    private Comparator<M> chainedComparator = null;
+
+    public OrderLocalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected S map(final Traverser.Admin<S> traverser) {
+        final S start = traverser.get();
+        if (start instanceof Collection)
+            return (S) OrderLocalStep.sortCollection((List) start, this.chainedComparator);
+        else if (start instanceof Map)
+            return (S) OrderLocalStep.sortMap((Map) start, this.chainedComparator);
+        else
+            return start;
+    }
+
+    @Override
+    public void addComparator(final Comparator<M> comparator) {
+        this.comparators.add(comparator);
+        this.chainedComparator = this.comparators.stream().reduce((a, b) -> a.thenComparing(b)).get();
+    }
+
+    @Override
+    public List<Comparator<M>> getComparators() {
+        return this.comparators;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.comparators);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+
+    /////////////
+
+    private static final <A> List<A> sortCollection(final Collection<A> collection, final Comparator<?> comparator) {
+        if (collection instanceof List) {
+            Collections.sort((List) collection, (Comparator) comparator);
+            return (List<A>) collection;
+        } else {
+            final List<A> list = new ArrayList<>(collection);
+            Collections.sort(list, (Comparator) comparator);
+            return list;
+        }
+    }
+
+    private static final <K, V> Map<K, V> sortMap(final Map<K, V> map, final Comparator<?> comparator) {
+        final List<Map.Entry<K, V>> entries = new ArrayList<>(map.entrySet());
+        Collections.sort(entries, (Comparator) comparator);
+        final LinkedHashMap<K, V> sortedMap = new LinkedHashMap<>();
+        entries.forEach(entry -> sortedMap.put(entry.getKey(), entry.getValue()));
+        return sortedMap;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
new file mode 100644
index 0000000..fcb6b9a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PathStep.java
@@ -0,0 +1,95 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+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.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MutablePath;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PathStep<S> extends MapStep<S, Path> implements TraversalParent {
+
+    private TraversalRing<Object, Object> traversalRing;
+
+    public PathStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.traversalRing = new TraversalRing<>();
+    }
+
+    @Override
+    protected Path map(final Traverser.Admin<S> traverser) {
+        final Path path;
+        if (this.traversalRing.isEmpty())
+            path = traverser.path();
+        else {
+            path = MutablePath.make();
+            traverser.path().forEach((object, labels) -> path.extend(TraversalUtil.apply(object, this.traversalRing.next()), labels.toArray(new String[labels.size()])));
+        }
+        this.traversalRing.reset();
+        return path;
+    }
+
+    @Override
+    public PathStep<S> clone() {
+        final PathStep<S> clone = (PathStep<S>) super.clone();
+        clone.traversalRing = new TraversalRing<>();
+        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+        }
+        return clone;
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.traversalRing.reset();
+    }
+
+    @Override
+    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+        return this.traversalRing.getTraversals();
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> pathTraversal) {
+        this.traversalRing.addTraversal(this.integrateChild(pathTraversal));
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.traversalRing);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.PATH);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java
new file mode 100644
index 0000000..2504e05
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertiesStep.java
@@ -0,0 +1,71 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.PropertyType;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PropertiesStep<E> extends FlatMapStep<Element, E> {
+
+    protected final String[] propertyKeys;
+    protected final PropertyType returnType;
+
+    public PropertiesStep(final Traversal.Admin traversal, final PropertyType propertyType, final String... propertyKeys) {
+        super(traversal);
+        this.returnType = propertyType;
+        this.propertyKeys = propertyKeys;
+    }
+
+    @Override
+    protected Iterator<E> flatMap(final Traverser.Admin<Element> traverser) {
+        return this.returnType.equals(PropertyType.VALUE) ?
+                traverser.get().values(this.propertyKeys) :
+                (Iterator) traverser.get().properties(this.propertyKeys);
+    }
+
+    public PropertyType getReturnType() {
+        return this.returnType;
+    }
+
+    public String[] getPropertyKeys() {
+        return this.propertyKeys;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java
new file mode 100644
index 0000000..7cb78e8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyElementStep.java
@@ -0,0 +1,50 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Property;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PropertyElementStep<E> extends MapStep<Property<E>, Element> {
+
+    public PropertyElementStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Element map(final Traverser.Admin<Property<E>> traverser) {
+        return traverser.get().element();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+
+    // TODO: reverse()
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
new file mode 100644
index 0000000..f63faf8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyMapStep.java
@@ -0,0 +1,91 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.PropertyType;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class PropertyMapStep<E> extends MapStep<Element, Map<String, E>> {   // TODO: Map<Object,E> cause of T.
+
+    protected final String[] propertyKeys;
+    protected final PropertyType returnType;
+    protected final boolean includeTokens;
+
+    public PropertyMapStep(final Traversal.Admin traversal, final boolean includeTokens, final PropertyType propertyType, final String... propertyKeys) {
+        super(traversal);
+        this.includeTokens = includeTokens;
+        this.propertyKeys = propertyKeys;
+        this.returnType = propertyType;
+    }
+
+    @Override
+    protected Map<String, E> map(final Traverser.Admin<Element> traverser) {
+        if (this.returnType.equals(PropertyType.VALUE)) {
+            final Element element = traverser.get();
+            final Map map = traverser.get() instanceof Vertex ?
+                    (Map) ElementHelper.vertexPropertyValueMap((Vertex) element, propertyKeys) :
+                    (Map) ElementHelper.propertyValueMap(element, propertyKeys);
+            if (includeTokens) {
+                if (element instanceof VertexProperty) {
+                    map.put(T.id, element.id());
+                    map.put(T.key, ((VertexProperty) element).key());
+                    map.put(T.value, ((VertexProperty) element).value());
+                } else {
+                    map.put(T.id, element.id());
+                    map.put(T.label, element.label());
+                }
+            }
+            return map;
+
+        } else {
+            return traverser.get() instanceof Vertex ?
+                    (Map) ElementHelper.vertexPropertyMap((Vertex) traverser.get(), propertyKeys) :
+                    (Map) ElementHelper.propertyMap(traverser.get(), propertyKeys);
+        }
+    }
+
+    public PropertyType getReturnType() {
+        return this.returnType;
+    }
+
+    public String toString() {
+        return TraversalHelper.makeStepString(this, Arrays.asList(this.propertyKeys), this.returnType.name().toLowerCase());
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.java
new file mode 100644
index 0000000..eab0ea6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/PropertyValueStep.java
@@ -0,0 +1,47 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Property;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class PropertyValueStep<E> extends MapStep<Property<E>, E> {
+
+    public PropertyValueStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<Property<E>> traverser) {
+        return traverser.get().value();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}


[33/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index f135484..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/GroupSideEffectStep.java
+++ /dev/null
@@ -1,248 +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.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.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.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.ArrayList;
-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, EngineDependent, MapReducer<K, Collection<V>, K, R, Map<K, R>> {
-
-    private char state = 'k';
-    private Traversal.Admin<S, K> keyTraversal = null;
-    private Traversal.Admin<S, V> valueTraversal = null;
-    private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
-    private 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>> groupMap = null == this.tempGroupByMap ? traverser.sideEffects(this.sideEffectKey) : this.tempGroupByMap; // for nested traversals and not !starts.hasNext()
-        final K key = TraversalUtil.applyNullable(traverser, keyTraversal);
-        final V value = TraversalUtil.applyNullable(traverser, valueTraversal);
-        Collection<V> values = groupMap.get(key);
-        if (null == values) {
-            values = new BulkSet<>();
-            groupMap.put(key, values);
-        }
-        TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
-        //////// reducer for OLTP
-        if (!this.onGraphComputer && null != this.reduceTraversal && !this.starts.hasNext()) {
-            this.tempGroupByMap = groupMap;
-            final Map<K, R> reduceMap = new HashMap<>();
-            groupMap.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, this.reduceTraversal)));
-            traverser.sideEffects(this.sideEffectKey, reduceMap);
-        }
-    }
-
-    @Override
-    public String getSideEffectKey() {
-        return this.sideEffectKey;
-    }
-
-    @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() {
-        final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
-        if (null != this.keyTraversal)
-            children.add((Traversal.Admin) this.keyTraversal);
-        if (null != this.valueTraversal)
-            children.add((Traversal.Admin) this.valueTraversal);
-        if (null != this.reduceTraversal)
-            children.add((Traversal.Admin) this.reduceTraversal);
-        return children;
-    }
-
-    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() {
-        final GroupSideEffectStep<S, K, V, R> clone = (GroupSideEffectStep<S, K, V, R>) super.clone();
-        if (null != this.keyTraversal)
-            clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
-        if (null != this.valueTraversal)
-            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_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupSideEffectStep.sideEffectKey";
-        public static final String GROUP_SIDE_EFFECT_STEP_STEP_ID = "gremlin.groupSideEffectStep.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_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
-            configuration.setProperty(GROUP_SIDE_EFFECT_STEP_STEP_ID, this.groupStepId);
-        }
-
-        @Override
-        public void loadState(final Configuration configuration) {
-            this.sideEffectKey = configuration.getString(GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
-            this.groupStepId = configuration.getString(GROUP_SIDE_EFFECT_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, TraversalUtil.applyNullable(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() {
-            try {
-                final GroupSideEffectMapReduce<K, V, R> clone = (GroupSideEffectMapReduce<K, V, R>) super.clone();
-                if (null != clone.reduceTraversal)
-                    clone.reduceTraversal = this.reduceTraversal.clone();
-                return clone;
-            } catch (final CloneNotSupportedException e) {
-                throw new IllegalStateException(e.getMessage(), e);
-            }
-        }
-
-        @Override
-        public String toString() {
-            return StringFactory.mapReduceString(this, this.getMemoryKey());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java
deleted file mode 100644
index d572bc2..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/IdentityStep.java
+++ /dev/null
@@ -1,40 +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.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.NoSuchElementException;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class IdentityStep<S> extends AbstractStep<S, S> {
-
-    public IdentityStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
deleted file mode 100644
index 2b4a927..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/InjectStep.java
+++ /dev/null
@@ -1,50 +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.util.iterator.ArrayIterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class InjectStep<S> extends StartStep<S> {
-
-    private final S[] injections;
-
-    @SafeVarargs
-    public InjectStep(final Traversal.Admin traversal, final S... injections) {
-        super(traversal);
-        this.injections = injections;
-        this.start = new ArrayIterator<>(this.injections);
-    }
-
-    @Override
-    public InjectStep<S> clone() {
-        final InjectStep<S> clone = (InjectStep<S>) super.clone();
-        clone.start = new ArrayIterator<>(clone.injections);
-        return clone;
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.start = new ArrayIterator<>(this.injections);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java
deleted file mode 100644
index 556d8ca..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/LambdaSideEffectStep.java
+++ /dev/null
@@ -1,48 +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.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.function.Consumer;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LambdaSideEffectStep<S> extends SideEffectStep<S> {
-
-    private final Consumer<Traverser<S>> consumer;
-
-    public LambdaSideEffectStep(final Traversal.Admin traversal, final Consumer<Traverser<S>> consumer) {
-        super(traversal);
-        this.consumer = consumer;
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<S> traverser) {
-        this.consumer.accept(traverser);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.consumer);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
deleted file mode 100644
index 6f811d7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/ProfileStep.java
+++ /dev/null
@@ -1,219 +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.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.VertexTraversalSideEffects;
-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.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.util.metric.DependantMutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class ProfileStep<S> extends AbstractStep<S, S> implements MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
-
-    // Stored in the Traversal sideEffects but kept here as a reference for convenience.
-    private StandardTraversalMetrics traversalMetrics;
-
-    public ProfileStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-
-    @Override
-    public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
-        return ProfileMapReduce.instance();
-    }
-
-    @Override
-    public Traverser<S> next() {
-        Traverser<S> ret = null;
-        initializeIfNeeded();
-        traversalMetrics.start(this.getId());
-        try {
-            ret = super.next();
-            return ret;
-        } finally {
-            if (ret != null) {
-                traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
-            } else {
-                traversalMetrics.stop(this.getId());
-            }
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        initializeIfNeeded();
-        traversalMetrics.start(this.getId());
-        boolean ret = super.hasNext();
-        traversalMetrics.stop(this.getId());
-        return ret;
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-
-    private void initializeIfNeeded() {
-        if (traversalMetrics != null) {
-            return;
-        }
-
-        createTraversalMetricsSideEffectIfNecessary();
-
-        // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
-        // sideEffects after serialization.
-        if (traversalMetrics == null) {
-            // look up the TraversalMetrics in the root traversal's sideEffects
-            Traversal t = this.getTraversal();
-            while (!(t.asAdmin().getParent() instanceof EmptyStep)) {
-                t = t.asAdmin().getParent().asStep().getTraversal();
-            }
-            traversalMetrics = t.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
-        }
-    }
-
-    private void createTraversalMetricsSideEffectIfNecessary() {
-        if (this.getTraversal().getSideEffects().exists(TraversalMetrics.METRICS_KEY)) {
-            // Already initialized
-            return;
-        }
-
-        if (!(this.getTraversal().getParent() instanceof EmptyStep)) {
-            // Initialization is handled at the top-level of the traversal only.
-            return;
-        }
-
-        // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
-        // once per thread if using Computer.)
-
-        traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(TraversalMetrics.METRICS_KEY, StandardTraversalMetrics::new);
-        prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
-    }
-
-    // Walk the traversal steps and initialize the Metrics timers.
-    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, MutableMetrics parentMetrics) {
-
-        DependantMutableMetrics prevMetrics = null;
-        final List<Step> steps = traversal.getSteps();
-        for (int ii = 0; ii + 1 < steps.size(); ii = ii + 2) {
-            Step step = steps.get(ii);
-            ProfileStep profileStep = (ProfileStep) steps.get(ii + 1);
-
-            // Create metrics
-            MutableMetrics metrics;
-
-            // Computer metrics are "stand-alone" but Standard metrics handle double-counted upstream time.
-            if (traversal.getEngine().isComputer()) {
-                metrics = new MutableMetrics(step.getId(), step.toString());
-            } else {
-                metrics = new DependantMutableMetrics(step.getId(), step.toString(), prevMetrics);
-                prevMetrics = (DependantMutableMetrics) metrics;
-            }
-
-            // Initialize counters (necessary because some steps might end up being 0)
-            metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, 0);
-            metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 0);
-
-            // Add metrics to parent, if necessary
-            if (parentMetrics != null) {
-                parentMetrics.addNested(metrics);
-            }
-
-            // The TraversalMetrics sideEffect is shared across all the steps.
-            profileStep.traversalMetrics = this.traversalMetrics;
-
-            // Add root metrics to traversalMetrics
-            this.traversalMetrics.addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileStep.getId());
-
-            // Handle nested traversal
-            if (step instanceof TraversalParent) {
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
-                    prepTraversalForProfiling(t, metrics);
-                }
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
-                    prepTraversalForProfiling(t, metrics);
-                }
-            }
-        }
-    }
-
-    //////////////////
-
-    public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
-
-        private static ProfileMapReduce INSTANCE = new ProfileMapReduce();
-
-        private ProfileMapReduce() {
-
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return true;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return TraversalMetrics.METRICS_KEY;
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            VertexTraversalSideEffects.of(vertex).<StandardTraversalMetrics>ifPresent(TraversalMetrics.METRICS_KEY, emitter::emit);
-        }
-
-        @Override
-        public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            reduce(key, values, emitter);
-        }
-
-        @Override
-        public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            emitter.emit(StandardTraversalMetrics.merge(values));
-        }
-
-        @Override
-        public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
-            return keyValues.next().getValue();
-        }
-
-        public static ProfileMapReduce instance() {
-            return INSTANCE;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java
deleted file mode 100644
index 57ba41c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackElementValueStep.java
+++ /dev/null
@@ -1,66 +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.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.function.BinaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SackElementValueStep<S extends Element, V> extends SideEffectStep<S> {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.SACK,
-            TraverserRequirement.OBJECT
-    );
-
-    private BinaryOperator<V> operator;
-    private final String propertyKey;
-
-    public SackElementValueStep(final Traversal.Admin traversal, final BinaryOperator<V> operator, final String propertyKey) {
-        super(traversal);
-        this.operator = operator;
-        this.propertyKey = propertyKey;
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<S> traverser) {
-        traverser.get().values(this.propertyKey).forEachRemaining(value -> {
-            traverser.sack(this.operator.apply(traverser.sack(), (V) value));
-        });
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.operator, this.propertyKey);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java
deleted file mode 100644
index 3df89e8..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SackObjectStep.java
+++ /dev/null
@@ -1,55 +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.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.EnumSet;
-import java.util.Set;
-import java.util.function.BiFunction;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SackObjectStep<S, V> extends SideEffectStep<S> {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.SACK,
-            TraverserRequirement.OBJECT
-    );
-
-    private final BiFunction<V, S, V> operator;
-
-    public SackObjectStep(final Traversal.Admin traversal, final BiFunction<V, S, V> operator) {
-        super(traversal);
-        this.operator = operator;
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<S> traverser) {
-        traverser.sack(this.operator.apply(traverser.sack(), traverser.get()));
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
deleted file mode 100644
index 800aa58..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectCapStep.java
+++ /dev/null
@@ -1,80 +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.graph.traversal.step.util.SupplyingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Arrays;
-import java.util.EnumSet;
-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 SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.SIDE_EFFECTS,
-            TraverserRequirement.OBJECT
-    );
-
-    private List<String> sideEffectKeys;
-
-    public SideEffectCapStep(final Traversal.Admin traversal, final String... sideEffectKeys) {
-        super(traversal);
-        if (0 == sideEffectKeys.length)
-            throw new IllegalArgumentException("At least one sideEffect key must be provided to " + this.getClass().getSimpleName());
-        this.sideEffectKeys = Arrays.asList(sideEffectKeys);
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKeys);
-    }
-
-    public List<String> getSideEffectKeys() {
-        return this.sideEffectKeys;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-
-    @Override
-    public E supply() {
-        return this.sideEffectKeys.size() == 1 ?
-                this.getTraversal().asAdmin().getSideEffects().get(this.sideEffectKeys.get(0)) :
-                (E) this.getMapOfSideEffects();
-    }
-
-    public Map<String, Object> getMapOfSideEffects() {
-        final Map<String, Object> sideEffects = new HashMap<>();
-        for (final String sideEffectKey : this.sideEffectKeys) {
-            sideEffects.put(sideEffectKey, this.getTraversal().asAdmin().getSideEffects().get(sideEffectKey));
-        }
-        return sideEffects;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java
deleted file mode 100644
index 3ec2aa1..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SideEffectStep.java
+++ /dev/null
@@ -1,42 +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.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SideEffectStep<S> extends AbstractStep<S, S> {
-
-    public SideEffectStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    protected abstract void sideEffect(final Traverser.Admin<S> traverser);
-
-    @Override
-    protected Traverser<S> processNextStart() {
-        final Traverser.Admin<S> traverser = this.starts.next();
-        this.sideEffect(traverser);
-        return traverser;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java
deleted file mode 100644
index e56a7e7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StartStep.java
+++ /dev/null
@@ -1,79 +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.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-import java.util.Iterator;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class StartStep<S> extends AbstractStep<S, S> {
-
-    protected Object start;
-    protected boolean first = true;
-
-    public StartStep(final Traversal.Admin traversal, final Object start) {
-        super(traversal);
-        this.start = start;
-    }
-
-    public StartStep(final Traversal.Admin traversal) {
-        this(traversal, null);
-    }
-
-    public <T> T getStart() {
-        return (T) this.start;
-    }
-
-    public boolean startAssignableTo(final Class... assignableClasses) {
-        return Stream.of(assignableClasses).filter(check -> check.isAssignableFrom(this.start.getClass())).findAny().isPresent();
-    }
-
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.start);
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() {
-        if (this.first) {
-            if (null != this.start) {
-                if (this.start instanceof Iterator)
-                    this.starts.add(this.getTraversal().getTraverserGenerator().generateIterator((Iterator<S>) this.start, this, 1l));
-                else
-                    this.starts.add(this.getTraversal().getTraverserGenerator().generate((S) this.start, this, 1l));
-            }
-            this.first = false;
-        }
-        return this.starts.next();
-    }
-
-    @Override
-    public StartStep<S> clone() {
-        final StartStep<S> clone = (StartStep<S>) super.clone();
-        clone.first = true;
-        clone.start = null;
-        return clone;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 71cc96c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/StoreStep.java
+++ /dev/null
@@ -1,159 +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.commons.configuration.Configuration;
-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.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-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.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.BulkSetSupplier;
-
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
-    private Traversal.Admin<S, Object> storeTraversal = null;
-    private String sideEffectKey;
-
-    public StoreStep(final Traversal.Admin traversal, final String sideEffectKey) {
-        super(traversal);
-        this.sideEffectKey = sideEffectKey;
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<S> traverser) {
-        TraversalHelper.addToCollection(
-                traverser.sideEffects(this.sideEffectKey),
-                TraversalUtil.applyNullable(traverser.asAdmin(), this.storeTraversal),
-                traverser.bulk());
-    }
-
-    @Override
-    public String getSideEffectKey() {
-        return this.sideEffectKey;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.storeTraversal);
-    }
-
-    @Override
-    public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
-        return new StoreMapReduce(this);
-    }
-
-    @Override
-    public List<Traversal.Admin<S, Object>> getLocalChildren() {
-        return null == this.storeTraversal ? Collections.emptyList() : Collections.singletonList(this.storeTraversal);
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> storeTraversal) {
-        this.storeTraversal = this.integrateChild(storeTraversal);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
-    }
-
-    @Override
-    public StoreStep<S> clone() {
-        final StoreStep<S> clone = (StoreStep<S>) super.clone();
-        if (null != this.storeTraversal)
-            clone.storeTraversal = clone.integrateChild(this.storeTraversal.clone());
-        return clone;
-    }
-
-    ///////////////
-
-    public static final class StoreMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
-
-        public static final String STORE_STEP_SIDE_EFFECT_KEY = "gremlin.storeStep.sideEffectKey";
-
-        private String sideEffectKey;
-        private Supplier<Collection> collectionSupplier;
-
-        private StoreMapReduce() {
-
-        }
-
-        public StoreMapReduce(final StoreStep step) {
-            this.sideEffectKey = step.getSideEffectKey();
-            this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
-        }
-
-        @Override
-        public void storeState(final Configuration configuration) {
-            super.storeState(configuration);
-            configuration.setProperty(STORE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
-        }
-
-        @Override
-        public void loadState(final Configuration configuration) {
-            this.sideEffectKey = configuration.getString(STORE_STEP_SIDE_EFFECT_KEY);
-            this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return stage.equals(Stage.MAP);
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
-            VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
-        }
-
-        @Override
-        public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
-            final Collection collection = this.collectionSupplier.get();
-            keyValues.forEachRemaining(pair -> collection.add(pair.getValue()));
-            return collection;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return this.sideEffectKey;
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java
deleted file mode 100644
index 5d3b7b3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/SubgraphStep.java
+++ /dev/null
@@ -1,122 +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.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.GraphFactory;
-
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * A side-effect step that produces an edge induced subgraph.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class SubgraphStep extends SideEffectStep<Edge> implements SideEffectCapable {
-
-    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
-            TraverserRequirement.OBJECT,
-            TraverserRequirement.SIDE_EFFECTS
-    );
-
-    private Graph subgraph;
-    private String sideEffectKey;
-
-    private static final Map<String, Object> DEFAULT_CONFIGURATION = new HashMap<String, Object>() {{
-        put(Graph.GRAPH, "org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph"); // hard coded because TinkerGraph is not part of gremlin-core
-    }};
-
-    // TODO: add support for side-effecting out an edge list.
-
-    public SubgraphStep(final Traversal.Admin traversal, final String sideEffectKey) {
-        super(traversal);
-        this.sideEffectKey = sideEffectKey;
-        this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, () -> GraphFactory.open(DEFAULT_CONFIGURATION));
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<Edge> traverser) {
-        if (null == this.subgraph) {
-            this.subgraph = traverser.sideEffects(this.sideEffectKey);
-            if (!this.subgraph.features().vertex().supportsUserSuppliedIds() || !this.subgraph.features().edge().supportsUserSuppliedIds())
-                throw new IllegalArgumentException("The provided subgraph must support user supplied ids for vertices and edges: " + this.subgraph);
-        }
-        SubgraphStep.addEdgeToSubgraph(this.subgraph, traverser.get());
-    }
-
-    @Override
-    public String getSideEffectKey() {
-        return this.sideEffectKey;
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKey);
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return REQUIREMENTS;
-    }
-
-    @Override
-    public SubgraphStep clone() {
-        final SubgraphStep clone = (SubgraphStep) super.clone();
-        this.subgraph = null;
-        return clone;
-    }
-
-    ///
-
-    private static Vertex getOrCreate(final Graph subgraph, final Vertex vertex) {
-        final Iterator<Vertex> vertexIterator = subgraph.vertices(vertex.id());
-        if (vertexIterator.hasNext()) return vertexIterator.next();
-        final Vertex subgraphVertex = subgraph.addVertex(T.id, vertex.id(), T.label, vertex.label());
-        vertex.properties().forEachRemaining(vertexProperty -> {
-            final VertexProperty<?> subgraphVertexProperty = subgraphVertex.property(vertexProperty.key(), vertexProperty.value(), T.id, vertexProperty.id()); // TODO: demand vertex property id?
-            vertexProperty.properties().forEachRemaining(property -> subgraphVertexProperty.<Object>property(property.key(), property.value()));
-        });
-        return subgraphVertex;
-    }
-
-    private static void addEdgeToSubgraph(final Graph subgraph, final Edge edge) {
-        final Iterator<Edge> edgeIterator = subgraph.edges(edge.id());
-        if (edgeIterator.hasNext()) return;
-        final Iterator<Vertex> vertexIterator = edge.vertices(Direction.BOTH);
-        final Vertex subGraphOutVertex = getOrCreate(subgraph, vertexIterator.next());
-        final Vertex subGraphInVertex = getOrCreate(subgraph, vertexIterator.next());
-        final Edge subGraphEdge = subGraphOutVertex.addEdge(edge.label(), subGraphInVertex, T.id, edge.id());
-        edge.properties().forEachRemaining(property -> subGraphEdge.<Object>property(property.key(), property.value()));
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java
deleted file mode 100644
index fbb3425..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/sideEffect/TreeSideEffectStep.java
+++ /dev/null
@@ -1,182 +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.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-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.TraversalRing;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.TreeSupplier;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TreeSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<Object, Tree, Object, Tree, Tree> {
-
-    private TraversalRing<Object, Object> traversalRing;
-    private String sideEffectKey;
-
-    public TreeSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
-        super(traversal);
-        this.sideEffectKey = sideEffectKey;
-        this.traversalRing = new TraversalRing<>();
-        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, TreeSupplier.instance());
-    }
-
-    @Override
-    protected void sideEffect(final Traverser.Admin<S> traverser) {
-        Tree depth = traverser.sideEffects(this.sideEffectKey);
-        final Path path = traverser.path();
-        for (int i = 0; i < path.size(); i++) {
-            final Object object = TraversalUtil.apply(path.<Object>get(i), this.traversalRing.next());
-            if (!depth.containsKey(object))
-                depth.put(object, new Tree<>());
-            depth = (Tree) depth.get(object);
-        }
-        this.traversalRing.reset();
-    }
-
-    @Override
-    public String getSideEffectKey() {
-        return this.sideEffectKey;
-    }
-
-    @Override
-    public MapReduce<Object, Tree, Object, Tree, Tree> getMapReduce() {
-        return new TreeSideEffectMapReduce(this);
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.traversalRing.reset();
-    }
-
-    @Override
-    public String toString() {
-        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.traversalRing);
-    }
-
-    @Override
-    public TreeSideEffectStep<S> clone()  {
-        final TreeSideEffectStep<S> clone = (TreeSideEffectStep<S>) super.clone();
-        clone.traversalRing = new TraversalRing<>();
-        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
-            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
-        }
-        return clone;
-    }
-
-    @Override
-    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
-        return this.traversalRing.getTraversals();
-    }
-
-    @Override
-    public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
-        this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
-    }
-
-    ////////////////
-
-    public static final class TreeSideEffectMapReduce extends StaticMapReduce<Object, Tree, Object, Tree, Tree> {
-
-        public static final String TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.treeSideEffectStep.sideEffectKey";
-
-        private String sideEffectKey;
-
-        private TreeSideEffectMapReduce() {
-
-        }
-
-        public TreeSideEffectMapReduce(final TreeSideEffectStep step) {
-            this.sideEffectKey = step.getSideEffectKey();
-        }
-
-        @Override
-        public void storeState(final Configuration configuration) {
-            super.storeState(configuration);
-            configuration.setProperty(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
-        }
-
-        @Override
-        public void loadState(final Configuration configuration) {
-            this.sideEffectKey = configuration.getString(TREE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return stage.equals(Stage.MAP);
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<Object, Tree> emitter) {
-            VertexTraversalSideEffects.of(vertex).<Tree<?>>ifPresent(this.sideEffectKey, tree -> tree.splitParents().forEach(branches -> emitter.emit(branches.keySet().iterator().next(), branches)));
-        }
-
-        /*
-        @Override
-        public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
-            this.reduce(key, values, emitter);
-        }
-
-        @Override
-        public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
-            final Tree tree = new Tree();
-            values.forEachRemaining(tree::addTree);
-            emitter.emit(tree);
-        }
-        */
-
-        @Override
-        public Tree generateFinalResult(final Iterator<KeyValue<Object, Tree>> keyValues) {
-            final Tree result = new Tree();
-            keyValues.forEachRemaining(keyValue -> result.addTree(keyValue.getValue()));
-            return result;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return this.sideEffectKey;
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
deleted file mode 100644
index 9b401c4..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/CollectingBarrierStep.java
+++ /dev/null
@@ -1,68 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> {
-    private TraverserSet<S> traverserSet = new TraverserSet<>();
-
-    public CollectingBarrierStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    public abstract void barrierConsumer(final TraverserSet<S> traverserSet);
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.BULK);
-    }
-
-    @Override
-    public Traverser<S> processNextStart() {
-        if (this.starts.hasNext()) {
-            this.starts.forEachRemaining(this.traverserSet::add);
-            this.barrierConsumer(this.traverserSet);
-        }
-        return this.traverserSet.remove();
-    }
-
-    @Override
-    public CollectingBarrierStep<S> clone() {
-        final CollectingBarrierStep<S> clone = (CollectingBarrierStep<S>) super.clone();
-        clone.traverserSet = new TraverserSet<>();
-        return clone;
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.traverserSet.clear();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
deleted file mode 100644
index 01ecfe0..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ComputerAwareStep.java
+++ /dev/null
@@ -1,95 +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.util;
-
-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.traversal.step.EngineDependent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ComputerAwareStep<S, E> extends AbstractStep<S, E> implements EngineDependent {
-
-    private Iterator<Traverser<E>> previousIterator = EmptyIterator.instance();
-
-    public ComputerAwareStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<E> processNextStart() throws NoSuchElementException {
-        while (true) {
-            if (this.previousIterator.hasNext())
-                return this.previousIterator.next();
-            this.previousIterator = this.traverserStepIdSetByChild ? this.computerAlgorithm() : this.standardAlgorithm();
-        }
-    }
-
-    @Override
-    public void onEngine(final TraversalEngine engine) {
-        this.traverserStepIdSetByChild = engine.isComputer();
-    }
-
-    @Override
-    public ComputerAwareStep<S, E> clone() {
-        final ComputerAwareStep<S, E> clone = (ComputerAwareStep<S, E>) super.clone();
-        clone.previousIterator = Collections.emptyIterator();
-        return clone;
-    }
-
-    protected abstract Iterator<Traverser<E>> standardAlgorithm() throws NoSuchElementException;
-
-    protected abstract Iterator<Traverser<E>> computerAlgorithm() throws NoSuchElementException;
-
-    //////
-
-    public class EndStep extends AbstractStep<S, S> implements EngineDependent {
-
-        public EndStep(final Traversal.Admin traversal) {
-            super(traversal);
-        }
-
-        @Override
-        protected Traverser<S> processNextStart() throws NoSuchElementException {
-            final Traverser.Admin<S> start = this.starts.next();
-            if (this.traverserStepIdSetByChild) start.setStepId(ComputerAwareStep.this.getNextStep().getId());
-            return start;
-        }
-
-        @Override
-        public String toString() {
-            return TraversalHelper.makeStepString(this);
-        }
-
-        @Override
-        public void onEngine(final TraversalEngine engine) {
-            this.traverserStepIdSetByChild = engine.isComputer();
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java
deleted file mode 100644
index 379fa4e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/MarkerIdentityStep.java
+++ /dev/null
@@ -1,40 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.NoSuchElementException;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class MarkerIdentityStep<S> extends AbstractStep<S, S> {
-
-    public MarkerIdentityStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java
deleted file mode 100644
index 4b39aa6..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/PathIdentityStep.java
+++ /dev/null
@@ -1,49 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-
-import java.util.Collections;
-import java.util.NoSuchElementException;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class PathIdentityStep<S> extends AbstractStep<S, S> {
-
-    public PathIdentityStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.singleton(TraverserRequirement.PATH);
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 1f48885..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/ReducingBarrierStep.java
+++ /dev/null
@@ -1,180 +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.util;
-
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Step;
-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.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
-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.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.util.Iterator;
-import java.util.function.BiFunction;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class ReducingBarrierStep<S, E> extends AbstractStep<S, E> implements MapReducer, EngineDependent {
-
-    public static final String REDUCING = Graph.Hidden.hide("reducing");
-
-    protected Supplier<E> seedSupplier;
-    protected BiFunction<E, Traverser<S>, E> reducingBiFunction;
-    private boolean done = false;
-    protected boolean byPass = false;
-
-    public ReducingBarrierStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    public void setSeedSupplier(final Supplier<E> seedSupplier) {
-        this.seedSupplier = seedSupplier;
-    }
-
-    public void setBiFunction(final BiFunction<E, Traverser<S>, E> reducingBiFunction) {
-        this.reducingBiFunction = reducingBiFunction;
-    }
-
-    @Override
-    public void onEngine(final TraversalEngine traversalEngine) {
-        this.byPass = traversalEngine.isComputer();
-    }
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.done = false;
-    }
-
-    @Override
-    public Traverser<E> processNextStart() {
-        if (this.byPass) {
-            return (Traverser<E>) this.starts.next();
-        } else {
-            if (this.done)
-                throw FastNoSuchElementException.instance();
-            E seed = this.seedSupplier.get();
-            while (this.starts.hasNext())
-                seed = this.reducingBiFunction.apply(seed, this.starts.next());
-            this.done = true;
-            return TraversalHelper.getRootTraversal(this.getTraversal()).getTraverserGenerator().generate(FinalGet.tryFinalGet(seed), (Step) this, 1l);
-        }
-    }
-
-    @Override
-    public ReducingBarrierStep<S, E> clone() {
-        final ReducingBarrierStep<S, E> clone = (ReducingBarrierStep<S, E>) super.clone();
-        clone.done = false;
-        return clone;
-    }
-
-    @Override
-    public MapReduce getMapReduce() {
-        return new DefaultMapReduce(this.seedSupplier, this.reducingBiFunction);
-    }
-
-    ///////
-
-    public static class DefaultMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Object> {
-
-        private static final String REDUCING_BARRIER_STEP_SEED_SUPPLIER = "gremlin.reducingBarrierStep.seedSupplier";
-        private static final String REDUCING_BARRIER_STEP_BI_FUNCTION = "gremlin.reducingBarrierStep.biFunction";
-
-        private BiFunction biFunction;
-        private Supplier seedSupplier;
-
-        private DefaultMapReduce() {
-        }
-
-        public DefaultMapReduce(final Supplier seedSupplier, final BiFunction biFunction) {
-            this.seedSupplier = seedSupplier;
-            this.biFunction = biFunction;
-
-        }
-
-        @Override
-        public void storeState(final Configuration configuration) {
-            super.storeState(configuration);
-            VertexProgramHelper.serialize(this.seedSupplier, configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
-            VertexProgramHelper.serialize(this.biFunction, configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
-
-        }
-
-        public void loadState(final Configuration configuration) {
-            this.seedSupplier = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_SEED_SUPPLIER);
-            this.biFunction = VertexProgramHelper.deserialize(configuration, REDUCING_BARRIER_STEP_BI_FUNCTION);
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return !stage.equals(Stage.COMBINE);
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return REDUCING;
-        }
-
-        @Override
-        public Object generateFinalResult(final Iterator keyValues) {
-            return ((KeyValue) keyValues.next()).getValue();
-
-        }
-
-        @Override
-        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 NullObject key, final Iterator<Object> values, final ReduceEmitter<NullObject, Object> emitter) {
-            Object mutatingSeed = this.seedSupplier.get();
-            while (values.hasNext()) {
-                mutatingSeed = this.biFunction.apply(mutatingSeed, values.next());
-            }
-            emitter.emit(FinalGet.tryFinalGet(mutatingSeed));
-        }
-    }
-
-    /////
-
-    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/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java
deleted file mode 100644
index 78d3830..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/util/SupplyingBarrierStep.java
+++ /dev/null
@@ -1,64 +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.util;
-
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-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.traversal.step.AbstractStep;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SupplyingBarrierStep<S, E> extends AbstractStep<S, E> {
-
-    private boolean done = false;
-
-    public SupplyingBarrierStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    public abstract E supply();
-
-    @Override
-    public void reset() {
-        super.reset();
-        this.done = false;
-    }
-
-    @Override
-    public Traverser<E> processNextStart() {
-        if (this.done)
-            throw FastNoSuchElementException.instance();
-        while (this.starts.hasNext())
-            this.starts.next();
-        this.done = true;
-        return this.getTraversal().asAdmin().getTraverserGenerator().generate(this.supply(), (Step) this, 1l);
-    }
-
-    @Override
-    public SupplyingBarrierStep<S, E> clone() {
-        final SupplyingBarrierStep<S, E> clone = (SupplyingBarrierStep<S, E>) super.clone();
-        clone.done = false;
-        return clone;
-    }
-
-
-}


[23/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java
new file mode 100644
index 0000000..0b5fe96
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/AbstractTraversalStrategy.java
@@ -0,0 +1,43 @@
+/*
+ * 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.strategy;
+
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractTraversalStrategy implements TraversalStrategy {
+
+    @Override
+    public String toString() {
+        return StringFactory.traversalStrategyString(this);
+    }
+
+    @Override
+    public int hashCode() {
+        return this.getClass().hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return this.getClass().equals(object.getClass());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
index 3df6c2f..81d78be 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ElementIdStrategy.java
@@ -18,13 +18,13 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
index 793092a..beec866 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategy.java
@@ -18,19 +18,19 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeOtherVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
index bcb2688..a9cc50f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ReadOnlyStrategy.java
@@ -18,9 +18,9 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
index 86d44c6..bcf9a3f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategy.java
@@ -18,19 +18,19 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-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.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeOtherVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java
new file mode 100644
index 0000000..530b495
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.java
@@ -0,0 +1,54 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ComparatorHolderRemovalStrategy extends AbstractTraversalStrategy {
+
+    private static final ComparatorHolderRemovalStrategy INSTANCE = new ComparatorHolderRemovalStrategy();
+
+    private ComparatorHolderRemovalStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getEngine().isStandard())
+            return;
+
+        if (TraversalHelper.hasStepOfAssignableClass(ComparatorHolder.class, traversal)) {
+            final Step endStep = traversal.getEndStep();
+            TraversalHelper.getStepsOfAssignableClass(ComparatorHolder.class, traversal)
+                    .stream()
+                    .filter(step -> step != endStep)
+                    .forEach(step -> traversal.removeStep((Step)step));
+        }
+    }
+
+    public static ComparatorHolderRemovalStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java
new file mode 100644
index 0000000..6869845
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ConjunctionStrategy.java
@@ -0,0 +1,83 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConjunctionStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ConjunctionStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+    private static final ConjunctionStrategy INSTANCE = new ConjunctionStrategy();
+
+    private ConjunctionStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        processConjunctionMarker(AndStep.AndMarker.class, traversal);
+        processConjunctionMarker(OrStep.OrMarker.class, traversal);
+    }
+
+    private static final boolean legalCurrentStep(final Step<?, ?> step) {
+        return !(step instanceof EmptyStep || step instanceof OrStep.OrMarker || step instanceof AndStep.AndMarker || step instanceof StartStep);
+    }
+
+    private static final void processConjunctionMarker(final Class<? extends ConjunctionStep.ConjunctionMarker> markerClass, final Traversal.Admin<?, ?> traversal) {
+        TraversalHelper.getStepsOfClass(markerClass, traversal).forEach(markerStep -> {
+            Step<?, ?> currentStep = markerStep.getNextStep();
+            final Traversal.Admin<?, ?> rightTraversal = __.start().asAdmin();
+            while (legalCurrentStep(currentStep)) {
+                final Step<?, ?> nextStep = currentStep.getNextStep();
+                rightTraversal.addStep(currentStep);
+                traversal.removeStep(currentStep);
+                currentStep = nextStep;
+            }
+
+            currentStep = markerStep.getPreviousStep();
+            final Traversal.Admin<?, ?> leftTraversal = __.start().asAdmin();
+            while (legalCurrentStep(currentStep)) {
+                final Step<?, ?> previousStep = currentStep.getPreviousStep();
+                leftTraversal.addStep(0, currentStep);
+                traversal.removeStep(currentStep);
+                currentStep = previousStep;
+            }
+            TraversalHelper.replaceStep(markerStep,
+                    markerClass.equals(AndStep.AndMarker.class) ?
+                            new AndStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal) :
+                            new OrStep<Object>(traversal, (Traversal.Admin) leftTraversal, (Traversal.Admin) rightTraversal),
+                    traversal);
+        });
+    }
+
+    public static ConjunctionStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java
new file mode 100644
index 0000000..1bb4a96
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java
@@ -0,0 +1,75 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class DedupOptimizerStrategy extends AbstractTraversalStrategy {
+
+    private static final DedupOptimizerStrategy INSTANCE = new DedupOptimizerStrategy();
+
+    private DedupOptimizerStrategy() {
+    }
+
+    private static final List<Class<? extends Step>> BIJECTIVE_PIPES = Arrays.asList(IdentityStep.class, OrderGlobalStep.class);
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (!TraversalHelper.hasStepOfClass(DedupGlobalStep.class, traversal))
+            return;
+
+        boolean done = false;
+        while (!done) {
+            done = true;
+            for (int i = 0; i < traversal.getSteps().size(); i++) {
+                final Step step1 = traversal.getSteps().get(i);
+                if (step1 instanceof DedupGlobalStep && !(((DedupGlobalStep) step1).getLocalChildren().get(0) instanceof IdentityTraversal)) {
+                    for (int j = i; j >= 0; j--) {
+                        final Step step2 = traversal.getSteps().get(j);
+                        if (BIJECTIVE_PIPES.stream().filter(c -> c.isAssignableFrom(step2.getClass())).findAny().isPresent()) {
+                            traversal.removeStep(step1);
+                            traversal.addStep(j, step1);
+                            done = false;
+                            break;
+                        }
+                    }
+                }
+                if (!done)
+                    break;
+            }
+        }
+    }
+
+    public static DedupOptimizerStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.java
new file mode 100644
index 0000000..3c4bf3d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EngineDependentStrategy.java
@@ -0,0 +1,46 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EngineDependentStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+    private static final EngineDependentStrategy INSTANCE = new EngineDependentStrategy();
+
+    private EngineDependentStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        traversal.getSteps().stream()
+                .filter(step -> step instanceof EngineDependent)
+                .forEach(step -> ((EngineDependent) step).onEngine(traversal.getEngine()));
+    }
+
+    public static EngineDependentStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
new file mode 100644
index 0000000..729e2b9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/IdentityRemovalStrategy.java
@@ -0,0 +1,49 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class IdentityRemovalStrategy extends AbstractTraversalStrategy {
+
+    private static final IdentityRemovalStrategy INSTANCE = new IdentityRemovalStrategy();
+
+    private IdentityRemovalStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (!TraversalHelper.hasStepOfClass(IdentityStep.class, traversal))
+            return;
+
+        TraversalHelper.getStepsOfClass(IdentityStep.class, traversal).stream()
+                .filter(step -> !step.getLabel().isPresent())
+                .forEach(traversal::removeStep);
+    }
+
+    public static IdentityRemovalStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java
new file mode 100644
index 0000000..333ef34
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LabeledEndStepStrategy.java
@@ -0,0 +1,50 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MarkerIdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LabeledEndStepStrategy extends AbstractTraversalStrategy {
+
+    private static final LabeledEndStepStrategy INSTANCE = new LabeledEndStepStrategy();
+
+    private LabeledEndStepStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getEndStep().getLabel().isPresent())
+            traversal.addStep(new MarkerIdentityStep<>(traversal));
+    }
+
+    public static LabeledEndStepStrategy instance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public String toString() {
+        return StringFactory.traversalStrategyString(this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java
new file mode 100644
index 0000000..15980d9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchWhereStrategy.java
@@ -0,0 +1,90 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.MatchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MatchWhereStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+    private static final MatchWhereStrategy INSTANCE = new MatchWhereStrategy();
+    private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
+
+    static {
+        PRIORS.add(IdentityRemovalStrategy.class);
+    }
+
+    private MatchWhereStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (!TraversalHelper.hasStepOfClass(MatchStep.class, traversal))
+            return;
+
+        final List<MatchStep> matchSteps = TraversalHelper.getStepsOfClass(MatchStep.class, traversal);
+        for (final MatchStep matchStep : matchSteps) {
+            boolean foundWhereWithNoTraversal = false;
+            Step currentStep = matchStep.getNextStep();
+            while (currentStep instanceof WhereStep || currentStep instanceof SelectStep || currentStep instanceof SelectOneStep || currentStep instanceof IdentityStep) {
+                if (currentStep instanceof WhereStep) {
+                    if (!((WhereStep) currentStep).getLocalChildren().isEmpty()) {
+                        matchStep.addTraversal(((WhereStep<?>) currentStep).getLocalChildren().get(0));
+                        traversal.removeStep(currentStep);
+                    } else {
+                        foundWhereWithNoTraversal = true;
+                    }
+                } else if (currentStep instanceof SelectStep) {
+                    if (!((SelectStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
+                        break;
+                } else if (currentStep instanceof SelectOneStep) {
+                    if (!((SelectOneStep) currentStep).getLocalChildren().isEmpty() || foundWhereWithNoTraversal)
+                        break;
+                }
+                // else is the identity step
+                currentStep = currentStep.getNextStep();
+            }
+        }
+    }
+
+    public static MatchWhereStrategy instance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public Set<Class<? extends TraversalStrategy>> applyPrior() {
+        return PRIORS;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java
new file mode 100644
index 0000000..153383f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java
@@ -0,0 +1,112 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileStrategy extends AbstractTraversalStrategy {
+
+
+    private static final ProfileStrategy INSTANCE = new ProfileStrategy();
+    private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
+
+    static {
+        // Ensure that this strategy is applied last.
+        PRIORS.add(ComparatorHolderRemovalStrategy.class);
+        PRIORS.add(ConjunctionStrategy.class);
+        PRIORS.add(DedupOptimizerStrategy.class);
+        PRIORS.add(EngineDependentStrategy.class);
+        PRIORS.add(IdentityRemovalStrategy.class);
+        PRIORS.add(LabeledEndStepStrategy.class);
+        PRIORS.add(MatchWhereStrategy.class);
+        PRIORS.add(RangeByIsCountStrategy.class);
+    }
+
+    private ProfileStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (!(traversal.getParent() instanceof EmptyStep)) {
+            // This strategy is applied to the top-level traversal only
+            return;
+        }
+
+        if (!TraversalHelper.hasStepOfClass(ProfileStep.class, traversal)) {
+            // No ProfileStep present
+            return;
+        }
+
+        prepTraversalForProfiling(traversal);
+    }
+
+    // Walk the traversal steps and inject the .profile()-steps.
+    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal) {
+        // Remove user-specified .profile() steps
+        final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
+        for (ProfileStep step : profileSteps) {
+            traversal.removeStep(step);
+        }
+
+        // Add .profile() step after every pre-existing step.
+        final List<Step> steps = traversal.getSteps();
+        final int numSteps = steps.size();
+        for (int ii = 0; ii < numSteps; ii++) {
+            // Get the original step
+            Step step = steps.get(ii * 2);
+
+            // Create and inject ProfileStep
+            ProfileStep profileStep = new ProfileStep(traversal);
+            traversal.addStep((ii * 2) + 1, profileStep);
+
+            // Handle nested traversal
+            if (step instanceof TraversalParent) {
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+                    prepTraversalForProfiling(t);
+                }
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+                    prepTraversalForProfiling(t);
+                }
+            }
+        }
+    }
+
+    @Override
+    public Set<Class<? extends TraversalStrategy>> applyPrior() {
+        return PRIORS;
+    }
+
+    public static ProfileStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
new file mode 100644
index 0000000..9ef6826
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/RangeByIsCountStrategy.java
@@ -0,0 +1,91 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+
+import java.util.*;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class RangeByIsCountStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+
+    private static final Map<BiPredicate, Long> RANGE_PREDICATES = new HashMap<BiPredicate, Long>() {{
+        put(Compare.inside, 0L);
+        put(Compare.outside, 1L);
+        put(Contains.within, 1L);
+        put(Contains.without, 0L);
+    }};
+    private static final Set<Compare> INCREASED_OFFSET_SCALAR_PREDICATES =
+            EnumSet.of(Compare.eq, Compare.neq, Compare.lte, Compare.gt);
+
+    private static final RangeByIsCountStrategy INSTANCE = new RangeByIsCountStrategy();
+
+    private RangeByIsCountStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        final int size = traversal.getSteps().size();
+        Step prev = null;
+        for (int i = 0; i < size; i++) {
+            final Step curr = traversal.getSteps().get(i);
+            if (curr instanceof CountGlobalStep && i < size - 1) {
+                final Step next = traversal.getSteps().get(i + 1);
+                if (next instanceof IsStep && !(prev instanceof RangeGlobalStep)) { // if a RangeStep was provided, assume that the user knows what he's doing
+                    final IsStep isStep = (IsStep) next;
+                    final Object value = isStep.getValue();
+                    final BiPredicate predicate = isStep.getPredicate();
+                    if (value instanceof Number) {
+                        final long highRangeOffset = INCREASED_OFFSET_SCALAR_PREDICATES.contains(predicate) ? 1L : 0L;
+                        final long highRange = ((Number) value).longValue() + highRangeOffset;
+                        TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
+                        i++;
+                    } else {
+                        final Long highRangeOffset = RANGE_PREDICATES.get(predicate);
+                        if (value instanceof Collection && highRangeOffset != null) {
+                            final Object high = Collections.max((Collection) value);
+                            if (high instanceof Number) {
+                                final long highRange = ((Number) high).longValue() + highRangeOffset;
+                                TraversalHelper.insertBeforeStep(new RangeGlobalStep<>(traversal, 0L, highRange), curr, traversal);
+                                i++;
+                            }
+                        }
+                    }
+                }
+            }
+            prev = curr;
+        }
+    }
+
+    public static RangeByIsCountStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java
new file mode 100644
index 0000000..1274a01
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TimeLimitedStrategy.java
@@ -0,0 +1,49 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+
+/**
+ * A {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy} that prevents a traversal from running beyond
+ * a pre-configured time.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class TimeLimitedStrategy extends AbstractTraversalStrategy {
+    private final long timeLimit;
+
+    public TimeLimitedStrategy(final long timeLimit) {
+        this.timeLimit = timeLimit;
+    }
+
+    public long getTimeLimit() {
+        return timeLimit;
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getEndStep().getClass().equals(TimeLimitStep.class))
+            return;
+
+        traversal.addStep(new TimeLimitStep<>(traversal, timeLimit));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java
new file mode 100644
index 0000000..a47355c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/TraversalVerificationStrategy.java
@@ -0,0 +1,72 @@
+/*
+ * 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.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalVerificationStrategy extends AbstractTraversalStrategy {
+
+    private static final TraversalVerificationStrategy INSTANCE = new TraversalVerificationStrategy();
+
+    private TraversalVerificationStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getEngine().isStandard())
+            return;
+
+        Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
+                ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
+                traversal.getEndStep();
+        if (endStep instanceof ComputerResultStep)        // TODO: this is not needed anymore (delete when you prove it)
+            endStep = endStep.getPreviousStep();
+
+        for (final Step<?, ?> step : traversal.getSteps()) {
+            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep))) {
+                throw new IllegalStateException("Global traversals on GraphComputer may not contain mid-traversal barriers: " + step);
+            }
+            if (step instanceof TraversalParent) {
+                final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()
+                        .filter(t -> !TraversalHelper.isLocalStarGraph(t.asAdmin()))
+                        .findAny();
+                if (traversalOptional.isPresent())
+                    throw new IllegalStateException("Local traversals on GraphComputer may not traverse past the local star-graph: " + traversalOptional.get());
+            }
+        }
+    }
+
+    public static TraversalVerificationStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
new file mode 100644
index 0000000..36e78f8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_Traverser.java
@@ -0,0 +1,86 @@
+/*
+ * 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.traverser;
+
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractPathTraverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.SparsePath;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Map;
+import java.util.Optional;
+import java.util.WeakHashMap;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
+
+    protected B_O_PA_S_SE_SL_Traverser() {
+    }
+
+    public B_O_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
+        super(t, step);
+        final Optional<String> stepLabel = step.getLabel();
+        this.path = stepLabel.isPresent() ?
+                getOrCreateFromCache(this.sideEffects).extend(t, stepLabel.get()) :
+                getOrCreateFromCache(this.sideEffects).extend(t);
+    }
+
+    @Override
+    public int hashCode() {
+        return this.t.hashCode() + this.future.hashCode() + this.loops;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object instanceof B_O_PA_S_SE_SL_Traverser
+                && ((B_O_PA_S_SE_SL_Traverser) object).get().equals(this.t)
+                && ((B_O_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
+                && ((B_O_PA_S_SE_SL_Traverser) object).loops() == this.loops()
+                && (null == this.sack);
+    }
+
+    @Override
+    public Traverser.Admin<T> attach(final Vertex vertex) {
+        super.attach(vertex);
+        final Path newSparsePath = getOrCreateFromCache(this.sideEffects);
+        this.path.forEach((object, labels) -> newSparsePath.extend(object, labels.toArray(new String[labels.size()])));
+        this.path = newSparsePath;
+        return this;
+    }
+
+    //////////////////////
+
+    private static final Map<TraversalSideEffects, SparsePath> PATH_CACHE = new WeakHashMap<>();
+
+    private static SparsePath getOrCreateFromCache(final TraversalSideEffects sideEffects) {
+        SparsePath path = PATH_CACHE.get(sideEffects);
+        if (null == path) {
+            path = SparsePath.make();
+            PATH_CACHE.put(sideEffects, path);
+        }
+        return path;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
new file mode 100644
index 0000000..dc25bad
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_PA_S_SE_SL_TraverserGenerator.java
@@ -0,0 +1,62 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+
+    private static final B_O_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_PA_S_SE_SL_TraverserGenerator();
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.OBJECT,
+            TraverserRequirement.BULK,
+            TraverserRequirement.SINGLE_LOOP,
+            TraverserRequirement.PATH_ACCESS,
+            TraverserRequirement.SACK,
+            TraverserRequirement.SIDE_EFFECTS);
+
+
+    private B_O_PA_S_SE_SL_TraverserGenerator() {
+    }
+
+    @Override
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+        final B_O_PA_S_SE_SL_Traverser<S> traverser = new B_O_PA_S_SE_SL_Traverser<>(start, startStep);
+        traverser.setBulk(initialBulk);
+        return traverser;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getProvidedRequirements() {
+        return REQUIREMENTS;
+    }
+
+    public static B_O_PA_S_SE_SL_TraverserGenerator instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java
new file mode 100644
index 0000000..71129f0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_Traverser.java
@@ -0,0 +1,58 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractPathTraverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ImmutablePath;
+
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_P_PA_S_SE_SL_Traverser<T> extends AbstractPathTraverser<T> {
+
+    protected B_O_P_PA_S_SE_SL_Traverser() {
+    }
+
+    public B_O_P_PA_S_SE_SL_Traverser(final T t, final Step<T, ?> step) {
+        super(t, step);
+        final Optional<String> stepLabel = step.getLabel();
+        this.path = stepLabel.isPresent() ?
+                ImmutablePath.make().extend(t, stepLabel.get()) :
+                ImmutablePath.make().extend(t);
+    }
+
+    @Override
+    public int hashCode() {
+        return super.hashCode() + this.path.hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return (object instanceof B_O_P_PA_S_SE_SL_Traverser)
+                && ((B_O_P_PA_S_SE_SL_Traverser) object).path().equals(this.path) // TODO: path equality
+                && ((B_O_P_PA_S_SE_SL_Traverser) object).get().equals(this.t)
+                && ((B_O_P_PA_S_SE_SL_Traverser) object).getStepId().equals(this.getStepId())
+                && ((B_O_P_PA_S_SE_SL_Traverser) object).loops() == this.loops()
+                && (null == this.sack);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
new file mode 100644
index 0000000..5eb62cd
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_P_PA_S_SE_SL_TraverserGenerator.java
@@ -0,0 +1,61 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_P_PA_S_SE_SL_TraverserGenerator implements TraverserGenerator {
+
+    private static final B_O_P_PA_S_SE_SL_TraverserGenerator INSTANCE = new B_O_P_PA_S_SE_SL_TraverserGenerator();
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.OBJECT,
+            TraverserRequirement.BULK,
+            TraverserRequirement.SINGLE_LOOP,
+            TraverserRequirement.PATH_ACCESS,
+            TraverserRequirement.PATH,
+            TraverserRequirement.SACK,
+            TraverserRequirement.SIDE_EFFECTS);
+
+    private B_O_P_PA_S_SE_SL_TraverserGenerator() {
+    }
+
+    @Override
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+        final B_O_P_PA_S_SE_SL_Traverser<S> traverser = new B_O_P_PA_S_SE_SL_Traverser<>(start, startStep);
+        traverser.setBulk(initialBulk);
+        return traverser;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getProvidedRequirements() {
+        return REQUIREMENTS;
+    }
+
+    public static B_O_P_PA_S_SE_SL_TraverserGenerator instance() {
+        return INSTANCE;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
new file mode 100644
index 0000000..4c64fb0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_Traverser.java
@@ -0,0 +1,70 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_Traverser<T> extends O_Traverser<T> {
+
+    protected long bulk = 1l;
+    protected String future = HALT;
+
+    protected B_O_Traverser() {
+    }
+
+    public B_O_Traverser(final T t, final long initialBulk) {
+        super(t);
+        this.bulk = initialBulk;
+    }
+
+    @Override
+    public void setBulk(final long count) {
+        this.bulk = count;
+    }
+
+    @Override
+    public long bulk() {
+        return this.bulk;
+    }
+
+    @Override
+    public void merge(final Traverser.Admin<?> other) {
+        this.bulk = this.bulk + other.bulk();
+    }
+
+    @Override
+    public String getStepId() {
+        return this.future;
+    }
+
+    @Override
+    public void setStepId(final String stepId) {
+        this.future = stepId;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object instanceof B_O_Traverser &&
+                ((B_O_Traverser) object).t.equals(this.t) &&
+                ((B_O_Traverser) object).future.equals(this.future);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
new file mode 100644
index 0000000..58a7546
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/B_O_TraverserGenerator.java
@@ -0,0 +1,55 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class B_O_TraverserGenerator implements TraverserGenerator {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.OBJECT,
+            TraverserRequirement.BULK);
+
+    private static final B_O_TraverserGenerator INSTANCE = new B_O_TraverserGenerator();
+
+    private B_O_TraverserGenerator() {
+    }
+
+    @Override
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+        return new B_O_Traverser<>(start, initialBulk);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getProvidedRequirements() {
+        return REQUIREMENTS;
+    }
+
+    public static B_O_TraverserGenerator instance() {
+        return INSTANCE;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
new file mode 100644
index 0000000..4fc3f5d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_Traverser.java
@@ -0,0 +1,35 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.AbstractTraverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class O_Traverser<T> extends AbstractTraverser<T> {
+
+    protected O_Traverser() {
+    }
+
+    public O_Traverser(final T t) {
+        super(t);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
new file mode 100644
index 0000000..373fa8a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/O_TraverserGenerator.java
@@ -0,0 +1,52 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class O_TraverserGenerator implements TraverserGenerator {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = Collections.singleton(TraverserRequirement.OBJECT);
+    private static final O_TraverserGenerator INSTANCE = new O_TraverserGenerator();
+
+    private O_TraverserGenerator() {
+    }
+
+    @Override
+    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk) {
+        return new O_Traverser<>(start);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getProvidedRequirements() {
+        return REQUIREMENTS;
+    }
+
+    public static O_TraverserGenerator instance() {
+        return INSTANCE;
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java
new file mode 100644
index 0000000..4ca721a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserGeneratorFactory.java
@@ -0,0 +1,33 @@
+/*
+ * 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.traverser;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+
+import java.io.Serializable;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraverserGeneratorFactory extends Serializable {
+
+    public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?, ?> traversal);
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
new file mode 100644
index 0000000..00b7d9b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/TraverserRequirement.java
@@ -0,0 +1,39 @@
+/*
+ * 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.traverser;
+
+/**
+ * A {@link TraverserRequirement} is a list of requirements that a {@link org.apache.tinkerpop.gremlin.process.traversal.Traversal} requires of a {@link org.apache.tinkerpop.gremlin.process.traversal.Traverser}.
+ * The less requirements, the simpler the traverser can be (both in terms of space and time constraints).
+ * Every {@link org.apache.tinkerpop.gremlin.process.traversal.Step} provides its specific requirements via {@link org.apache.tinkerpop.gremlin.process.traversal.Step#getRequirements()}.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public enum TraverserRequirement {
+
+    OBJECT,
+    BULK,
+    SINGLE_LOOP,
+    NESTED_LOOP,
+    PATH,
+    PATH_ACCESS,
+    SACK,
+    SIDE_EFFECTS,
+    // NESTED_TRAVERSALS
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
new file mode 100644
index 0000000..ff77e77
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractPathTraverser.java
@@ -0,0 +1,213 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+
+import java.util.Optional;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractPathTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
+
+    protected T t;
+    protected Object sack = null;
+    protected String future = HALT;
+    protected short loops = 0;  // an optimization hack to use a short internally to save bits :)
+    protected transient TraversalSideEffects sideEffects;
+    protected long bulk = 1l;
+    protected Path path;
+
+    protected AbstractPathTraverser() {
+
+    }
+
+    public AbstractPathTraverser(final T t, final Step<T, ?> step) {
+        this.t = t;
+        this.sideEffects = step.getTraversal().getSideEffects();
+        this.sideEffects.getSackInitialValue().ifPresent(supplier -> this.sack = supplier.get());
+    }
+
+    /////////////////
+
+    @Override
+    public T get() {
+        return this.t;
+    }
+
+    @Override
+    public void set(final T t) {
+        this.t = t;
+    }
+
+    /////////////////
+
+    @Override
+    public Path path() {
+        return this.path;
+    }
+
+    /////////////////
+
+    @Override
+    public <S> S sack() {
+        return (S) this.sack;
+    }
+
+    @Override
+    public <S> void sack(final S object) {
+        this.sack = object;
+    }
+
+    /////////////////
+
+    @Override
+    public void setBulk(final long count) {
+        this.bulk = count;
+    }
+
+    @Override
+    public long bulk() {
+        return this.bulk;
+    }
+
+    /////////////////
+
+    @Override
+    public int loops() {
+        return this.loops;
+    }
+
+    @Override
+    public void incrLoops(final String stepLabel) {
+        this.loops++;
+    }
+
+    @Override
+    public void resetLoops() {
+        this.loops = 0;
+    }
+
+    /////////////////
+
+    @Override
+    public String getStepId() {
+        return this.future;
+    }
+
+    @Override
+    public void setStepId(final String stepId) {
+        this.future = stepId;
+    }
+
+    /////////////////
+
+    @Override
+    public TraversalSideEffects getSideEffects() {
+        return this.sideEffects;
+    }
+
+
+    @Override
+    public void setSideEffects(final TraversalSideEffects sideEffects) {
+        this.sideEffects = sideEffects;
+    }
+
+    /////////////////
+
+    @Override
+    public Traverser.Admin<T> detach() {
+        this.t = DetachedFactory.detach(this.t, false);
+        this.path = DetachedFactory.detach(this.path, true);
+        return this;
+    }
+
+    @Override
+    public Traverser.Admin<T> attach(final Vertex vertex) {
+        if (this.t instanceof DetachedElement)
+            this.t = (T) ((DetachedElement) this.t).attach(vertex);
+        else if (this.t instanceof DetachedProperty)
+            this.t = (T) ((DetachedProperty) this.t).attach(vertex);
+        // you do not want to attach a path because it will reference graph objects not at the current vertex
+        return this;
+    }
+
+    /////////////////
+
+    @Override
+    public void merge(final Traverser.Admin<?> other) {
+        this.bulk = this.bulk + other.bulk();
+    }
+
+    @Override
+    public <R> Traverser.Admin<R> split(final R r, final Step<T, R> step) {
+        try {
+            final AbstractPathTraverser<R> clone = (AbstractPathTraverser<R>) super.clone();
+            clone.t = r;
+            final Optional<String> stepLabel = step.getLabel();
+            clone.path = stepLabel.isPresent() ? clone.path.clone().extend(r, stepLabel.get()) : clone.path.clone().extend(r);
+            clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public Traverser.Admin<T> split() {
+        try {
+            final AbstractPathTraverser<T> clone = (AbstractPathTraverser<T>) super.clone();
+            clone.sack = null == clone.sack ? null : clone.sideEffects.getSackSplitOperator().orElse(UnaryOperator.identity()).apply(clone.sack);
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    /////////////////
+
+    @Override
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public AbstractPathTraverser<T> clone() {
+        try {
+            return (AbstractPathTraverser<T>) super.clone();
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public int hashCode() {
+        return this.t.hashCode() + this.future.hashCode() + this.loops;
+    }
+
+    @Override
+    public String toString() {
+        return this.t.toString();
+    }
+}


[18/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy
deleted file mode 100644
index 60e46ae..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRangeTest.groovy
+++ /dev/null
@@ -1,198 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.Scope
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyRangeTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends RangeTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
-            g.V(v1Id).out.limit(2)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
-            g.V.local(__.outE.limit(3)).inV.limit(3)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
-            g.V(v1Id).out('knows').outE('created')[0].inV()
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
-            g.V(v1Id).out('knows').out('created')[0]
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
-            g.V(v1Id).out('created').in('created')[1..3]
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
-            g.V(v1Id).out('created').inE('created')[1..3].outV
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
-            g.V().repeat(__.both).times(3)[5..11];
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
-            g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().limit(Scope.local, 1)).as('w').select().by('name').by()
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
-            g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().range(Scope.local, 1, 3)).as('w').select().by('name').by()
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends RangeTest {
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_out_limitX2X() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
-
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
-            // TODO: the traversal should work in computer mode, but throws a ClassCastException
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(Object v1Id) {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy
deleted file mode 100644
index 82778c9..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyRetainTest.groovy
+++ /dev/null
@@ -1,68 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyRetainTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends RetainTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
-            g.V(v1Id).out.retain(g.V(v2Id).next())
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
-            g.V(v1Id).out.aggregate('x').out.retain('x')
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
-            g.V(v1Id).as('a').out('created').in('created').retain('a').name
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends RetainTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.retain(g.V($v2Id).next())", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.retain('x')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').retain('a').name", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index dbbc4ae..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySampleTest.groovy
+++ /dev/null
@@ -1,115 +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.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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.sample
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySampleTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SampleTest {
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_sampleX1X() {
-            g.E.sample(1)
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
-            g.E.sample(2).by('weight')
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
-            g.V.local(__.outE.sample(1).by('weight'))
-        }
-
-        @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))
-        }
-
-        @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))
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends SampleTest {
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_E_sampleX1X() {
-            // TODO: makes no sense when its global
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_E_sampleX2X_byXweightX() {
-            // TODO: makes no sense when its global
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
-            ComputerTestHelper.compute("g.V.local(__.outE.sample(1).by('weight'))", g)
-        }
-
-        @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))", 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))", g)
-        }
-
-        @Override
-        Traversal<Edge, Edge> get_g_E_sampleX1X() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy
deleted file mode 100644
index 7924b71..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovySimplePathTest.groovy
+++ /dev/null
@@ -1,62 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.Path
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovySimplePathTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends SimplePathTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
-            g.V(v1Id).out('created').in('created').simplePath
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
-            return g.V.repeat(__.both.simplePath).times(3).path()
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends SimplePathTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').simplePath", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
-            ComputerTestHelper.compute("g.V.repeat(__.both.simplePath).times(3).path()", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy
deleted file mode 100644
index 6107ad0..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyWhereTest.groovy
+++ /dev/null
@@ -1,98 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereTest
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyWhereTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends WhereTest {
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
-            g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b');
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
-            g.V.has('age').as('a').out.in.has('age').as('b').select().where('a',Compare.neq, 'b');
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
-            g.V.has('age').as('a').out.in.has('age').as('b').select().where(__.as('b').has('name', 'marko'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
-            g.V().has('age').as('a').out.in.has('age').as('b').select().where(__.as('a').out('knows').as('b'));
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends WhereTest {
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
-            ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
-            ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.neq, 'b')", g);
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy
deleted file mode 100644
index 0207cfb..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddEdgeTest.groovy
+++ /dev/null
@@ -1,51 +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.map
-
-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.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAddEdgeTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends AddEdgeTest {
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
-            g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a')
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(
-                final Object v1Id) {
-            g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a', 'weight', 2)
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
-            g.V.addOutE('existsWith', g.V, 'time', 'now');
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
deleted file mode 100644
index 0f6f398..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyAddVertexTest.groovy
+++ /dev/null
@@ -1,46 +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.map
-
-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.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAddVertexTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends AddVertexTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
-            g.V.addV(T.label, 'animal', 'age', 0);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
-            g.addV(T.label, 'person', 'name', 'stephen');
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy
deleted file mode 100644
index dc97f79..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyBackTest.groovy
+++ /dev/null
@@ -1,147 +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.map
-
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackTest
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyBackTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends BackTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
-            g.V(v1Id).as('here').out.back('here')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
-            g.V(v4Id).out.as('here').has('lang', 'java').back('here')
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
-                final Object v4Id) {
-            g.V(v4Id).out.as('here').has('lang', 'java').back('here').name
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
-            g.V(v1Id).outE.as('here').inV.has('name', 'vadas').back('here')
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
-                final Object v1Id) {
-            g.V(v1Id).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
-                final Object v1Id) {
-            g.V(v1Id).outE('knows').as('here').has('weight', 1.0d).inV.has('name', 'josh').back('here')
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
-                final Object v1Id) {
-            g.V(v1Id).outE("knows").as('here').has('weight', 1.0d).as('fake').inV.has("name", 'josh').back('here')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
-            g.V().as("here").out.name.back("here");
-        }
-
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
-            g.V.out('created')
-                    .union(__.as('project').in('created').has('name', 'marko').back('project'),
-                    __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends BackTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).as('here').out.back('here')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
-                final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here').name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE.as('here').inV.has('name', 'vadas').back('here')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
-                final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
-                final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).inV.has('name','josh').back('here')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
-                final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).as('fake').inV.has('name','josh').back('here')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
-            ComputerTestHelper.compute("g.V().as('here').out.name.back('here')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
-            ComputerTestHelper.compute("""
-            g.V.out('created')
-                    .union(__.as('project').in('created').has('name', 'marko').back('project'),
-                    __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
-            """, g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy
deleted file mode 100644
index bbebe23..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCoalesceTest.groovy
+++ /dev/null
@@ -1,104 +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.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Path
-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.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE
-
-/**
- *
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyCoalesceTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends CoalesceTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
-            g.V().coalesce(out('foo'), out('bar'));
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
-            g.V(v1Id).coalesce(out('knows'), out('created')).values('name');
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
-            g.V(v1Id).coalesce(out('created'), out('knows')).values('name');
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
-            g.V.coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name');
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
-            g.V.coalesce(outE('knows'), outE('created')).otherV.path.by('name').by(T.label);
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends CoalesceTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
-            ComputerTestHelper.compute("g.V().coalesce(out('foo'), out('bar'))", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('knows'), out('created')).values('name')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('created'), out('knows')).values('name')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
-            ComputerTestHelper.compute("g.V().coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name')", g)
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
-        }
-
-        @Override
-        Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy
deleted file mode 100644
index dfcb05d..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyCountTest.groovy
+++ /dev/null
@@ -1,119 +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.map
-
-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.Traversal
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyCountTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends CountTest {
-        @Override
-        public Traversal<Vertex, Long> get_g_V_count() {
-            g.V.count()
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_out_count() {
-            g.V.out.count
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_both_both_count() {
-            g.V.both.both.count()
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
-            g.V().repeat(__.out).times(3).count()
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
-            g.V.repeat(__.out).times(8).count()
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
-            g.V.has('no').count
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
-            return g.V.fold.count(Scope.local);
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends CountTest {
-        @Override
-        public Traversal<Vertex, Long> get_g_V_count() {
-            ComputerTestHelper.compute("g.V.count()", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_out_count() {
-            ComputerTestHelper.compute("g.V.out.count", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_both_both_count() {
-            ComputerTestHelper.compute("g.V.both.both.count()", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
-            ComputerTestHelper.compute("g.V().repeat(__.out).times(3).count()", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
-            ComputerTestHelper.compute("g.V.repeat(__.out).times(8).count()", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
-            ComputerTestHelper.compute("g.V.has('no').count", g)
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_fold_countXlocalX() {
-        }
-
-        @Override
-        Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy
deleted file mode 100644
index 4a0baab..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyFoldTest.groovy
+++ /dev/null
@@ -1,79 +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.map
-
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.step.map.FoldTest
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyFoldTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends FoldTest {
-        @Override
-        public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
-            g.V.fold
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
-            g.V.fold.unfold
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
-            g.V.age.fold(0) { seed, age -> seed + age };
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends FoldTest {
-        @Override
-        public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
-            ComputerTestHelper.compute("g.V.fold", g)
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_fold_unfold() {
-            // Does not work in OLAP cause fold() is not an endstep.
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
-            ComputerTestHelper.compute("g.V.age.fold(0) { seed, age -> seed + age }", g);
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy
deleted file mode 100644
index aaf44fe..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMapTest.groovy
+++ /dev/null
@@ -1,129 +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.map
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class GroovyMapTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends MapTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
-            g.V(v1Id).map { v -> v.name };
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
-            g.V(v1Id).outE.label.map { l -> l.length() };
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
-            g.V(v1Id).out.map { v -> v.name }.map { n -> n.length() };
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
-            g.V.as('a').out.map { v -> v.path('a').name };
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
-            g.V().as('a').out.out().map { v -> v.path('a').name + v.name };
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends MapTest {
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_VX1X_mapXnameX() {
-            super.g_VX1X_mapXnameX();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_VX1X_outE_label_mapXlengthX() {
-            super.g_VX1X_outE_label_mapXlengthX();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_VX1X_out_mapXnameX_mapXlengthX() {
-            super.g_VX1X_out_mapXnameX_mapXlengthX();
-        }
-
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).map { v -> v.name }", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE.label.map { l -> l.length() }", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.map { v -> v.name }.map { n -> n.length() }", g);
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_asXaX_out_mapXa_nameX() {
-            // TODO: Doesn't work for graph computer because sideEffects are not accessible
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
-            // TODO: Doesn't work for graph computer because sideEffects are not accessible
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy
deleted file mode 100644
index ac7cb72..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMatchTest.groovy
+++ /dev/null
@@ -1,187 +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.map
-
-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.graph.traversal.step.map.MatchTest
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMatchTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends MatchTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
-            g.V().match('a', __.as('a').out().as('b'));
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
-            g.V().match('a', __.as('a').out().as('b')).select('b').by(T.id)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
-            g.V().match('a',
-                    __.as('a').out('knows').as('b'),
-                    __.as('b').out('created').as('c'))
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
-            return g.V().match('a',
-                    __.as('a').out('knows').as('b'),
-                    __.as('a').out('created').as('c'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
-            return g.V().match('d',
-                    __.as('d').in('knows').as('a'),
-                    __.as('d').has('name', 'vadas'),
-                    __.as('a').out('knows').as('b'),
-                    __.as('b').out('created').as('c'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
-            g.V().match('a',
-                    __.as('a').out('created').as('b'),
-                    __.as('a').repeat(__.out).times(2).as('b')).select('a', 'b').by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
-            g.V().match('a',
-                    __.as('a').out('created').has('name', 'lop').as('b'),
-                    __.as('b').in('created').has('age', 29).as('c'),
-                    __.as('c').repeat(__.out).times(2)).select.by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
-            g.V().out().out().match('a',
-                    __.as('a').in('created').as('b'),
-                    __.as('b').in('knows').as('c')).select('c').out('created').name
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
-            g.V().match('a',
-                    __.as('a').out('created').as('b'),
-                    __.as('b').in('created').as('a'))
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
-            return g.V().match('a', __.as('a').out('knows').as('b'),
-                    __.as('c').out('knows').as('b'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
-            g.V().match('a',
-                    __.as('a').out('knows').as('b'),
-                    __.as('b').out('created').has('name', 'lop'),
-                    __.as('b').match('a1',
-                            __.as('a1').out('created').as('b1'),
-                            __.as('b1').in('created').as('c1')).select('c1').as('c')).select.by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
-            g.V().match('a',
-                    __.as('a').has('name', 'Garcia'),
-                    __.as('a').in('writtenBy').as('b'),
-                    __.as('a').in('sungBy').as('b'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
-            g.V().match('a',
-                    __.as('a').in('sungBy').as('b'),
-                    __.as('a').in('sungBy').as('c'),
-                    __.as('b').out('writtenBy').as('d'),
-                    __.as('c').out('writtenBy').as('e'),
-                    __.as('d').has('name', 'George_Harrison'),
-                    __.as('e').has('name', 'Bob_Marley'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
-            g.V().match('a',
-                    __.as('a').in('sungBy').as('b'),
-                    __.as('a').in('writtenBy').as('c'),
-                    __.as('b').out('writtenBy').as('d'),
-                    __.as('c').out('sungBy').as('d'),
-                    __.as('d').has('name', 'Garcia'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
-            return g.V().match('a',
-                    __.as('a').in('sungBy').as('b'),
-                    __.as('a').in('writtenBy').as('c'),
-                    __.as('b').out('writtenBy').as('d'))
-                    .where(__.as('c').out('sungBy').as('d'))
-                    .where(__.as('d').has('name', 'Garcia'));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
-            g.V().match("a",
-                    __.as("a").out("created").has("name", "lop").as("b"),
-                    __.as("b").in("created").has("age", 29).as("c"))
-                    .where(__.as("c").repeat(__.out()).times(2))
-                    .select.by('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
-            g.V().match('a',
-                    __.as('a').out('created').as('b'),
-                    __.as('b').in('created').as('c'))
-                    .where('a', Compare.neq, 'c')
-                    .select('a', 'c').by('name')
-        }
-
-        /*@Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
-            g.V.match('a',
-                    __.as('a').out('created').as('b'),
-                    __.as('c').out('created').as('b')).select { it.value('name') }
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
-            g.V.out.out.match('a',
-                    __.as('b').out('created').as('a'),
-                    __.as('c').out('knows').as('b')).select('c').out('knows').name
-        }*/
-    }
-
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index b66c2f6..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMaxTest.groovy
+++ /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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.max
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMaxTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends MaxTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_max() {
-            g.V.age.max
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
-            g.V.repeat(__.both).times(5).age.max
-        }
-
-        @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))
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends MaxTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_max() {
-            ComputerTestHelper.compute("g.V.age.max", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
-            ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.max", g)
-        }
-
-        @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))", g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index d291d1a..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMeanTest.groovy
+++ /dev/null
@@ -1,63 +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.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-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.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.mean
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMeanTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends MeanTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_age_mean() {
-            g.V.age.mean
-        }
-
-        @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))
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends MeanTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_age_mean() {
-            ComputerTestHelper.compute("g.V.age.mean", g)
-        }
-
-        @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))", g)
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 4f6f871..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyMinTest.groovy
+++ /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.graph.traversal.step.map
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Scope
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.min
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyMinTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends MinTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_min() {
-            g.V.age.min
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
-            g.V.repeat(__.both).times(5).age.min
-        }
-
-        @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))
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends MinTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_min() {
-            ComputerTestHelper.compute("g.V.age.min", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
-            ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.min", g)
-        }
-
-        @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))", g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
deleted file mode 100644
index 2a9f7cb..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/GroovyOrderTest.groovy
+++ /dev/null
@@ -1,184 +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.map
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.*
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Order
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyOrderTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends OrderTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_name_order() {
-            g.V().name.order()
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
-            g.V.name.order.by { a, b -> a[1] <=> b[1] }.by { a, b -> b[2] <=> a[2] }
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
-            g.V.order.by('name', Order.incr).name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
-            g.V.order.by('name', Order.incr).name
-        }
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
-            g.V.outE.order.by('weight', Order.decr).weight
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
-            return g.V.order.by('name', { a, b -> a[1].compareTo(b[1]) }).by('name', { a, b -> b[2].compareTo(a[2]) }).name;
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
-            g.V.as('a').out('created').as('b').order.by(Order.shuffle).select();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
-                final Object v1Id) {
-            g.V(v1Id).map {
-                final Map map = [:];
-                map[1] = it.age;
-                map[2] = it.age * 2;
-                map[3] = it.age * 3;
-                map[4] = it.age;
-                return map;
-            }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
-            g.V.order.by(__.outE.count, Order.decr)
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends OrderTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_name_order() {
-            ComputerTestHelper.compute("g.V().name.order()", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
-            ComputerTestHelper.compute("g.V.name.order.by { a, b -> a[1] <=> b[1] }.by{ a, b -> b[2] <=> a[2] }", g)
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_order_byXname_incrX_name() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_outE_order_byXweight_decrX_weight() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
-            ComputerTestHelper.compute("g.V.as('a').out('created').as('b').order.by(Order.shuffle).select()", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
-                final Object v1Id) {
-            ComputerTestHelper.compute("""
-            g.V(${v1Id}).map {
-                final Map map = [:];
-                map[1] = it.age;
-                map[2] = it.age * 2;
-                map[3] = it.age * 3;
-                map[4] = it.age;
-                return map;
-            }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
-            """, g)
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_order_byXoutE_count__decrX() {
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
-            super.g_V_name_order_byXa1_b1X_byXb2_a2X();
-        }
-    }
-}


[10/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java
deleted file mode 100644
index 58af180..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MatchTest.java
+++ /dev/null
@@ -1,931 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.Traverser;
-import org.apache.tinkerpop.gremlin.process.UseEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.Bindings;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.CrossJoinEnumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.Enumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.InnerJoinEnumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.IteratorEnumerator;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.MatchStep;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Function;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.as;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MatchTest extends AbstractGremlinProcessTest {
-
-    // very basic query
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX();
-
-    // query with selection
-    public abstract Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX();
-
-    // linked traversals
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX();
-
-    // a basic tree with two leaves
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX();
-
-    // a tree with three leaves
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
-
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
-
-    // illustrates early deduplication in "predicate" traversals
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX();
-
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX();
-
-    public abstract Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
-
-    // contains a cycle
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX();
-
-    // contains an unreachable label
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX();
-
-    // nested match()
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
-
-    // contains a pair of traversals which connect the same labels, together with a predicate traversal
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
-
-    // contains an identical pair of sets of traversals, up to variable names and has() conditions
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
-
-    // forms a non-trivial DAG
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX();
-
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX();
-
-    // inclusion of where
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
-
-    //TODO: with Traversal.reverse()
-    //public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
-
-    //TODO: with Traversal.reverse()
-    // public abstract Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_out_bX() throws Exception {
-        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_out_bX();
-        printTraversalForm(traversal);
-        assertResults(vertexToStr, traversal,
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "lop")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "ripple")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "josh")).put("b", convertToVertex(graph, "lop")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "peter")).put("b", convertToVertex(graph, "lop")));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_out_bX_selectXb_idX() throws Exception {
-        final Traversal<Vertex, Object> traversal = get_g_V_matchXa_out_bX_selectXb_idX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        final Object vadasId = convertToVertexId("vadas");
-        final Object joshId = convertToVertexId("josh");
-        final Object lopId = convertToVertexId("lop");
-        final Object rippleId = convertToVertexId("ripple");
-        Map<Object, Long> idCounts = new HashMap<>();
-        while (traversal.hasNext()) {
-            counter++;
-            MapHelper.incr(idCounts, traversal.next(), 1l);
-        }
-        assertFalse(traversal.hasNext());
-        assertEquals(idCounts.get(vadasId), Long.valueOf(1l));
-        assertEquals(idCounts.get(lopId), Long.valueOf(3l));
-        assertEquals(idCounts.get(joshId), Long.valueOf(1l));
-        assertEquals(idCounts.get(rippleId), Long.valueOf(1l));
-        assertEquals(6, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_knows_b__b_created_cX() throws Exception {
-        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__b_created_cX();
-        printTraversalForm(traversal);
-        assertResults(vertexToStr, traversal,
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_knows_b__a_created_cX() throws Exception {
-        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__a_created_cX();
-        printTraversalForm(traversal);
-        assertResults(vertexToStr, traversal,
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "vadas")).put("c", convertToVertex(graph, "lop")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() throws Exception {
-        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX();
-        printTraversalForm(traversal);
-        assertResults(vertexToStr, traversal,
-                new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
-                new Bindings<Vertex>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() throws Exception {
-        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        assertResults(Function.identity(), traversal, new Bindings<String>().put("a", "marko").put("b", "lop"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() throws Exception {
-        final List<Traversal<Vertex, Map<String, String>>> traversals = Arrays.asList(
-                get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX(),
-                get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            assertResults(Function.identity(), traversal,
-                    new Bindings<String>().put("a", "marko").put("b", "lop").put("c", "marko"),
-                    new Bindings<String>().put("a", "josh").put("b", "lop").put("c", "marko"),
-                    new Bindings<String>().put("a", "peter").put("b", "lop").put("c", "marko"));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() throws Exception {
-        final Traversal<Vertex, String> traversal = get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name();
-        printTraversalForm(traversal);
-        assertEquals("lop", traversal.next());
-        assertEquals("lop", traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__b_0created_aX() {
-        get_g_V_matchXa_created_b__b_0created_aX();
-    }
-
-    @Test(expected = IllegalArgumentException.class)
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_knows_b__c_knows_bX() {
-        get_g_V_matchXa_knows_b__c_knows_bX();
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() throws Exception {
-        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX();
-        printTraversalForm(traversal);
-        assertResults(Function.identity(), traversal,
-                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"),
-                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "josh"), // expected duplicate: two paths to this solution
-                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "marko"),
-                new Bindings<String>().put("a", "marko").put("b", "josh").put("c", "peter"));
-    }
-
-    /* TODO: this test requires Traversal.reverse()
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__c_created_bX_selectXnameX() throws Exception {
-        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__c_created_bX_selectXnameX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Long> countMap = new HashMap<>();
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final Map<String, String> bindings = traversal.next();
-            // TODO: c is not being bound
-            // assertEquals(3, bindings.size());
-            assertEquals("lop", bindings.get("b"));
-            MapHelper.incr(countMap, bindings.get("a") + ":" + bindings.get("c"), 1l);
-        }
-        // TODO: without 'c' binding, cant check results
-        // assertEquals(Long.valueOf(1), countMap.get("marko:marko"));
-        //assertEquals(Long.valueOf(1), countMap.get("marko:josh"));
-        //assertEquals(Long.valueOf(1), countMap.get("marko:peter"));
-        //assertEquals(Long.valueOf(1), countMap.get("josh:marko"));
-        //assertEquals(Long.valueOf(1), countMap.get("josh:josh"));
-        //assertEquals(Long.valueOf(1), countMap.get("josh:peter"));
-        //assertEquals(Long.valueOf(1), countMap.get("peter:marko"));
-        //assertEquals(Long.valueOf(1), countMap.get("peter:josh"));
-        //assertEquals(Long.valueOf(1), countMap.get("peter:peter"));
-        //assertEquals(countMap.size(), 9);
-        //assertEquals(9, counter);
-        assertFalse(traversal.hasNext());
-    }
-    */
-
-    /* TODO: this test requires Traversal.reverse()
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() throws Exception {
-        // TODO: Doesn't work, only bindings to 'a' in binding set.
-        final Traversal<Vertex, String> traversal = get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final List<String> results = traversal.toList();
-        assertEquals(2, results.size());
-        assertTrue(results.contains("josh"));
-        assertTrue(results.contains("vadas"));
-    }
-    */
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() throws Exception {
-        Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX();
-        printTraversalForm(traversal);
-        assertResults(vertexToStr, traversal,
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CREAM PUFF WAR")),
-                new Bindings<Vertex>().put("a", convertToVertex(graph, "Garcia")).put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT")));
-    }
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() throws Exception {
-        Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX();
-        printTraversalForm(traversal);
-        assertResults(vertexToStr, traversal,
-                new Bindings<Vertex>()
-                        .put("a", convertToVertex(graph, "Garcia"))
-                        .put("b", convertToVertex(graph, "I WANT TO TELL YOU"))
-                        .put("c", convertToVertex(graph, "STIR IT UP"))
-                        .put("d", convertToVertex(graph, "George_Harrison"))
-                        .put("e", convertToVertex(graph, "Bob_Marley")));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() throws Exception {
-        Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX();
-        assertResults(Function.identity(), traversal,
-                new Bindings<String>().put("a", "marko").put("c", "josh"),
-                new Bindings<String>().put("a", "marko").put("c", "peter"),
-                new Bindings<String>().put("a", "josh").put("c", "marko"),
-                new Bindings<String>().put("a", "josh").put("c", "peter"),
-                new Bindings<String>().put("a", "peter").put("c", "marko"),
-                new Bindings<String>().put("a", "peter").put("c", "josh"));
-    }
-
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() throws Exception {
-        final List<Traversal<Vertex, Map<String, Vertex>>> traversals = Arrays.asList(
-                get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX(),
-                get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX());
-
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            assertResults(vertexToStr, traversal,
-                    new Bindings<Vertex>()
-                            .put("a", convertToVertex(graph, "Garcia"))
-                            .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
-                            .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
-                            .put("d", convertToVertex(graph, "Garcia")),
-                    new Bindings<Vertex>()
-                            .put("a", convertToVertex(graph, "Garcia"))
-                            .put("b", convertToVertex(graph, "CREAM PUFF WAR"))
-                            .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
-                            .put("d", convertToVertex(graph, "Garcia")),
-                    new Bindings<Vertex>()
-                            .put("a", convertToVertex(graph, "Garcia"))
-                            .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
-                            .put("c", convertToVertex(graph, "CREAM PUFF WAR"))
-                            .put("d", convertToVertex(graph, "Garcia")),
-                    new Bindings<Vertex>()
-                            .put("a", convertToVertex(graph, "Garcia"))
-                            .put("b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
-                            .put("c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"))
-                            .put("d", convertToVertex(graph, "Garcia")),
-                    new Bindings<Vertex>()
-                            .put("a", convertToVertex(graph, "Grateful_Dead"))
-                            .put("b", convertToVertex(graph, "CANT COME DOWN"))
-                            .put("c", convertToVertex(graph, "DOWN SO LONG"))
-                            .put("d", convertToVertex(graph, "Garcia")),
-                    new Bindings<Vertex>()
-                            .put("a", convertToVertex(graph, "Grateful_Dead"))
-                            .put("b", convertToVertex(graph, "THE ONLY TIME IS NOW"))
-                            .put("c", convertToVertex(graph, "DOWN SO LONG"))
-                            .put("d", convertToVertex(graph, "Garcia")));
-        });
-    }
-
-
-    /* TODO: is it necessary to implement each of these traversals three times?
-    @Test
-    @LoadGraphWith(MODERN)
-    public void testTraversalUpdater() throws Exception {
-        assertBranchFactor(
-                2.0,
-                as("a").out("knows").as("b"),
-                new SingleIterator<>(g.V(1)));
-
-        assertBranchFactor(
-                0.0,
-                as("a").out("foo").as("b"),
-                new SingleIterator<>(g.V(1)));
-
-        assertBranchFactor(
-                7.0,
-                as("a").both().both().as("b"),
-                new SingleIterator<>(g.V(1)));
-
-        assertBranchFactor(
-                0.5,
-                as("a").outV().has("name", "marko").as("b"),
-                g.E());
-    }
-    */
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void testOptimization() throws Exception {
-        MatchStep<Object, Object> query;
-        Iterator iter;
-
-        query = new MatchStep<>(g.V().asAdmin(), "d",
-                as("d").in("knows").as("a"),
-                as("d").has("name", "vadas"),
-                as("a").out("knows").as("b"),
-                as("b").out("created").as("c"));
-        iter = g.V();
-        query.optimize();
-        //System.out.println(query.summarize());
-
-        // c costs nothing (no outgoing traversals)
-        assertEquals(0.0, query.findCost("c"), 0);
-        // b-created->c has a cost equal to its branch factor, 1.0
-        // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
-        assertEquals(1.0, query.findCost("b"), 0);
-        // the cost of a-knows->b is its branch factor (1.0) plus the branch factor times the cost of b-created->c (1.0), so 2.0
-        // a has only one outgoing traversal, a-knows->b, so its total cost is 2.0
-        assertEquals(2.0, query.findCost("a"), 0);
-        // the cost of d<-knows-a is its branch factor (1.0) plus the branch factor times the cost of a-knows->b (2.0), so 3.0
-        // the cost of d->has(name,vadas) is its branch factor (1.0)
-        // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
-        //     or 3.0 + 1.0*1.0 = 4.0
-        assertEquals(4.0, query.findCost("d"), 0);
-
-        // apply the query to the graph, gathering non-trivial branch factors
-        assertResults(query.solveFor(iter),
-                new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "lop")),
-                new Bindings<>().put("d", convertToVertex(graph, "vadas")).put("a", convertToVertex(graph, "marko")).put("b", convertToVertex(graph, "josh")).put("c", convertToVertex(graph, "ripple")));
-        query.optimize();
-        //System.out.println(query.summarize());
-
-        // c still costs nothing (no outgoing traversals)
-        assertEquals(0.0, query.findCost("c"), 0);
-        // b-created->c still has a branch factor of 1.0, as we have put two items in (josh and vadas) and gotten two out (lop and ripple)
-        // b has only one outgoing traversal, b-created->c, so its total cost is 1.0
-        /* TODO: adjust and restore
-        assertEquals(1.0, query.findCost("b"), 0);
-        // a-knows->b now has a branch factor of 2.0 -- we put in marko and got out josh and vadas
-        // the cost of a-knows->b is its branch factor (2.0) plus the branch factor times the cost of b-created->c (1.0), so 4.0
-        // a has only one outgoing traversal, a-knows->b, so its total cost is 4.0
-        assertEquals(4.0, query.findCost("a"), 0);
-        // d<-knows-a has a branch factor of 1/6 -- we put in all six vertices and got out marko
-        //     we get out marko only once, because d-name->"vadas" is tried first and rules out all but one "d"
-        // the cost of d<-knows-a is its branch factor (1/6) plus the branch factor times the cost of a-knows->b (4.0), so 5/6
-        // since we optimized to put the has step first (it immediately eliminates most vertices),
-        //     the cost of d->has(name,vadas) is 1/6 -- we put in all six vertices and got out one
-        // the total cost of d is the cost of its first traversal times the branch factor of the first times the cost of the second,
-        //     or 1/6 + 1/6*5/6 = 11/36
-        */
-    }
-
-    // TODO: uncomment when query cycles are supported
-    /*
-    @Test
-    @LoadGraphWith(MODERN)
-    public void testCyclicPatterns() throws Exception {
-        MatchStep<Object, Object> query;
-        Iterator iter;
-
-        iter = g.V();
-        query = new MatchStep<>(g.V(), "a",
-                as("a").out("uses").as("b"),
-                as("b").out("dependsOn").as("c"),
-                as("c").in("created").as("a"));
-
-        assertResults(query.solve(iter),
-                new Bindings<>().put("a", "v[1]").put("b", "v[10]").put("c", "v[11]"));
-    }
-    */
-
-    @Test
-    public void testIteratorEnumerator() throws Exception {
-        IteratorEnumerator<String> ie;
-        final Map<String, String> map = new HashMap<>();
-        BiConsumer<String, String> visitor = map::put;
-
-        ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
-            add("foo");
-            add("bar");
-        }}.iterator());
-        assertEquals(0, ie.size());
-        assertTrue(ie.visitSolution(0, visitor));
-        assertEquals(1, ie.size());
-        assertEquals(1, map.size());
-        assertEquals("foo", map.get("a"));
-        map.clear();
-        assertTrue(ie.visitSolution(1, visitor));
-        assertEquals(2, ie.size());
-        assertEquals(1, map.size());
-        assertEquals("bar", map.get("a"));
-        map.clear();
-        assertFalse(ie.visitSolution(2, visitor));
-        assertEquals(2, ie.size());
-        assertEquals(0, map.size());
-        // revisit previous solutions at random
-        assertTrue(ie.visitSolution(1, visitor));
-        assertEquals(2, ie.size());
-        assertEquals(1, map.size());
-        assertEquals("bar", map.get("a"));
-
-        // empty enumerator
-        ie = new IteratorEnumerator<>("a", new LinkedList<String>() {{
-        }}.iterator());
-        map.clear();
-        assertEquals(0, ie.size());
-        assertFalse(ie.visitSolution(0, visitor));
-        assertEquals(0, ie.size());
-        assertEquals(0, map.size());
-    }
-
-    @Test
-    public void testCrossJoin() throws Exception {
-        String[] a1 = new String[]{"a", "b", "c"};
-        String[] a2 = new String[]{"1", "2", "3", "4"};
-        String[] a3 = new String[]{"@", "#"};
-
-        Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
-        Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
-        Enumerator<String> e3 = new IteratorEnumerator<>("punc", Arrays.asList(a3).iterator());
-
-        Enumerator<String> e1e2 = new CrossJoinEnumerator<>(e1, e2);
-        Enumerator<String> e2e1 = new CrossJoinEnumerator<>(e2, e1);
-        BiConsumer<String, String> visitor = (name, value) -> {
-            System.out.println("\t" + name + ":\t" + value);
-        };
-        Enumerator<String> e1e2e3 = new CrossJoinEnumerator<>(e1e2, e3);
-
-        Enumerator<String> result;
-
-        result = e1e2;
-        assertEquals(12, exhaust(result));
-        assertEquals(12, result.size());
-
-        result = e2e1;
-        assertEquals(12, exhaust(result));
-        assertEquals(12, result.size());
-
-        result = e1e2e3;
-        assertEquals(24, exhaust(result));
-        assertEquals(24, result.size());
-
-        /*
-        int i = 0;
-        while (result.visitSolution(i, visitor)) {
-            System.out.println("solution #" + (i + 1) + "^^");
-            i++;
-        }
-        */
-    }
-
-    /* TODO: uncomment when optimized cross-joins are available
-    @Test
-    public void testCrossJoinLaziness() throws Exception {
-        List<Integer> value = new LinkedList<>();
-        for (int j = 0; j < 1000; j++) {
-            value.add(j);
-        }
-
-        int base = 3;
-        List<Enumerator<Integer>> enums = new LinkedList<>();
-        for (int k = 0; k < base; k++) {
-            List<Integer> lNew = new LinkedList<>();
-            lNew.addAll(value);
-            Enumerator<Integer> ek = new IteratorEnumerator<>("" + (char) ('a' + k), lNew.iterator());
-            enums.add(ek);
-        }
-
-        Enumerator<Integer> e = new NewCrossJoinEnumerator<>(enums);
-
-        // we now have an enumerator of 5^3^10 elements
-        EnumeratorIterator<Integer> iter = new EnumeratorIterator<>(e);
-
-        int count = 0;
-        // each binding set is unique
-        Set<String> values = new HashSet<>();
-        String s;
-        s = iter.next().toString();
-        values.add(s);
-        assertEquals(++count, values.size());
-        // begin at the head of all iterators
-        assertEquals("{a=0, b=0, c=0, d=0, e=0, f=0, g=0, h=0, i=0, j=0}", s);
-        int lim0 = (int) Math.pow(1, base);
-        // first 2^10 results are binary (0's and 1's)
-        int lim1 = (int) Math.pow(2, base);
-        for (int i = lim0; i < lim1; i++) {
-            s = iter.next().toString();
-            System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
-            assertTrue(s.contains("1"));
-            assertFalse(s.contains("2"));
-            values.add(s);
-            assertEquals(++count, values.size());
-        }
-        int lim2 = (int) Math.pow(3, base);
-        for (int i = lim1; i < lim2; i++) {
-            s = iter.next().toString();
-            System.out.println("" + i + ": " + count + ": " + s); System.out.flush();
-
-            if (!s.contains("2")) {
-                findMissing(null, 0, base, "abcdefghij".getBytes(), values);
-            }
-
-
-            assertTrue(s.contains("2"));
-            assertFalse(s.contains("3"));
-            values.add(s);
-            assertEquals(++count, values.size());
-        }
-    }
-    */
-
-    @Test
-    public void testInnerJoin() throws Exception {
-        String[] a1 = new String[]{"a", "b", "c"};
-        String[] a2 = new String[]{"1", "2", "3", "4"};
-        String[] a3 = new String[]{"2", "4", "6", "8", "10"};
-
-        Enumerator<String> e1 = new IteratorEnumerator<>("letter", Arrays.asList(a1).iterator());
-        Enumerator<String> e2 = new IteratorEnumerator<>("number", Arrays.asList(a2).iterator());
-        Enumerator<String> e3 = new IteratorEnumerator<>("number", Arrays.asList(a3).iterator());
-
-        Enumerator<String> e4 = new CrossJoinEnumerator<>(e1, e3);
-        Enumerator<String> e5 = new CrossJoinEnumerator<>(e2, e4);
-
-        // without AND semantics, we have all 60 combinations, including two "number" bindings per solution
-        exhaust(e5);
-        assertEquals(60, e5.size());
-
-        // with AND semantics, we have only those six solutions for which a2 and a3 align
-        Enumerator<String> join = new InnerJoinEnumerator<>(e5, new HashSet<String>() {{
-            add("number");
-        }});
-        exhaust(join);
-        assertEquals(6, join.size());
-
-        assertResults(join,
-                new Bindings<String>().put("letter", "a").put("number", "2"),
-                new Bindings<String>().put("letter", "a").put("number", "4"),
-                new Bindings<String>().put("letter", "b").put("number", "2"),
-                new Bindings<String>().put("letter", "b").put("number", "4"),
-                new Bindings<String>().put("letter", "c").put("number", "2"),
-                new Bindings<String>().put("letter", "c").put("number", "4"));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class Traversals extends MatchTest {
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
-            return g.V().match("a", as("a").out().as("b"));
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
-            return g.V().match("a", as("a").out().as("b")).select("b").by(T.id);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
-            return g.V().match("a",
-                    as("a").out("knows").as("b"),
-                    as("b").out("created").as("c"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
-            return g.V().match("a",
-                    as("a").out("knows").as("b"),
-                    as("a").out("created").as("c"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
-            return g.V().match("d",
-                    as("d").in("knows").as("a"),
-                    as("d").has("name", "vadas"),
-                    as("a").out("knows").as("b"),
-                    as("b").out("created").as("c"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
-            return g.V().match("a",
-                    as("a").out("created").as("b"),
-                    __.<Vertex>as("a").repeat(out()).times(2).as("b")).<String>select("a", "b").by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
-            return g.V().match("a",
-                    as("a").out("created").has("name", "lop").as("b"),
-                    as("b").in("created").has("age", 29).as("c"),
-                    __.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
-            return g.V().match("a",
-                    as("a").out("created").has("name", "lop").as("b"),
-                    as("b").in("created").has("age", 29).as("c"))
-                    .where(__.<Vertex>as("c").repeat(out()).times(2)).<String>select().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
-            return g.V().out().out().match("a",
-                    as("a").in("created").as("b"),
-                    as("b").in("knows").as("c")).select("c").out("created").values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
-            return g.V().match("a",
-                    as("a").out("created").as("b"),
-                    as("b").in("created").as("a"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
-            return g.V().match("a", as("a").out("knows").as("b"),
-                    as("c").out("knows").as("b"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
-            return g.V().match("a",
-                    as("a").out("knows").as("b"),
-                    as("b").out("created").has("name", "lop"),
-                    as("b").match("a1",
-                            as("a1").out("created").as("b1"),
-                            as("b1").in("created").as("c1")).select("c1").as("c")).<String>select().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
-            return g.V().match("a",
-                    as("a").has("name", "Garcia"),
-                    as("a").in("writtenBy").as("b"),
-                    as("a").in("sungBy").as("b"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
-            return g.V().match("a",
-                    as("a").in("sungBy").as("b"),
-                    as("a").in("sungBy").as("c"),
-                    as("b").out("writtenBy").as("d"),
-                    as("c").out("writtenBy").as("e"),
-                    as("d").has("name", "George_Harrison"),
-                    as("e").has("name", "Bob_Marley"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
-            return g.V().match("a",
-                    as("a").in("sungBy").as("b"),
-                    as("a").in("writtenBy").as("c"),
-                    as("b").out("writtenBy").as("d"),
-                    as("c").out("sungBy").as("d"),
-                    as("d").has("name", "Garcia"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
-            return g.V().match("a",
-                    as("a").in("sungBy").as("b"),
-                    as("a").in("writtenBy").as("c"),
-                    as("b").out("writtenBy").as("d"))
-                    .where(as("c").out("sungBy").as("d"))
-                    .where(as("d").has("name", "Garcia"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
-            return g.V().match("a",
-                    as("a").out("created").as("b"),
-                    as("b").in("created").as("c"))
-                    .where("a", Compare.neq, "c")
-                    .<String>select("a", "c").by("name");
-        }
-
-        /*@Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
-            return g.V().match("a",
-                    as("a").out("created").as("b"),
-                    as("c").out("created").as("b")).select(v -> ((Vertex) v).value("name"));
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
-            return g.V().out().out().match("a",
-                    as("b").out("created").as("a"),
-                    as("c").out("knows").as("b")).select("c").out("knows").value("name");
-        }*/
-
-    }
-
-    private static final Function<Vertex, String> vertexToStr = v -> v.id().toString();
-
-    private <S, E> void assertResults(final Function<E, String> toStringFunction,
-                                      final Traversal<S, Map<String, E>> actual,
-                                      final Bindings<E>... expected) {
-        Comparator<Bindings<E>> comp = new Bindings.BindingsComparator<>(toStringFunction);
-
-        List<Bindings<E>> actualList = toBindings(actual);
-        List<Bindings<E>> expectedList = new LinkedList<>();
-        Collections.addAll(expectedList, expected);
-
-        if (expectedList.size() > actualList.size()) {
-            fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
-        } else if (actualList.size() > expectedList.size()) {
-            fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
-        }
-
-        Collections.sort(actualList, comp);
-        Collections.sort(expectedList, comp);
-
-        for (int j = 0; j < actualList.size(); j++) {
-            Bindings<E> a = actualList.get(j);
-            Bindings<E> e = expectedList.get(j);
-
-            if (0 != comp.compare(a, e)) {
-                fail("unexpected result(s), including " + a);
-            }
-        }
-        assertFalse(actual.hasNext());
-    }
-
-    private static final Function<Object, String> simpleToStringFunction = Object::toString;
-
-    private <T> void assertResults(final Enumerator<T> actual,
-                                   final Bindings<T>... expected) {
-        Comparator<Bindings<T>> comp = new Bindings.BindingsComparator<>((Function<T, String>) simpleToStringFunction);
-
-        List<Bindings<T>> actualList = toBindings(actual);
-        List<Bindings<T>> expectedList = new LinkedList<>();
-        Collections.addAll(expectedList, expected);
-
-        Collections.sort(actualList, comp);
-        Collections.sort(expectedList, comp);
-
-        for (int j = 0; j < actualList.size(); j++) {
-            if (j == expectedList.size()) {
-                fail("" + (actualList.size() - expectedList.size()) + " unexpected results, including " + actualList.get(expectedList.size()));
-            }
-
-            Bindings<T> a = actualList.get(j);
-            Bindings<T> e = expectedList.get(j);
-
-            if (0 != comp.compare(a, e)) {
-                fail("unexpected result(s), including " + a);
-            }
-        }
-        if (expectedList.size() > actualList.size()) {
-            fail("" + (expectedList.size() - actualList.size()) + " expected results not found, including " + expectedList.get(actualList.size()));
-        }
-    }
-
-    private <S, E> List<Bindings<E>> toBindings(final Traversal<S, Map<String, E>> traversal) {
-        List<Bindings<E>> result = new LinkedList<>();
-        traversal.forEachRemaining(o -> {
-            result.add(new Bindings<>(o));
-        });
-        return result;
-    }
-
-    private <T> List<Bindings<T>> toBindings(final Enumerator<T> enumerator) {
-        List<Bindings<T>> bindingsList = new LinkedList<>();
-        int i = 0;
-        bindingsList.add(new Bindings<>());
-        while (enumerator.visitSolution(i++, (name, value) -> {
-            bindingsList.get(bindingsList.size() - 1).put(name, value);
-        })) {
-            bindingsList.add(new Bindings<>());
-        }
-        bindingsList.remove(bindingsList.size() - 1);
-
-        return bindingsList;
-    }
-
-    private void assertBranchFactor(final double branchFactor,
-                                    final Traversal t,
-                                    final Iterator inputs) {
-        Traverser start = new B_O_PA_S_SE_SL_Traverser(null, null);
-        MatchStep.TraversalWrapper w = new MatchStep.TraversalWrapper(t, "a", "b");
-        MatchStep.TraversalUpdater updater = new MatchStep.TraversalUpdater<>(w, inputs, start, "x");
-        while (updater.hasNext()) {
-            updater.next();
-        }
-        assertEquals(branchFactor, w.findBranchFactor(), 0);
-    }
-
-    private <T> int exhaust(Enumerator<T> enumerator) {
-        BiConsumer<String, T> visitor = (s, t) -> {
-        };
-        int i = 0;
-        while (enumerator.visitSolution(i, visitor)) i++;
-        return i;
-    }
-
-    private void findMissing(String s, final int i, final int n, final byte[] names, final Set<String> actual) {
-        if (0 == i) {
-            s = "{";
-        } else {
-            s += ", ";
-        }
-
-        s += (char) names[i];
-        s += "=";
-        String tmp = s;
-        for (int j = 0; j < 3; j++) {
-            s += j;
-
-            if (n - 1 == i) {
-                s += "}";
-                if (!actual.contains(s)) {
-                    fail("not in set: " + s);
-                }
-            } else {
-                findMissing(s, i + 1, n, names, actual);
-            }
-
-            s = tmp;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 6db12d2..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MaxTest.java
+++ /dev/null
@@ -1,93 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MaxTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Integer> get_g_V_age_max();
-
-    public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max();
-
-    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_age_max() {
-        final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
-                get_g_V_age_max(),
-                get_g_V_repeatXbothX_timesX5X_age_max());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            checkResults(Arrays.asList(35), traversal);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmaxXlocalXX() {
-        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Number> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(1.0, map.get("ripple"));
-        assertEquals(0.4, map.get("lop"));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends MaxTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_max() {
-            return g.V().values("age").max();
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
-            return g.V().repeat(both()).times(5).values("age").max();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmaxXlocalXX() {
-            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/4c97e964/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
deleted file mode 100644
index 6cfb94f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MeanTest.java
+++ /dev/null
@@ -1,88 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.mean;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MeanTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Double> get_g_V_age_mean();
-
-    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_age_mean() {
-        final List<Traversal<Vertex, Double>> traversals = Arrays.asList(get_g_V_age_mean());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Double mean = traversal.next();
-            assertEquals(30.75, mean, 0.05);
-            assertFalse(traversal.hasNext());
-
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXmeanXlocalXX() {
-        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Number> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(1.0, map.get("ripple"));
-        assertEquals(1.0 / 3, map.get("lop"));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends MeanTest {
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_age_mean() {
-            return g.V().values("age").mean();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXmeanXlocalXX() {
-            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/4c97e964/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
deleted file mode 100644
index 7dae819..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MinTest.java
+++ /dev/null
@@ -1,93 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Scope;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class MinTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Integer> get_g_V_age_min();
-
-    public abstract Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min();
-
-    public abstract Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_age_min() {
-        final List<Traversal<Vertex, Integer>> traversals = Arrays.asList(
-                get_g_V_age_min(),
-                get_g_V_repeatXbothX_timesX5X_age_min());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            checkResults(Arrays.asList(27), traversal);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasLabelXsoftwareX_group_byXnameX_byXin_valuesXageX_foldX_byXminXlocalXX() {
-        final Traversal<Vertex, Map<String, Number>> traversal = get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Number> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(1.0, map.get("ripple"));
-        assertEquals(0.2, map.get("lop"));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends MinTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_min() {
-            return g.V().values("age").min();
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
-            return g.V().repeat(both()).times(5).values("age").min();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Number>> get_g_V_hasLabelXsoftwareX_group_byXnameX_byXbothE_valuesXweightX_foldX_byXminXlocalXX() {
-            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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
deleted file mode 100644
index d142d18..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/OrderTest.java
+++ /dev/null
@@ -1,288 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-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.structure.Order;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class OrderTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_V_name_order();
-
-    public abstract Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X();
-
-    public abstract Traversal<Vertex, String> get_g_V_order_byXname_incrX_name();
-
-    public abstract Traversal<Vertex, String> get_g_V_order_byXnameX_name();
-
-    public abstract Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight();
-
-    public abstract Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
-
-    public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
-
-    public abstract Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_name_order() {
-
-        final Traversal<Vertex, String> traversal = get_g_V_name_order();
-        printTraversalForm(traversal);
-        final List<String> names = traversal.toList();
-        assertEquals(names.size(), 6);
-        assertEquals("josh", names.get(0));
-        assertEquals("lop", names.get(1));
-        assertEquals("marko", names.get(2));
-        assertEquals("peter", names.get(3));
-        assertEquals("ripple", names.get(4));
-        assertEquals("vadas", names.get(5));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
-        final Traversal<Vertex, String> traversal = get_g_V_name_order_byXa1_b1X_byXb2_a2X();
-        printTraversalForm(traversal);
-        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(names.size(), 6);
-        assertEquals("marko", names.get(0));
-        assertEquals("vadas", names.get(1));
-        assertEquals("peter", names.get(2));
-        assertEquals("ripple", names.get(3));
-        assertEquals("josh", names.get(4));
-        assertEquals("lop", names.get(5));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_order_byXname_incrX_name() {
-        Arrays.asList(get_g_V_order_byXname_incrX_name(), get_g_V_order_byXnameX_name()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
-            assertEquals(names.size(), 6);
-            assertEquals("josh", names.get(0));
-            assertEquals("lop", names.get(1));
-            assertEquals("marko", names.get(2));
-            assertEquals("peter", names.get(3));
-            assertEquals("ripple", names.get(4));
-            assertEquals("vadas", names.get(5));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_outE_order_byXweight_decrX_weight() {
-        final Traversal<Vertex, Double> traversal = get_g_V_outE_order_byXweight_decrX_weight();
-        printTraversalForm(traversal);
-        final List<Double> weights = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(6, weights.size());
-        assertEquals(Double.valueOf(1.0d), weights.get(0));
-        assertEquals(Double.valueOf(1.0d), weights.get(1));
-        assertEquals(Double.valueOf(0.5d), weights.get(2));
-        assertEquals(Double.valueOf(0.4d), weights.get(3));
-        assertEquals(Double.valueOf(0.4d), weights.get(4));
-        assertEquals(Double.valueOf(0.2d), weights.get(5));
-
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name();
-        printTraversalForm(traversal);
-        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(names.size(), 6);
-        assertEquals("marko", names.get(0));
-        assertEquals("vadas", names.get(1));
-        assertEquals("peter", names.get(2));
-        assertEquals("ripple", names.get(3));
-        assertEquals("josh", names.get(4));
-        assertEquals("lop", names.get(5));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
-        final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select();
-        printTraversalForm(traversal);
-        int counter = 0;
-        int markoCounter = 0;
-        int joshCounter = 0;
-        int peterCounter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Map<String, Vertex> bindings = traversal.next();
-            assertEquals(2, bindings.size());
-            if (bindings.get("a").id().equals(convertToVertexId("marko"))) {
-                assertEquals(convertToVertexId("lop"), bindings.get("b").id());
-                markoCounter++;
-            } else if (bindings.get("a").id().equals(convertToVertexId("josh"))) {
-                assertTrue((bindings.get("b")).id().equals(convertToVertexId("lop")) || bindings.get("b").id().equals(convertToVertexId("ripple")));
-                joshCounter++;
-            } else if (bindings.get("a").id().equals(convertToVertexId("peter"))) {
-                assertEquals(convertToVertexId("lop"), bindings.get("b").id());
-                peterCounter++;
-            } else {
-                fail("This state should not have been reachable");
-            }
-
-
-        }
-        assertEquals(4, markoCounter + joshCounter + peterCounter);
-        assertEquals(1, markoCounter);
-        assertEquals(1, peterCounter);
-        assertEquals(2, joshCounter);
-        assertEquals(4, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX() {
-        final Traversal<Vertex, Map<Integer, Integer>> traversal = get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        final Map<Integer, Integer> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(4, map.size());
-        final Iterator<Map.Entry<Integer, Integer>> iterator = map.entrySet().iterator();
-        Map.Entry<Integer, Integer> entry = iterator.next();
-        assertEquals(3, entry.getKey().intValue());
-        assertEquals(87, entry.getValue().intValue());
-        entry = iterator.next();
-        assertEquals(2, entry.getKey().intValue());
-        assertEquals(58, entry.getValue().intValue());
-        entry = iterator.next();
-        assertEquals(1, entry.getKey().intValue());
-        assertEquals(29, entry.getValue().intValue());
-        entry = iterator.next();
-        assertEquals(4, entry.getKey().intValue());
-        assertEquals(29, entry.getValue().intValue());
-        assertFalse(iterator.hasNext());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_order_byXoutE_count__decrX() {
-        Arrays.asList(get_g_V_order_byXoutE_count__decrX()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
-            assertEquals(vertices.size(), 6);
-            assertEquals("marko", vertices.get(0).value("name"));
-            assertEquals("josh", vertices.get(1).value("name"));
-            assertEquals("peter", vertices.get(2).value("name"));
-            assertTrue(vertices.get(3).value("name").equals("vadas") || vertices.get(3).value("name").equals("ripple") || vertices.get(3).value("name").equals("lop"));
-            assertTrue(vertices.get(4).value("name").equals("vadas") || vertices.get(4).value("name").equals("ripple") || vertices.get(4).value("name").equals("lop"));
-            assertTrue(vertices.get(5).value("name").equals("vadas") || vertices.get(5).value("name").equals("ripple") || vertices.get(5).value("name").equals("lop"));
-        });
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends OrderTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_name_order() {
-            return g.V().<String>values("name").order();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
-            return g.V().<String>values("name").order().by((a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).by((a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3)));
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
-            return g.V().order().by("name", Order.incr).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
-            return g.V().order().by("name", Order.incr).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
-            return g.V().outE().order().by("weight", Order.decr).values("weight");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
-            return g.V().order().
-                    <String>by("name", (a, b) -> a.substring(1, 2).compareTo(b.substring(1, 2))).
-                    <String>by("name", (a, b) -> b.substring(2, 3).compareTo(a.substring(2, 3))).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
-            return g.V().as("a").out("created").as("b").order().by(Order.shuffle).select();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(final Object v1Id) {
-            return g.V(v1Id).map(v -> {
-                final Map<Integer, Integer> map = new HashMap<>();
-                map.put(1, (int) v.get().value("age"));
-                map.put(2, (int) v.get().value("age") * 2);
-                map.put(3, (int) v.get().value("age") * 3);
-                map.put(4, (int) v.get().value("age"));
-                return map;
-            }).order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
-            return g.V().order().by(outE().count(), Order.decr);
-        }
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java
deleted file mode 100644
index 3637689..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PathTest.java
+++ /dev/null
@@ -1,165 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class PathTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id);
-
-    public abstract Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
-
-    public abstract Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX();
-
-    public abstract Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_name_path() {
-        final Traversal<Vertex, Path> traversal = get_g_VX1X_name_path(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        final Path path = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, path.size());
-        assertEquals(convertToVertexId("marko"), ((Vertex) path.get(0)).<String>id());
-        assertEquals("marko", path.<String>get(1));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_path_byXageX_byXnameX() {
-        final Traversal<Vertex, Path> traversal = get_g_VX1X_out_path_byXageX_byXnameX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        final Set<String> names = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            final Path path = traversal.next();
-            assertEquals(Integer.valueOf(29), path.<Integer>get(0));
-            assertTrue(path.get(1).equals("josh") || path.get(1).equals("vadas") || path.get(1).equals("lop"));
-            names.add(path.get(1));
-        }
-        assertEquals(3, counter);
-        assertEquals(3, names.size());
-    }
-
-    @Test
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
-        final Traversal<Vertex, Path> traversal = get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final Path path = traversal.next();
-            assertEquals(3, path.size());
-            assertEquals("marko", ((Vertex) path.get(0)).<String>value("name"));
-            assertEquals("josh", path.<String>get(1));
-            assertEquals("java", path.<String>get(2));
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_path_byXnameX_byXageX() {
-        final Traversal<Vertex, Path> traversal = get_g_V_out_out_path_byXnameX_byXageX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final Path path = traversal.next();
-            assertEquals(3, path.size());
-            assertEquals("marko", path.<String>get(0));
-            assertEquals(Integer.valueOf(32), path.<Integer>get(1));
-            assertTrue(path.get(2).equals("lop") || path.get(2).equals("ripple"));
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
-        final Traversal<Vertex, Path> traversal = get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path();
-        printTraversalForm(traversal);
-        final Path path = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(1, path.size());
-        assertTrue(path.hasLabel("a"));
-        assertTrue(path.hasLabel("b"));
-        assertTrue(path.hasLabel("c"));
-        assertEquals(1, path.labels().size());
-        assertEquals(3, path.labels().get(0).size());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends PathTest {
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
-            return g.V(v1Id).values("name").path();
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
-            return g.V(v1Id).out().path().by("age").by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
-            return g.V().repeat(out()).times(2).path().by().by("name").by("lang");
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
-            return g.V().out().out().path().by("name").by("age");
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
-            return g.V().as("a").has("name", "marko").as("b").has("age", 29).as("c").path();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java
deleted file mode 100644
index d6cf31c..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/PropertiesTest.java
+++ /dev/null
@@ -1,65 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class PropertiesTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value();
-
-    public abstract Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXageX_propertiesXname_ageX_value() {
-        Arrays.asList(get_g_V_hasXageX_propertiesXage_nameX_value(), get_g_V_hasXageX_propertiesXname_ageX_value()).forEach(traversal -> {
-            printTraversalForm(traversal);
-            checkResults(Arrays.asList("marko", 29, "vadas", 27, "josh", 32, "peter", 35), traversal);
-        });
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends PropertiesTest {
-        @Override
-        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
-            return g.V().has("age").properties("name", "age").value();
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
-            return g.V().has("age").properties("age", "name").value();
-        }
-    }
-}
-


[39/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java
deleted file mode 100644
index 95bb3fc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSideEffects.java
+++ /dev/null
@@ -1,225 +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;
-
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-
-import java.io.Serializable;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.function.Supplier;
-import java.util.function.UnaryOperator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalSideEffects extends Cloneable, Serializable {
-
-    public static final String SIDE_EFFECTS = "gremlin.traversal.sideEffects";
-
-    /**
-     * Determines if the {@link TraversalSideEffects} contains the respective key.
-     * If the key references a stored {@link java.util.function.Supplier}, then it should return true as it will be dynamically created on get().
-     *
-     * @param key the key to check for
-     * @return whether the key exists in the sideEffects
-     */
-    public default boolean exists(final String key) {
-        return this.keys().contains(key);
-    }
-
-    /**
-     * Set the specified key to the specified value.
-     * If a {@link java.util.function.Supplier} is provided, it is NOT assumed to be a supplier as set by registerSupplier().
-     *
-     * @param key   the key
-     * @param value the value
-     */
-    public void set(final String key, final Object value);
-
-    /**
-     * Get the sideEffect associated with the provided key.
-     * If the sideEffect contains an object for the key, return it.
-     * Else if the sideEffect has a registered {@link java.util.function.Supplier} for that key, generate the object, store the object in the sideEffects, and return it.
-     *
-     * @param key the key to get the value for
-     * @param <V> the type of the value to retrieve
-     * @return the value associated with key
-     * @throws IllegalArgumentException if the key does not reference an object or a registered supplier.
-     */
-    public <V> V get(final String key) throws IllegalArgumentException;
-
-    /**
-     * Return the value associated with the key or return the provided otherValue.
-     * The otherValue will not be stored in the sideEffect.
-     *
-     * @param key        the key to get the value for
-     * @param otherValue if not value is associated with key, return the other value.
-     * @param <V>        the type of the value to get
-     * @return the value associated with the key or the otherValue
-     */
-    public default <V> V orElse(final String key, final V otherValue) {
-        return this.exists(key) ? this.get(key) : otherValue;
-    }
-
-    /**
-     * If a value or registered {@link java.util.function.Supplier} exists for the provided key, consume it with the provided consumer.
-     *
-     * @param key      the key to the value
-     * @param consumer the consumer to process the value
-     * @param <V>      the type of the value to consume
-     */
-    public default <V> void ifPresent(final String key, final Consumer<V> consumer) {
-        if (this.exists(key)) consumer.accept(this.get(key));
-    }
-
-    /**
-     * Remove both the value and registered {@link java.util.function.Supplier} associated with provided key.
-     *
-     * @param key the key of the value and registered supplier to remove
-     */
-    public void remove(final String key);
-
-    /**
-     * The keys of the sideEffect which includes registered {@link java.util.function.Supplier} keys.
-     * In essence, that which is possible to get().
-     *
-     * @return the keys of the sideEffect
-     */
-    public Set<String> keys();
-
-    ////////////
-
-    /**
-     * Register a {@link java.util.function.Supplier} with the provided key.
-     * When sideEffects get() are called, if no object exists and there exists a registered supplier for the key, the object is generated.
-     * Registered suppliers are used for the lazy generation of sideEffect data.
-     *
-     * @param key      the key to register the supplier with
-     * @param supplier the supplier that will generate an object when get() is called if it hasn't already been created
-     */
-    public void registerSupplier(final String key, final Supplier supplier);
-
-    /**
-     * Get the registered {@link java.util.function.Supplier} associated with the specified key.
-     *
-     * @param key the key associated with the supplier
-     * @param <V> The object type of the supplier
-     * @return A non-empty optional if the supplier exists
-     */
-    public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key);
-
-    /**
-     * A helper method to register a {@link java.util.function.Supplier} if it has not already been registered.
-     *
-     * @param key      the key of the supplier to register
-     * @param supplier the supplier to register if the key has not already been registered
-     */
-    public default void registerSupplierIfAbsent(final String key, final Supplier supplier) {
-        if (!this.getRegisteredSupplier(key).isPresent())
-            this.registerSupplier(key, supplier);
-    }
-
-    public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator);
-
-    public <S> Optional<Supplier<S>> getSackInitialValue();
-
-    public <S> Optional<UnaryOperator<S>> getSackSplitOperator();
-
-    /**
-     * If the sideEffect contains an object associated with the key, return it.
-     * Else if a "with" supplier exists for the key, generate the object, store it in the sideEffects and return the object.
-     * Else use the provided supplier to generate the object, store it in the sideEffects and return the object.
-     * Note that if the orCreate supplier is used, it is NOT registered as a {@link java.util.function.Supplier}.
-     *
-     * @param key      the key of the object to get
-     * @param orCreate if the object doesn't exist as an object or suppliable object, then generate it with the specified supplier
-     * @param <V>      the return type of the object
-     * @return the object that is either retrieved, generated, or supplier via orCreate
-     */
-    public default <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
-        if (this.exists(key))
-            return this.<V>get(key);
-        final Optional<Supplier<V>> with = this.getRegisteredSupplier(key);
-        if (with.isPresent()) {
-            final V v = with.get().get();
-            this.set(key, v);
-            return v;
-        } else {
-            final V v = orCreate.get();
-            this.set(key, v);
-            return v;
-        }
-    }
-
-    ////////////
-
-    public default <V> void forEach(final BiConsumer<String, V> biConsumer) {
-        this.keys().forEach(key -> biConsumer.accept(key, this.get(key)));
-    }
-
-    /**
-     * In a distributed {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer} traversal, the sideEffects of the traversal are not a single object within a single JVM.
-     * Instead, the sideEffects are distributed across the graph and the pieces are stored on the computing vertices.
-     * This method is necessary to call when the {@link org.apache.tinkerpop.gremlin.process.Traversal} is processing the {@link org.apache.tinkerpop.gremlin.process.Traverser}s at a particular {@link org.apache.tinkerpop.gremlin.structure.Vertex}.
-     *
-     * @param vertex the vertex where the traversal is currently executing.
-     */
-    public void setLocalVertex(final Vertex vertex);
-
-    /**
-     * Cloning is used to duplicate the sideEffects typically in OLAP environments.
-     *
-     * @return The cloned sideEffects
-     */
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public TraversalSideEffects clone();
-
-    /**
-     * Add the current {@link TraversalSideEffects} data and suppliers to the provided {@link TraversalSideEffects}.
-     *
-     * @param sideEffects the sideEffects to add this traversal's sideEffect data to.
-     */
-    public void mergeInto(final TraversalSideEffects sideEffects);
-
-    public static class Exceptions {
-
-        public static IllegalArgumentException sideEffectKeyCanNotBeEmpty() {
-            return new IllegalArgumentException("Side effect key can not be the empty string");
-        }
-
-        public static IllegalArgumentException sideEffectKeyCanNotBeNull() {
-            return new IllegalArgumentException("Side effect key can not be null");
-        }
-
-        public static IllegalArgumentException sideEffectValueCanNotBeNull() {
-            return new IllegalArgumentException("Side effect value can not be null");
-        }
-
-        public static IllegalArgumentException sideEffectDoesNotExist(final String key) {
-            return new IllegalArgumentException("Side effects do not have a value for provided key: " + key);
-        }
-
-        public static UnsupportedOperationException dataTypeOfSideEffectValueNotSupported(final Object val) {
-            return new UnsupportedOperationException(String.format("Side effect value [%s] is of type %s is not supported", val, val.getClass()));
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java
deleted file mode 100644
index 49ba077..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalSource.java
+++ /dev/null
@@ -1,48 +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;
-
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.io.Serializable;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalSource {
-
-    public TraversalSource.Builder asBuilder();
-
-    public Optional<GraphComputer> getGraphComputer();
-
-    public Optional<Graph> getGraph();
-
-    ////////////////
-
-    public interface Builder<C extends TraversalSource> extends Serializable {
-
-        public Builder engine(final TraversalEngine.Builder engine);
-
-        public Builder strategy(final TraversalStrategy strategy);
-
-        public C create(final Graph graph);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
deleted file mode 100644
index 91f57a5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategies.java
+++ /dev/null
@@ -1,195 +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;
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ComparatorHolderRemovalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ConjunctionStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.DedupOptimizerStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.EngineDependentStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.IdentityRemovalStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.LabeledEndStepStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.MatchWhereStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.ProfileStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.RangeByIsCountStrategy;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-import org.apache.tinkerpop.gremlin.util.tools.MultiMap;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Matthias Broecheler (me@matthiasb.com)
- */
-public interface TraversalStrategies extends Serializable, Cloneable {
-
-    /**
-     * Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.
-     */
-    public List<TraversalStrategy> toList();
-
-    /**
-     * Apply all the {@link TraversalStrategy} optimizers to the {@link Traversal} for the stated {@link TraversalEngine}.
-     * This method must ensure that the strategies are sorted prior to application.
-     *
-     * @param traversal the traversal to apply the strategies to
-     * @param engine    the engine that the traversal is going to be executed on
-     */
-    public void applyStrategies(final Traversal.Admin<?, ?> traversal);
-
-    /**
-     * Add all the provided {@link TraversalStrategy} instances to the current collection.
-     * When all the provided strategies have been added, the collection is resorted.
-     *
-     * @param strategies the traversal strategies to add
-     * @return the newly updated/sorted traversal strategies collection
-     */
-    public TraversalStrategies addStrategies(final TraversalStrategy... strategies);
-
-    /**
-     * Remove all the provided {@link TraversalStrategy} classes from the current collection.
-     * When all the provided strategies have been removed, the collection is resorted.
-     *
-     * @param strategyClasses the traversal strategies to remove by their class
-     * @return the newly updated/sorted traversal strategies collection
-     */
-    @SuppressWarnings("unchecked")
-    public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses);
-
-    /**
-     * {@inheritDoc}
-     */
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public TraversalStrategies clone();
-
-    /**
-     * Get the {@link TraverserGeneratorFactory} to use to generate traversers.
-     */
-    public TraverserGeneratorFactory getTraverserGeneratorFactory();
-
-    /**
-     * Set the {@link TraverserGeneratorFactory} to use for determining which {@link Traverser} type to generate for the {@link Traversal}.
-     *
-     * @param traverserGeneratorFactory the factory to use
-     */
-    public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory);
-
-    /**
-     * Sorts the list of provided strategies such that the {@link org.apache.tinkerpop.gremlin.process.TraversalStrategy#applyPost()}
-     * and {@link TraversalStrategy#applyPrior()} dependencies are respected.
-     * <p/>
-     * Note, that the order may not be unique.
-     *
-     * @param strategies the traversal strategies to sort
-     */
-    public static void sortStrategies(final List<? extends TraversalStrategy> strategies) {
-        final Map<Class<? extends TraversalStrategy>, Set<Class<? extends TraversalStrategy>>> dependencyMap = new HashMap<>();
-        final Set<Class<? extends TraversalStrategy>> strategyClass = new HashSet<>(strategies.size());
-        //Initialize data structure
-        strategies.forEach(s -> strategyClass.add(s.getClass()));
-
-        //Initialize all the dependencies
-        strategies.forEach(strategy -> {
-            strategy.applyPrior().forEach(s -> {
-                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, s, strategy.getClass());
-            });
-            strategy.applyPost().forEach(s -> {
-                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, strategy.getClass(), s);
-            });
-        });
-        //Now, compute transitive closure until convergence
-        boolean updated;
-        do {
-            updated = false;
-            for (final Class<? extends TraversalStrategy> sc : strategyClass) {
-                List<Class<? extends TraversalStrategy>> toAdd = null;
-                for (Class<? extends TraversalStrategy> before : MultiMap.get(dependencyMap, sc)) {
-                    final Set<Class<? extends TraversalStrategy>> beforeDep = MultiMap.get(dependencyMap, before);
-                    if (!beforeDep.isEmpty()) {
-                        if (toAdd == null) toAdd = new ArrayList<>(beforeDep.size());
-                        toAdd.addAll(beforeDep);
-                    }
-                }
-                if (toAdd != null && MultiMap.putAll(dependencyMap, sc, toAdd)) updated = true;
-            }
-        } while (updated);
-        Collections.sort(strategies, new Comparator<TraversalStrategy>() {
-            @Override
-            public int compare(final TraversalStrategy s1, final TraversalStrategy s2) {
-                boolean s1Before = MultiMap.containsEntry(dependencyMap, s1.getClass(), s2.getClass());
-                boolean s2Before = MultiMap.containsEntry(dependencyMap, s2.getClass(), s1.getClass());
-                if (s1Before && s2Before)
-                    throw new IllegalStateException("Cyclic dependency between traversal strategies: ["
-                            + s1.getClass().getName() + ", " + s2.getClass().getName() + ']');
-                if (s1Before) return -1;
-                else if (s2Before) return 1;
-                else return 0;
-            }
-        });
-    }
-
-    public static final class GlobalCache {
-
-        private static final Map<Class<? extends Graph>, TraversalStrategies> CACHE = new HashMap<>();
-
-        static {
-            final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
-            coreStrategies.addStrategies(
-                    DedupOptimizerStrategy.instance(),
-                    RangeByIsCountStrategy.instance(),
-                    IdentityRemovalStrategy.instance(),
-                    MatchWhereStrategy.instance(),
-                    ComparatorHolderRemovalStrategy.instance(),
-                    LabeledEndStepStrategy.instance(),
-                    EngineDependentStrategy.instance(),
-                    ProfileStrategy.instance(),
-                    TraversalVerificationStrategy.instance(),
-                    ConjunctionStrategy.instance());
-            CACHE.put(Graph.class, coreStrategies.clone());
-            CACHE.put(EmptyGraph.class, new DefaultTraversalStrategies());
-        }
-
-        public static void registerStrategies(final Class<? extends Graph> graphClass, final TraversalStrategies traversalStrategies) {
-            CACHE.put(graphClass, traversalStrategies);
-        }
-
-        public static TraversalStrategies getStrategies(final Class<? extends Graph> graphClass) {
-            final TraversalStrategies traversalStrategies = CACHE.get(graphClass);
-            if (null == traversalStrategies) {
-                if (EmptyGraph.class.isAssignableFrom(graphClass))
-                    return CACHE.get(EmptyGraph.class);
-                else return CACHE.get(Graph.class);
-            }
-            return traversalStrategies;
-        }
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java
deleted file mode 100644
index 33658b5..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalStrategy.java
+++ /dev/null
@@ -1,50 +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;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Set;
-
-/**
- * A {@link TraversalStrategy} defines a particular atomic operation for mutating a {@link Traversal} prior to its evaluation.
- * Traversal strategies are typically used for optimizing a traversal for the particular underlying graph engine.
- * A TraversalStrategy should not have a public constructor as they should not maintain state between applications.
- * Make use of a singleton instance() object to reduce object creation on the JVM.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Matthias Broecheler (me@matthiasb.com)
- */
-public interface TraversalStrategy extends Serializable {
-
-    // A TraversalStrategy should not have a public constructor
-    // Make use of a singleton instance() object to reduce object creation on the JVM
-    // Moreover they are stateless objects.
-
-    public void apply(final Traversal.Admin<?, ?> traversal);
-
-    public default Set<Class<? extends TraversalStrategy>> applyPrior() {
-        return Collections.emptySet();
-    }
-
-    public default Set<Class<? extends TraversalStrategy>> applyPost() {
-        return Collections.emptySet();
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java
deleted file mode 100644
index c9fca71..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traverser.java
+++ /dev/null
@@ -1,280 +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;
-
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.Attachable;
-
-import java.io.Serializable;
-
-/**
- * A {@link Traverser} represents the current state of an object flowing through a {@link Traversal}.
- * A traverser maintains a reference to the current object, a traverser-local "sack", a traversal-global sideEffect, a bulk count, and a path history.
- * <p/>
- * Different types of traverser can exist depending on the semantics of the traversal and the desire for
- * space/time optimizations of the developer.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Traverser<T> extends Serializable, Comparable<Traverser<T>>, Cloneable {
-
-    /**
-     * Get the object that the traverser is current at.
-     *
-     * @return The current object of the traverser
-     */
-    public T get();
-
-    /**
-     * Get the sack local sack object of this traverser.
-     *
-     * @param <S> the type of the sack object
-     * @return the sack object
-     */
-    public <S> S sack();
-
-    /**
-     * Set the traversers sack object to the provided value ("sack the value").
-     *
-     * @param object the new value of the traverser's sack
-     * @param <S>    the type of the object
-     */
-    public <S> void sack(final S object);
-
-    /**
-     * Get the current path of the traverser.
-     *
-     * @return The path of the traverser
-     */
-    public Path path();
-
-    /**
-     * Get the object associated with the specified step-label in the traverser's path history.
-     *
-     * @param stepLabel the step-label in the path to access
-     * @param <A>       the type of the object
-     * @return the object associated with that path label (if more than one object occurs at that step, a list is returned)
-     */
-    public default <A> A path(final String stepLabel) {
-        return this.path().get(stepLabel);
-    }
-
-    /**
-     * Return the number of times the traverser has gone through a looping section of a traversal.
-     *
-     * @return The number of times the traverser has gone through a loop
-     */
-    public int loops();
-
-    /**
-     * A traverser may represent a grouping of traversers to allow for more efficient data propagation.
-     *
-     * @return the number of traversers represented in this traverser.
-     */
-    public long bulk();
-
-    /**
-     * Get a particular value from the sideEffects of the traverser.
-     *
-     * @param sideEffectKey the key of the value to get from the sideEffects
-     * @param <A>           the type of the returned object
-     * @return the object in the sideEffects of the respective key
-     */
-    public default <A> A sideEffects(final String sideEffectKey) {
-        return this.asAdmin().getSideEffects().get(sideEffectKey);
-    }
-
-    /**
-     * Set a particular value in the sideEffects of the traverser.
-     *
-     * @param sideEffectKey   the key of the value to set int the sideEffects
-     * @param sideEffectValue the value to set for the sideEffect key
-     */
-    public default void sideEffects(final String sideEffectKey, final Object sideEffectValue) {
-        this.asAdmin().getSideEffects().set(sideEffectKey, sideEffectValue);
-    }
-
-    /**
-     * If the underlying object of the traverser is comparable, compare it with the other traverser.
-     *
-     * @param other the other traverser that presumably has a comparable internal object
-     * @return the comparison of the two objects of the traversers
-     * @throws ClassCastException if the object of the traverser is not comparable
-     */
-    @Override
-    public default int compareTo(final Traverser<T> other) throws ClassCastException {
-        return ((Comparable) this.get()).compareTo(other.get());
-    }
-
-    /**
-     * Typecast the traverser to a "system traverser" so {@link Traverser.Admin} methods can be accessed.
-     * This is used as a helper method to avoid the awkwardness of <code>((Traverser.Administrative)traverser)</code>.
-     * The default implementation simply returns "this" type casted to {@link Traverser.Admin}.
-     *
-     * @return The type-casted traverser
-     */
-    public default Admin<T> asAdmin() {
-        return (Admin<T>) this;
-    }
-
-    /**
-     * Traverser cloning is important when splitting a traverser at a bifurcation point in a traversal.
-     */
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public Traverser<T> clone();
-
-    /**
-     * The methods in System.Traverser are useful to underlying Step and Traversal implementations.
-     * They should not be accessed by the user during lambda-based manipulations.
-     */
-    public interface Admin<T> extends Traverser<T>, Attachable<Admin<T>> {
-
-        public static final String HALT = "halt";
-
-        /**
-         * When two traversers are {@link Traverser#equals} to each other, then they can be merged.
-         * This method is used to merge the traversers into a single traverser.
-         * This is used for optimization where instead of enumerating all traversers, they can be counted.
-         *
-         * @param other the other traverser to merge into this traverser. Once merged, the other can be garbage collected.
-         */
-        public void merge(final Admin<?> other);
-
-        /**
-         * Generate a child traverser of the current traverser for current as step and new object location.
-         * The child has the path history, future, and loop information of the parent.
-         * The child extends that path history with the current as and provided R-object.
-         *
-         * @param r    The current object of the child
-         * @param step The step yielding the split
-         * @param <R>  The current object type of the child
-         * @return The split traverser
-         */
-        public <R> Admin<R> split(final R r, final Step<T, R> step);
-
-        /**
-         * Generate a sibling traverser of the current traverser with a full copy of all state within the sibling.
-         *
-         * @return The split traverser
-         */
-        public Admin<T> split();
-
-        /**
-         * Set the current object location of the traverser.
-         *
-         * @param t The current object of the traverser
-         */
-        public void set(final T t);
-
-        /**
-         * Increment the number of times the traverser has gone through a looping section of traversal.
-         * The step label is important to create a stack of loop counters when within a nested context.
-         * If the provided label is not the same as the current label on the stack, add a new loop counter.
-         * If the provided label is the same as the current label on the stack, increment the loop counter.
-         *
-         * @param stepLabel the label of the step that is doing the incrementing
-         */
-        public void incrLoops(final String stepLabel);
-
-        /**
-         * Set the number of times the traverser has gone through a loop back to 0.
-         * When a traverser exits a looping construct, this method should be called.
-         * In a nested loop context, the highest stack loop counter should be removed.
-         */
-        public void resetLoops();
-
-        /**
-         * Get the step id of where the traverser is located.
-         * This is typically used in multi-machine systems that require the movement of
-         * traversers between different traversal instances.
-         *
-         * @return The future step for the traverser
-         */
-        public String getStepId();
-
-        /**
-         * Set the step id of where the traverser is located.
-         * If the future is {@link Traverser.Admin#HALT}, then {@link Traverser.Admin#isHalted()} is true.
-         *
-         * @param stepId The future step of the traverser
-         */
-        public void setStepId(final String stepId);
-
-        /**
-         * If the traverser has "no future" then it is done with its lifecycle.
-         * This does not mean that the traverser is "dead," only that it has successfully passed through a {@link Traversal}.
-         *
-         * @return Whether the traverser is done executing or not
-         */
-        public default boolean isHalted() {
-            return getStepId().equals(HALT);
-        }
-
-        /**
-         * Set the number of traversers represented by this traverser.
-         *
-         * @param count the number of traversers
-         */
-        public void setBulk(final long count);
-
-        /**
-         * Prepare the traverser for migration across a JVM boundary.
-         *
-         * @return The deflated traverser
-         */
-        public Admin<T> detach();
-
-        /**
-         * Regenerate the detached traverser given its location at a particular vertex.
-         *
-         * @param hostVertex The vertex that is hosting the traverser
-         * @return The inflated traverser
-         */
-        @Override
-        public Admin<T> attach(final Vertex hostVertex);
-
-        /**
-         * Traversers can not attach to graphs and thus, an {@link UnsupportedOperationException} is thrown.
-         *
-         * @param graph the graph to attach the traverser to, which it can't.
-         * @return nothing as an exception is thrown
-         * @throws UnsupportedOperationException is always thrown as it makes no sense to attach a traverser to a graph
-         */
-        @Override
-        public default Admin<T> attach(final Graph graph) throws UnsupportedOperationException {
-            throw new UnsupportedOperationException("A traverser can only exist at the vertices of the graph, not the graph itself");
-        }
-
-        /**
-         * Set the sideEffects of the {@link Traversal}. Given that traversers can move between machines,
-         * it may be important to re-set this when the traverser crosses machine boundaries.
-         *
-         * @param sideEffects the sideEffects of the traversal.
-         */
-        public void setSideEffects(final TraversalSideEffects sideEffects);
-
-        /**
-         * Get the sideEffects associated with the traversal of the traverser.
-         *
-         * @return the traversal sideEffects of the traverser
-         */
-        public TraversalSideEffects getSideEffects();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java
deleted file mode 100644
index 28563db..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraverserGenerator.java
+++ /dev/null
@@ -1,48 +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;
-
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Iterator;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraverserGenerator {
-
-    public Set<TraverserRequirement> getProvidedRequirements();
-
-    public <S> Traverser.Admin<S> generate(final S start, final Step<S, ?> startStep, final long initialBulk);
-
-    public default <S> Iterator<Traverser.Admin<S>> generateIterator(final Iterator<S> starts, final Step<S, ?> startStep, final long initialBulk) {
-        return new Iterator<Traverser.Admin<S>>() {
-            @Override
-            public boolean hasNext() {
-                return starts.hasNext();
-            }
-
-            @Override
-            public Traverser.Admin<S> next() {
-                return generate(starts.next(), startStep, initialBulk);
-            }
-        };
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
index 6fa3533..f72f4ee 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MessageScope.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java
index 7f2a481..881185c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/clustering/peerpressure/PeerPressureVertexProgram.java
@@ -18,16 +18,15 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
 import org.apache.tinkerpop.gremlin.process.computer.Messenger;
 import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
 import org.apache.tinkerpop.gremlin.process.computer.util.LambdaHolder;
 import org.apache.tinkerpop.gremlin.process.computer.util.StaticVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
index fbfe64e..6afdeaf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/pagerank/PageRankVertexProgram.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank;
 
 import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
 import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner;
 import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
@@ -27,7 +27,7 @@ import org.apache.tinkerpop.gremlin.process.computer.Messenger;
 import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
 import org.apache.tinkerpop.gremlin.process.computer.util.LambdaHolder;
 import org.apache.tinkerpop.gremlin.process.computer.util.StaticVertexProgram;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
index cd97fd1..d5f986a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalClassSupplier.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 
 import java.util.function.Supplier;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
index b262b13..03e0afc 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalScriptSupplier.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
 import org.apache.tinkerpop.gremlin.process.computer.util.ScriptEngineCache;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
index f95a7d1..c8e7ff7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalSupplier.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 
 import java.io.Serializable;
 import java.util.function.Supplier;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index 4376003..bbd221d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -19,11 +19,11 @@
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
 import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
@@ -35,13 +35,13 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Computer
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.util.AbstractVertexProgramBuilder;
 import org.apache.tinkerpop.gremlin.process.computer.util.LambdaHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-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.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
index 533e619..ad33da6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgramMessageCombiner.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
 import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 
 import java.util.Optional;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
index 89f8932..1226146 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraverserExecutor.java
@@ -18,13 +18,13 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
 import org.apache.tinkerpop.gremlin.process.computer.Messenger;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalMatrix;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.*;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
index 2b80011..272de75 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/VertexTraversalSideEffects.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.traversal;
 
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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 3698215..1f9636e 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
@@ -18,18 +18,18 @@
  */
 package org.apache.tinkerpop.gremlin.process.computer.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.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce.TraverserMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.ReducingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.detached.Attachable;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
index 041f34d..0ba12b6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
@@ -19,14 +19,14 @@
 package org.apache.tinkerpop.gremlin.process.computer.traversal.step.sideEffect.mapreduce;
 
 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.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.util.GraphComputerHelper;
 import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
index de1fd5f..3f51ba6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/VertexProgramHelper.java
@@ -20,10 +20,10 @@ package org.apache.tinkerpop.gremlin.process.computer.util;
 
 import org.apache.commons.configuration.AbstractConfiguration;
 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.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
 import org.apache.tinkerpop.gremlin.util.Serializer;
 
 import java.io.IOException;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
deleted file mode 100644
index f11b6c3..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/DefaultGraphTraversal.java
+++ /dev/null
@@ -1,47 +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;
-
-import org.apache.tinkerpop.gremlin.process.traversal.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class DefaultGraphTraversal<S, E> extends DefaultTraversal<S, E> implements GraphTraversal.Admin<S, E> {
-
-    public DefaultGraphTraversal(final Graph graph) {
-        super(graph);
-    }
-
-    @Override
-    public GraphTraversal.Admin<S, E> asAdmin() {
-        return this;
-    }
-
-    @Override
-    public GraphTraversal<S, E> iterate() {
-        return GraphTraversal.Admin.super.iterate();
-    }
-
-    @Override
-    public DefaultGraphTraversal<S, E> clone() {
-        return (DefaultGraphTraversal<S, E>) super.clone();
-    }
-}


[26/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
new file mode 100644
index 0000000..9941e3c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/RangeLocalStep.java
@@ -0,0 +1,84 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class RangeLocalStep<S> extends MapStep<S, S> {
+
+    private final long low;
+    private final long high;
+
+    public RangeLocalStep(final Traversal.Admin traversal, final long low, final long high) {
+        super(traversal);
+        if (low != -1 && high != -1 && low > high) {
+            throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
+        }
+        this.low = low;
+        this.high = high;
+    }
+
+    @Override
+    protected S map(final Traverser.Admin<S> traverser) {
+        final S start = traverser.get();
+        if (start instanceof Map) {
+            final Map map = (Map) start;
+            final long capacity = (this.high != -1 ? this.high : map.size()) - this.low;
+            final Map result = new LinkedHashMap((int) Math.min(capacity, map.size()));
+            long c = 0L;
+            for (final Object obj : map.entrySet()) {
+                final Map.Entry entry = (Map.Entry) obj;
+                if (c >= this.low) {
+                    if (c < this.high || this.high == -1) {
+                        result.put(entry.getKey(), entry.getValue());
+                    } else break;
+                }
+                c++;
+            }
+            return (S) result;
+        } else if (start instanceof Collection) {
+            final Collection collection = (Collection) start;
+            final Collection result = (collection instanceof Set) ? new LinkedHashSet() : new LinkedList();
+            long c = 0L;
+            for (final Object item : collection) {
+                if (c >= this.low) {
+                    if (c < this.high || this.high == -1) {
+                        result.add(item);
+                    } else break;
+                }
+                c++;
+            }
+            return (S) result;
+        }
+        return start;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.java
new file mode 100644
index 0000000..3e0385b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SackStep.java
@@ -0,0 +1,46 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SackStep<S, E> extends MapStep<S, E> {
+
+    public SackStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<S> traverser) {
+        return traverser.sack();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.SACK);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java
new file mode 100644
index 0000000..8203c44
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SampleLocalStep.java
@@ -0,0 +1,112 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class SampleLocalStep<S> extends MapStep<S, S> {
+
+    private static final Random RANDOM = new Random();
+
+    private final int amountToSample;
+
+    public SampleLocalStep(final Traversal.Admin traversal, final int amountToSample) {
+        super(traversal);
+        this.amountToSample = amountToSample;
+    }
+
+    @Override
+    protected S map(final Traverser.Admin<S> traverser) {
+        final S start = traverser.get();
+        if (start instanceof Map) {
+            return mapMap((Map) start);
+        } else if (start instanceof Collection) {
+            return mapCollection((Collection) start);
+        } else if (RANDOM.nextDouble() > 0.5d) {
+            throw FastNoSuchElementException.instance();
+        }
+        return start;
+    }
+
+    private S mapCollection(final Collection collection) {
+        final int size = collection.size();
+        if (size <= this.amountToSample) {
+            return (S) collection;
+        }
+        final double individualWeight = 1.0d / size;
+        final Collection result = new BulkSet();
+        double runningWeight = 0.0d;
+        int runningAmountToSample = 0;
+        while (runningAmountToSample < this.amountToSample) {
+            for (final Object item : collection) {
+                runningWeight = runningWeight + individualWeight;
+                if (RANDOM.nextDouble() <= (runningWeight / size)) {
+                    result.add(item);
+                    if (++runningAmountToSample == this.amountToSample) {
+                        break;
+                    }
+                }
+            }
+        }
+        return (S) result;
+    }
+
+    private S mapMap(final Map map) {
+        final int size = map.size();
+        if (size <= this.amountToSample) {
+            return (S) map;
+        }
+        final double individualWeight = 1.0d / size;
+        final Map result = new HashMap(this.amountToSample);
+        double runningWeight = 0.0d;
+        while (result.size() < this.amountToSample) {
+            for (final Object obj : map.entrySet()) {
+                runningWeight = runningWeight + individualWeight;
+                final Map.Entry entry = (Map.Entry) obj;
+                if (RANDOM.nextDouble() <= (runningWeight / size)) {
+                    result.put(entry.getKey(), entry.getValue());
+                    if (result.size() == this.amountToSample) {
+                        break;
+                    }
+                }
+            }
+        }
+        return (S) result;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
new file mode 100644
index 0000000..fcc830e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java
@@ -0,0 +1,103 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+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.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.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SelectOneStep<S, E> extends MapStep<S, E> implements TraversalParent, EngineDependent {
+
+    private final String selectLabel;
+    private Traversal.Admin<Object, Object> selectTraversal = new IdentityTraversal<>();
+    private boolean requiresPaths = false;
+
+    public SelectOneStep(final Traversal.Admin traversal, final String selectLabel) {
+        super(traversal);
+        this.selectLabel = selectLabel;
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<S> traverser) {
+        final S start = traverser.get();
+        if (start instanceof Map && ((Map) start).containsKey(this.selectLabel))
+            return (E) TraversalUtil.apply(((Map) start).get(this.selectLabel), this.selectTraversal);
+        else
+            return (E) TraversalUtil.apply(traverser.path().<Object>get(this.selectLabel), this.selectTraversal);
+    }
+
+    @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        this.requiresPaths = traversalEngine.isComputer() ?
+                TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent() :
+                TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
+                        .filter(step -> step instanceof CollectingBarrierStep)
+                        .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabel::equals).findAny().isPresent()
+                                || (step.getLabel().isPresent() && this.selectLabel.equals(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
+                        .findAny().isPresent() ||
+                        TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
+                                filter(step -> step instanceof TraversalParent).findAny().isPresent();
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.selectLabel, this.selectTraversal);
+    }
+
+    @Override
+    public SelectOneStep<S, E> clone() {
+        final SelectOneStep<S, E> clone = (SelectOneStep<S, E>) super.clone();
+        clone.selectTraversal = this.selectTraversal.clone();
+        return clone;
+    }
+
+    @Override
+    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+        return Collections.singletonList(this.selectTraversal);
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
+        this.selectTraversal = this.integrateChild(selectTraversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
+        if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
+        return requirements;
+    }
+}
+
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
new file mode 100644
index 0000000..3f62100
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java
@@ -0,0 +1,130 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+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.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Arrays;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implements TraversalParent, EngineDependent {
+
+    protected TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
+    private final List<String> selectLabels;
+    private boolean requiresPaths = false;
+
+    public SelectStep(final Traversal.Admin traversal, final String... selectLabels) {
+        super(traversal);
+        this.selectLabels = selectLabels.length == 0 ? TraversalHelper.getLabelsUpTo(this, this.traversal) : Arrays.asList(selectLabels);
+    }
+
+    @Override
+    protected Map<String, E> map(final Traverser.Admin<S> traverser) {
+        final S start = traverser.get();
+        final Map<String, E> bindings = new LinkedHashMap<>();
+
+        ////// PROCESS STEP BINDINGS
+        final Path path = traverser.path();
+        this.selectLabels.forEach(label -> {
+            if (path.hasLabel(label))
+                bindings.put(label, (E) TraversalUtil.apply(path.<Object>get(label), this.traversalRing.next()));
+        });
+
+        ////// PROCESS MAP BINDINGS
+        if (start instanceof Map) {
+            if (this.selectLabels.isEmpty())
+                ((Map<String, Object>) start).forEach((k, v) -> bindings.put(k, (E) TraversalUtil.apply(v, this.traversalRing.next())));
+            else
+                this.selectLabels.forEach(label -> {
+                    if (((Map) start).containsKey(label))
+                        bindings.put(label, (E) TraversalUtil.apply(((Map) start).get(label), this.traversalRing.next()));
+                });
+        }
+
+        this.traversalRing.reset();
+        return bindings;
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.traversalRing.reset();
+    }
+
+    @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        this.requiresPaths = traversalEngine.isComputer() ?
+                TraversalHelper.getLabelsUpTo(this, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent() :
+                TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream()
+                        .filter(step -> step instanceof CollectingBarrierStep)
+                        .filter(step -> TraversalHelper.getLabelsUpTo(step, this.traversal.asAdmin()).stream().filter(this.selectLabels::contains).findAny().isPresent()
+                                || (step.getLabel().isPresent() && this.selectLabels.contains(step.getLabel().get()))) // TODO: get rid of this (there is a test case to check it)
+                        .findAny().isPresent() ||
+                        TraversalHelper.getStepsUpTo(this, this.traversal.asAdmin()).stream().
+                                filter(step -> step instanceof TraversalParent).findAny().isPresent();
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.selectLabels, this.traversalRing);
+    }
+
+    @Override
+    public SelectStep<S, E> clone() {
+        final SelectStep<S, E> clone = (SelectStep<S, E>) super.clone();
+        clone.traversalRing = new TraversalRing<>();
+        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+        }
+        return clone;
+    }
+
+    @Override
+    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+        return this.traversalRing.getTraversals();
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> selectTraversal) {
+        this.traversalRing.addTraversal(this.integrateChild(selectTraversal));
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.PATH_ACCESS);
+        if (this.requiresPaths) requirements.add(TraverserRequirement.PATH);
+        return requirements;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
new file mode 100644
index 0000000..99ccd68
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumGlobalStep.java
@@ -0,0 +1,137 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SumGlobalStep extends ReducingBarrierStep<Number, Double> implements MapReducer {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.BULK,
+            TraverserRequirement.OBJECT
+    );
+
+    public SumGlobalStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier(new ConstantSupplier<>(0.0d));
+        this.setBiFunction(SumGlobalBiFunction.instance());
+    }
+
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> getMapReduce() {
+        return SumGlobalMapReduce.instance();
+    }
+
+    /////
+
+    private static class SumGlobalBiFunction<S extends Number> implements BiFunction<Double, Traverser<S>, Double>, Serializable {
+
+        private static final SumGlobalBiFunction INSTANCE = new SumGlobalBiFunction();
+
+        private SumGlobalBiFunction() {
+
+        }
+
+        @Override
+        public Double apply(final Double mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed + (traverser.get().doubleValue() * traverser.bulk());
+        }
+
+        public final static <S extends Number> SumGlobalBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
+
+    ///////////
+
+    private static class SumGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Number, MapReduce.NullObject, Number, Number> {
+
+        private static final SumGlobalMapReduce INSTANCE = new SumGlobalMapReduce();
+
+        private SumGlobalMapReduce() {
+
+        }
+
+        @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().doubleValue() * traverser.bulk())));
+        }
+
+        @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) {
+            if (values.hasNext()) {
+                Number sum = values.next();
+                while (values.hasNext()) {
+                    sum = sum.doubleValue() + values.next().doubleValue();
+                }
+                emitter.emit(sum);
+            }
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public Number generateFinalResult(final Iterator<KeyValue<NullObject, Number>> keyValues) {
+            return keyValues.hasNext() ? keyValues.next().getValue() : 0.0d;
+        }
+
+        public static final SumGlobalMapReduce instance() {
+            return INSTANCE;
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
new file mode 100644
index 0000000..4ca2e5a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SumLocalStep.java
@@ -0,0 +1,58 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class SumLocalStep<E extends Number, S extends Iterable<E>> extends MapStep<S, E> {
+
+    public SumLocalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<S> traverser) {
+        Number result;
+        final Iterator<E> iterator = traverser.get().iterator();
+        if (iterator.hasNext()) {
+            result = iterator.next();
+            while (iterator.hasNext()) {
+                result = result.doubleValue() + iterator.next().doubleValue();
+            }
+        } else {
+            result = 0.0d;
+        }
+        return (E) result;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
new file mode 100644
index 0000000..ff3df84
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TreeStep.java
@@ -0,0 +1,178 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+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.TraversalRing;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.TreeSupplier;
+
+import java.io.Serializable;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TreeStep<S> extends ReducingBarrierStep<S, Tree> implements MapReducer, TraversalParent {
+
+    private TraversalRing<Object, Object> traversalRing = new TraversalRing<>();
+
+    public TreeStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier((Supplier) TreeSupplier.instance());
+        this.setBiFunction(new TreeBiFunction());
+    }
+
+
+    @Override
+    public List<Traversal.Admin<Object, Object>> getLocalChildren() {
+        return this.traversalRing.getTraversals();
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> treeTraversal) {
+        this.traversalRing.addTraversal(this.integrateChild(treeTraversal));
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.PATH, TraverserRequirement.SIDE_EFFECTS);
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> getMapReduce() {
+        return TreeMapReduce.instance();
+    }
+
+    @Override
+    public TreeStep<S> clone() {
+        final TreeStep<S> clone = (TreeStep<S>) super.clone();
+        clone.traversalRing = new TraversalRing<>();
+        for (final Traversal.Admin<Object, Object> traversal : this.traversalRing.getTraversals()) {
+            clone.traversalRing.addTraversal(clone.integrateChild(traversal.clone()));
+        }
+        return clone;
+    }
+
+    @Override
+    public Traverser<Tree> processNextStart() {
+        if (this.byPass) {
+            final Traverser.Admin<S> traverser = this.starts.next();
+            return traverser.split(this.reducingBiFunction.apply(new Tree(), traverser), this);
+        } else {
+            return super.processNextStart();
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.traversalRing);
+    }
+
+    ///////////
+
+    private class TreeBiFunction implements BiFunction<Tree, Traverser<S>, Tree>, Serializable {
+
+        private TreeBiFunction() {
+
+        }
+
+        @Override
+        public Tree apply(final Tree mutatingSeed, final Traverser<S> traverser) {
+            Tree depth = mutatingSeed;
+            final Path path = traverser.path();
+            for (int i = 0; i < path.size(); i++) {
+                final Object object = TraversalUtil.apply(path.<Object>get(i), TreeStep.this.traversalRing.next());
+                if (!depth.containsKey(object))
+                    depth.put(object, new Tree<>());
+                depth = (Tree) depth.get(object);
+            }
+            TreeStep.this.traversalRing.reset();
+            return mutatingSeed;
+        }
+    }
+
+    ///////////
+
+    public static final class TreeMapReduce extends StaticMapReduce<MapReduce.NullObject, Tree, MapReduce.NullObject, Tree, Tree> {
+
+        private static final TreeMapReduce INSTANCE = new TreeMapReduce();
+
+        private TreeMapReduce() {
+
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return true;
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<NullObject, Tree> emitter) {
+            vertex.<TraverserSet<Tree>>property(TraversalVertexProgram.HALTED_TRAVERSERS).ifPresent(traverserSet -> traverserSet.forEach(traverser -> emitter.emit(traverser.get())));
+        }
+
+        @Override
+        public void combine(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+            this.reduce(key, values, emitter);
+        }
+
+        @Override
+        public void reduce(final NullObject key, final Iterator<Tree> values, final ReduceEmitter<NullObject, Tree> emitter) {
+            final Tree tree = new Tree();
+            values.forEachRemaining(tree::addTree);
+            emitter.emit(tree);
+        }
+
+        @Override
+        public Tree generateFinalResult(final Iterator<KeyValue<NullObject, Tree>> keyValues) {
+            final Tree tree = new Tree();
+            keyValues.forEachRemaining(keyValue -> tree.addTree(keyValue.getValue()));
+            return tree;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        public static final TreeMapReduce instance() {
+            return INSTANCE;
+        }
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java
new file mode 100644
index 0000000..382815e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/UnfoldStep.java
@@ -0,0 +1,57 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class UnfoldStep<S, E> extends FlatMapStep<S, E> {
+
+    public UnfoldStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
+        final S s = traverser.get();
+        if (s instanceof Iterator)
+            return (Iterator) s;
+        else if (s instanceof Iterable)
+            return ((Iterable) s).iterator();
+        else if (s instanceof Map)
+            return ((Map) s).entrySet().iterator();
+        else
+            return IteratorUtils.of((E) s);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
new file mode 100644
index 0000000..1b3d034
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStep.java
@@ -0,0 +1,82 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class VertexStep<E extends Element> extends FlatMapStep<Vertex, E> {
+
+    private final String[] edgeLabels;
+    private Direction direction;
+    private final Class<E> returnClass;
+
+    public VertexStep(final Traversal.Admin traversal, final Class<E> returnClass, final Direction direction, final String... edgeLabels) {
+        super(traversal);
+        this.direction = direction;
+        this.edgeLabels = edgeLabels;
+        this.returnClass = returnClass;
+    }
+
+    @Override
+    protected Iterator<E> flatMap(final Traverser.Admin<Vertex> traverser) {
+        return Vertex.class.isAssignableFrom(this.returnClass) ?
+                (Iterator<E>) traverser.get().vertices(this.direction, this.edgeLabels) :
+                (Iterator<E>) traverser.get().edges(this.direction, this.edgeLabels);
+    }
+
+    public Direction getDirection() {
+        return this.direction;
+    }
+
+    public String[] getEdgeLabels() {
+        return this.edgeLabels;
+    }
+
+    public Class<E> getReturnClass() {
+        return this.returnClass;
+    }
+
+    public void reverseDirection() {
+        this.direction = this.direction.opposite();
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.direction, Arrays.asList(this.edgeLabels), this.returnClass.getSimpleName().toLowerCase());
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java
new file mode 100644
index 0000000..fb01a6e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Bindings.java
@@ -0,0 +1,87 @@
+/*
+ * 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.map.match;
+
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import java.util.function.Function;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class Bindings<T> {
+    private final SortedMap<String, T> map = new TreeMap<>();
+
+    public Bindings() {
+    }
+
+    public Bindings(final Map<String, T> map) {
+        this.map.putAll(map);
+    }
+
+    public Bindings<T> put(final String name, final T value) {
+        map.put(name, value);
+        return this;
+    }
+
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("{");
+        boolean first = true;
+        for (Map.Entry<String, T> entry : map.entrySet()) {
+            if (first) first = false;
+            else sb.append(", ");
+            sb.append(entry.getKey()).append(':').append(entry.getValue());
+        }
+        sb.append('}');
+        return sb.toString();
+    }
+
+    public static class BindingsComparator<T> implements Comparator<Bindings<T>> {
+        private final Function<T, String> toStringFunction;
+
+        public BindingsComparator(Function<T, String> toStringFunction) {
+            this.toStringFunction = toStringFunction;
+        }
+
+        @Override
+        public int compare(Bindings<T> left, Bindings<T> right) {
+            int cmp = ((Integer) left.map.size()).compareTo(right.map.size());
+            if (0 != cmp) return cmp;
+
+            Iterator<Map.Entry<String, T>> i1 = left.map.entrySet().iterator();
+            Iterator<Map.Entry<String, T>> i2 = right.map.entrySet().iterator();
+            while (i1.hasNext()) {
+                Map.Entry<String, T> e1 = i1.next();
+                Map.Entry<String, T> e2 = i2.next();
+
+                cmp = e1.getKey().compareTo(e1.getKey());
+                if (0 != cmp) return cmp;
+
+                cmp = e1.getValue().toString().compareTo(e2.getValue().toString());
+                if (0 != cmp) return cmp;
+            }
+
+            return 0;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.java
new file mode 100644
index 0000000..167de93
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/CrossJoinEnumerator.java
@@ -0,0 +1,96 @@
+/*
+ * 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.map.match;
+
+import java.util.function.BiConsumer;
+
+/**
+ * An Enumerator which finds the Cartesian product of two other Enumerators,
+ * expanding at the same rate in either dimension.
+ * This maximizes the size of the product with respect to the number of expansions of the base Enumerators.
+ */
+public class CrossJoinEnumerator<T> implements Enumerator<T> {
+
+    private final Enumerator<T> xEnum, yEnum;
+
+    public CrossJoinEnumerator(final Enumerator<T> xEnum,
+                               final Enumerator<T> yEnum) {
+        this.xEnum = xEnum;
+        this.yEnum = yEnum;
+    }
+
+    public int size() {
+        return xEnum.size() * yEnum.size();
+    }
+
+    // note: permits random access
+    public boolean visitSolution(final int index,
+                                 final BiConsumer<String, T> visitor) {
+        int sq = (int) Math.sqrt(index);
+
+        // choose x and y such that the solution represented by index
+        // remains constant as this Enumerator expands
+        int x, y;
+
+        if (0 == index) {
+            x = y = 0;
+        } else {
+            int r = index - sq * sq;
+            if (r < sq) {
+                x = sq;
+                y = r;
+            } else {
+                x = r - sq;
+                y = sq;
+            }
+        }
+
+        // expand x if necessary
+        if (!hasIndex(xEnum, sq)) {
+            if (0 == xEnum.size()) {
+                return false;
+            }
+
+            x = index % xEnum.size();
+            y = index / xEnum.size();
+        }
+
+        // expand y if necessary
+        if (!hasIndex(yEnum, y)) {
+            int height = yEnum.size();
+            if (0 == height) {
+                return false;
+            }
+
+            x = index / height;
+            if (!hasIndex(xEnum, x)) {
+                return false;
+            }
+            y = index % height;
+        }
+
+        // solutions are visited completely (if we have reached this point), else not at all
+        return xEnum.visitSolution(x, visitor) && yEnum.visitSolution(y, visitor);
+    }
+
+    private boolean hasIndex(final Enumerator<T> e,
+                             final int index) {
+        return index < e.size() || e.visitSolution(index, (BiConsumer<String, T>) MatchStep.TRIVIAL_CONSUMER);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.java
new file mode 100644
index 0000000..c5f8bac
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/Enumerator.java
@@ -0,0 +1,46 @@
+/*
+ * 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.map.match;
+
+import java.util.function.BiConsumer;
+
+/**
+ * An array of key/value maps accessible by index.
+ * The total size of the enumerator may be unknown when it is created;
+ * it grows when successive solutions are requested, computing as many as necessary.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public interface Enumerator<T> {
+
+    /**
+     * @return the number of solutions so far known; the enumerator has at least this many.
+     * This should be a relatively cheap operation.
+     */
+    int size();
+
+    /**
+     * Provides access to a solution, allowing it to be printed, put into a map, etc.
+     *
+     * @param index   the index of the solution
+     * @param visitor a consumer for each key/value pair in the solution
+     * @return whether a solution exists at the given index and was visited
+     */
+    boolean visitSolution(int index, BiConsumer<String, T> visitor);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java
new file mode 100644
index 0000000..a26e24d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/InnerJoinEnumerator.java
@@ -0,0 +1,129 @@
+/*
+ * 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.map.match;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
+
+/**
+ * An Enumerator which joins the solutions of a base Enumerator according to repeated variables
+ * <p/>
+ * Note: this Enumerator requires random access to its base Enumerator,
+ * as it maintains a list of indices at which valid solutions are found, and visits only those indices.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class InnerJoinEnumerator<T> implements Enumerator<T> {
+    private final Enumerator<T> baseEnumerator;
+    private Iterator<Integer> iterator;
+    private final List<Integer> joinIndices;
+
+    private final Map<String, T> map;
+    private final BiConsumer<String, T> joinVisitor;
+
+    private int joinCount;
+
+    public InnerJoinEnumerator(final Enumerator<T> baseEnumerator,
+                               final Set<String> joinVariables) {
+
+        this.baseEnumerator = baseEnumerator;
+        this.joinIndices = new ArrayList<>();
+
+        map = new HashMap<>();
+        // TODO: allow for more than two instances of a variable
+        joinVisitor = (name, newValue) -> {
+            if (joinVariables.contains(name)) {
+                T value = map.get(name);
+                if (null == value) {
+                    map.put(name, newValue);
+                } else if (value.equals(newValue)) {
+                    joinCount++;
+                }
+            } else {
+                map.put(name, newValue);
+            }
+        };
+
+        iterator = new Iterator<Integer>() {
+            private int currentIndex = -1;
+
+            {
+                advanceToNext();
+            }
+
+            public boolean hasNext() {
+                // there are no calls to this method
+                return false;
+            }
+
+            public Integer next() {
+                int tmp = currentIndex;
+                advanceToNext();
+                return tmp;
+            }
+
+            private void advanceToNext() {
+                while (true) {
+                    map.clear();
+                    joinCount = 0;
+
+                    if (!baseEnumerator.visitSolution(++currentIndex, joinVisitor)) {
+                        iterator = null;
+                        return;
+                    }
+
+                    if (joinVariables.size() == joinCount) {
+                        joinIndices.add(currentIndex);
+                        return;
+                    }
+                }
+            }
+        };
+    }
+
+    public int size() {
+        return joinIndices.size();
+    }
+
+    public boolean visitSolution(int i, BiConsumer<String, T> visitor) {
+        while (i >= joinIndices.size()) {
+            if (null == iterator) {
+                return false;
+            }
+
+            iterator.next();
+        }
+
+        map.clear();
+        if (!baseEnumerator.visitSolution(joinIndices.get(i), joinVisitor)) {
+            throw new IllegalStateException();
+        }
+
+        for (Map.Entry<String, T> entry : map.entrySet()) {
+            visitor.accept(entry.getKey(), entry.getValue());
+        }
+
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java
new file mode 100644
index 0000000..57d32b7
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/IteratorEnumerator.java
@@ -0,0 +1,67 @@
+/*
+ * 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.map.match;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiConsumer;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class IteratorEnumerator<T> implements Enumerator<T> {
+    private final String name;
+    private Iterator<T> iterator;
+    private final List<T> memory = new ArrayList<>();
+
+    public IteratorEnumerator(final String name,
+                              final Iterator<T> iterator) {
+        this.name = name;
+        this.iterator = iterator;
+    }
+
+    public int size() {
+        return memory.size();
+    }
+
+    public boolean visitSolution(final int index,
+                                 final BiConsumer<String, T> visitor) {
+        T value;
+
+        if (index < memory.size()) {
+            value = memory.get(index);
+        } else do {
+            if (null == iterator) {
+                return false;
+            } else if (!iterator.hasNext()) {
+                // free up memory as soon as possible
+                iterator = null;
+                return false;
+            }
+
+            value = iterator.next();
+            memory.add(value);
+        } while (index >= memory.size());
+
+        MatchStep.visit(name, value, visitor);
+
+        return true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
new file mode 100644
index 0000000..d9cbf28
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/MatchStep.java
@@ -0,0 +1,559 @@
+/*
+ * 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.map.match;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+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.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Set;
+import java.util.Stack;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public final class MatchStep<S, E> extends AbstractStep<S, Map<String, E>> implements TraversalParent {
+
+    static final BiConsumer<String, Object> TRIVIAL_CONSUMER = (s, t) -> {
+    };
+
+    private static final String ANON_LABEL_PREFIX = "_";
+
+    // optimize before processing each start object, by default
+    private static final int DEFAULT_STARTS_PER_OPTIMIZE = 1;
+
+    private final String startLabel;
+    private final Map<String, List<TraversalWrapper<S, S>>> traversalsByStartAs;
+    private final List<Traversal> traversals = new ArrayList<>();
+
+    private int startsPerOptimize = DEFAULT_STARTS_PER_OPTIMIZE;
+    private int optimizeCounter = -1;
+    private int anonLabelCounter = 0;
+
+    private Enumerator<S> currentSolution;
+    private int currentIndex;
+
+    // initial value allows MatchStep to be used as a stand-alone query engine
+    private Traverser.Admin<S> currentStart;
+
+    public MatchStep(final Traversal.Admin traversal, final String startLabel, final Traversal... traversals) {
+        super(traversal);
+        this.startLabel = startLabel;
+        this.traversalsByStartAs = new HashMap<>();
+        this.currentStart = new B_O_PA_S_SE_SL_Traverser<>(null, this);
+        for (final Traversal tl : traversals) {
+            addTraversalPrivate(tl);
+            this.integrateChild(tl.asAdmin());
+            this.traversals.add(tl);
+        }
+        checkSolvability();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements();
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.traversalsByStartAs);
+    }
+
+    /**
+     * Adds an individual traversal to an already-constructed MatchStep.
+     * The query must be solvable after addition (i.e. should not require the addition of
+     * further traversals in order to be solvable)
+     * This method should be called before the query is first executed.
+     *
+     * @param traversal the traversal to add
+     */
+    public void addTraversal(final Traversal<S, S> traversal) {
+        addTraversalPrivate(traversal);
+        this.traversals.add(traversal);
+        this.integrateChild(traversal.asAdmin());
+        checkSolvability();
+    }
+
+    public void setStartsPerOptimize(final int startsPerOptimize) {
+        if (startsPerOptimize < 1) {
+            throw new IllegalArgumentException();
+        }
+        this.startsPerOptimize = startsPerOptimize;
+    }
+
+    @Override
+    protected Traverser<Map<String, E>> processNextStart() throws NoSuchElementException {
+        final Map<String, E> map = new HashMap<>();
+        final Traverser<Map<String, E>> result = this.currentStart.split(map, this);
+        final BiConsumer<String, S> resultSetter = (name, value) -> map.put(name, (E) value);
+
+        while (true) { // break out when the current solution is exhausted and there are no more starts
+            if (null == this.currentSolution) {
+                if (this.starts.hasNext()) {
+                    this.optimizeCounter = (this.optimizeCounter + 1) % this.startsPerOptimize;
+                    if (0 == this.optimizeCounter) {
+                        optimize();
+                    }
+
+                    this.currentStart = this.starts.next();
+                    this.currentSolution = solveFor(IteratorUtils.of(this.currentStart.get()));
+                    this.currentIndex = 0;
+                } else {
+                    throw FastNoSuchElementException.instance();
+                }
+            }
+
+            map.clear();
+            if (this.currentSolution.visitSolution(this.currentIndex++, resultSetter)) {
+                return result;
+            } else {
+                this.currentSolution = null;
+            }
+        }
+    }
+
+    /**
+     * @return a description of the current state of this step, including the query plan and gathered statistics
+     */
+    public String summarize() {
+        final StringBuilder sb = new StringBuilder("match \"")
+                .append(this.startLabel)
+                .append("\":\t")
+                .append(findCost(this.startLabel))
+                .append('\n');
+        summarize(this.startLabel, sb, new HashSet<>(), 1);
+        return sb.toString();
+    }
+
+    private void summarize(final String outLabel,
+                           final StringBuilder sb,
+                           final Set<String> visited,
+                           final int indent) {
+        if (!visited.contains(outLabel)) {
+            visited.add(outLabel);
+            final List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outLabel);
+            if (null != outs) {
+                for (final TraversalWrapper<S, S> w : outs) {
+                    for (int i = 0; i < indent; i++) sb.append('\t');
+                    sb.append(outLabel).append("->").append(w.endLabel).append(":\t");
+                    sb.append(findCost(w));
+                    sb.append('\t').append(w);
+                    sb.append('\n');
+                    summarize(w.endLabel, sb, visited, indent + 1);
+                }
+            }
+        }
+    }
+
+    private void addTraversalPrivate(final Traversal<S, S> traversal) {
+
+        String startAs = traversal.asAdmin().getStartStep().getLabel().orElseThrow(()
+                -> new IllegalArgumentException("All match traversals must have their start step labeled with as()"));
+        String endAs = traversal.asAdmin().getEndStep().getLabel().orElse(null);
+        checkAs(startAs);
+        if (null == endAs) {
+            endAs = createAnonymousAs();
+        } else {
+            checkAs(endAs);
+        }
+
+        final TraversalWrapper<S, S> wrapper = new TraversalWrapper<>(traversal, startAs, endAs);
+        // index all wrapped traversals by their startLabel
+        List<TraversalWrapper<S, S>> l2 = this.traversalsByStartAs.get(startAs);
+        if (null == l2) {
+            l2 = new LinkedList<>();
+            this.traversalsByStartAs.put(startAs, l2);
+        }
+        l2.add(wrapper);
+    }
+
+    // given all the wrapped traversals, determine bad patterns in the set and throw exceptions if not solvable
+    private void checkSolvability() {
+        final Set<String> pathSet = new HashSet<>();
+        final Stack<String> stack = new Stack<>();
+        stack.push(this.startLabel);
+        int countTraversals = 0;
+        while (!stack.isEmpty()) {
+            final String outAs = stack.peek();
+            if (pathSet.contains(outAs)) {
+                stack.pop();
+                pathSet.remove(outAs);
+            } else {
+                pathSet.add(outAs);
+                final List<TraversalWrapper<S, S>> l = traversalsByStartAs.get(outAs);
+                if (null != l) {
+                    for (final TraversalWrapper<S, S> tw : l) {
+                        countTraversals++;
+                        if (pathSet.contains(tw.endLabel)) {
+                            throw new IllegalArgumentException("The provided traversal set contains a cycle due to '"
+                                    + tw.endLabel + '\'');
+                        }
+                        stack.push(tw.endLabel);
+                    }
+                }
+            }
+        }
+
+        int totalTraversals = 0;
+        for (List<TraversalWrapper<S, S>> l : this.traversalsByStartAs.values()) {
+            totalTraversals += l.size();
+        }
+
+        if (countTraversals < totalTraversals) {
+            throw new IllegalArgumentException("The provided traversal set contains unreachable as-label(s)");
+        }
+    }
+
+    private static void checkAs(final String as) {
+        // note: this won't happen so long as the anon prefix is the same as Traversal.UNDERSCORE
+        if (isAnonymousAs(as)) {
+            throw new IllegalArgumentException("The step named '" + as + "' uses reserved prefix '"
+                    + ANON_LABEL_PREFIX + '\'');
+        }
+    }
+
+    private static boolean isAnonymousAs(final String as) {
+        return as.startsWith(ANON_LABEL_PREFIX);
+    }
+
+    private String createAnonymousAs() {
+        return ANON_LABEL_PREFIX + ++this.anonLabelCounter;
+    }
+
+    /**
+     * Directly applies this match query to a sequence of inputs
+     *
+     * @param inputs a sequence of inputs
+     * @return an enumerator over all solutions
+     */
+    public Enumerator<S> solveFor(final Iterator<S> inputs) {
+        return solveFor(startLabel, inputs);
+    }
+
+    private Enumerator<S> solveFor(final String localStartAs,
+                                   final Iterator<S> inputs) {
+        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
+        if (null == outs) {
+            // no out-traversals from here; just enumerate the values bound to localStartAs
+            return isAnonymousAs(localStartAs)
+                    ? new SimpleEnumerator<>(localStartAs, inputs)
+                    : new IteratorEnumerator<>(localStartAs, inputs);
+        } else {
+            // for each value bound to localStartAs, feed it into all out-traversals in parallel and join the results
+            return new SerialEnumerator<>(localStartAs, inputs, o -> {
+                Enumerator<S> result = null;
+                Set<String> leftLabels = new HashSet<>();
+
+                for (TraversalWrapper<S, S> w : outs) {
+                    TraversalUpdater<S, S> updater
+                            = new TraversalUpdater<>(w, IteratorUtils.of(o), currentStart, this.getId());
+
+                    Set<String> rightLabels = new HashSet<>();
+                    addVariables(w.endLabel, rightLabels);
+                    Enumerator<S> ie = solveFor(w.endLabel, updater);
+                    result = null == result ? ie : crossJoin(result, ie, leftLabels, rightLabels);
+                    leftLabels.addAll(rightLabels);
+                }
+
+                return result;
+            });
+        }
+    }
+
+    private static <T> Enumerator<T> crossJoin(final Enumerator<T> left,
+                                               final Enumerator<T> right,
+                                               final Set<String> leftLabels,
+                                               final Set<String> rightLabels) {
+        Set<String> shared = new HashSet<>();
+        for (String s : rightLabels) {
+            if (leftLabels.contains(s)) {
+                shared.add(s);
+            }
+        }
+
+        Enumerator<T> cj = new CrossJoinEnumerator<>(left, right);
+        return shared.size() > 0 ? new InnerJoinEnumerator<>(cj, shared) : cj;
+    }
+
+    // recursively add all non-anonymous variables from a starting point in the query
+    private void addVariables(final String localStartAs,
+                              final Set<String> variables) {
+        if (!isAnonymousAs(localStartAs)) {
+            variables.add(localStartAs);
+        }
+
+        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(localStartAs);
+        if (null != outs) {
+            for (TraversalWrapper<S, S> w : outs) {
+                String endAs = w.endLabel;
+                if (!variables.contains(endAs)) {
+                    addVariables(endAs, variables);
+                }
+            }
+        }
+    }
+
+    // applies a visitor, skipping anonymous variables
+    static <T> void visit(final String name,
+                          final T value,
+                          final BiConsumer<String, T> visitor) {
+        if (!isAnonymousAs(name)) {
+            visitor.accept(name, value);
+        }
+    }
+
+    /**
+     * Computes and applies a new query plan based on gathered statistics about traversal inputs and outputs.
+     */
+    // note: optimize() is never called from within a solution iterator, as it changes the query plan
+    public void optimize() {
+        optimizeAt(startLabel);
+    }
+
+    private void optimizeAt(final String outAs) {
+        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
+        if (null != outs) {
+            for (TraversalWrapper<S, S> t : outs) {
+                optimizeAt(t.endLabel);
+                updateOrderingFactor(t);
+            }
+            Collections.sort(outs);
+        }
+    }
+
+    private double findCost(final TraversalWrapper<S, S> root) {
+        double bf = root.findBranchFactor();
+        return bf + findCost(root.endLabel, root.findBranchFactor());
+    }
+
+    private double findCost(final String outAs,
+                            final double branchFactor) {
+        double bf = branchFactor;
+
+        double cost = 0;
+
+        List<TraversalWrapper<S, S>> outs = traversalsByStartAs.get(outAs);
+        if (null != outs) {
+            for (TraversalWrapper<S, S> child : outs) {
+                cost += bf * findCost(child);
+                bf *= child.findBranchFactor();
+            }
+        }
+
+        return cost;
+    }
+
+    /**
+     * @param outLabel the out-label of one or more traversals in the query
+     * @return the expected cost, in the current query plan, of applying the branch of the query plan at
+     * the given out-label to one start value
+     */
+    public double findCost(final String outLabel) {
+        return findCost(outLabel, 1.0);
+    }
+
+    private void updateOrderingFactor(final TraversalWrapper<S, S> w) {
+        w.orderingFactor = ((w.findBranchFactor() - 1) / findCost(w));
+    }
+
+    @Override
+    public List<Traversal> getLocalChildren() {
+        return this.traversals;
+    }
+
+    /**
+     * A wrapper for a traversal in a query which maintains statistics about the traversal as
+     * it consumes inputs and produces outputs.
+     * The "branch factor" of the traversal is an important factor in determining its place in the query plan.
+     */
+    // note: input and output counts are never "refreshed".
+    // The position of a traversal in a query never changes, although its priority / likelihood of being executed does.
+    // Priority in turn affects branch factor.
+    // However, with sufficient inputs and optimizations,the branch factor is expected to converge on a stable value.
+    public static class TraversalWrapper<A, B> implements Comparable<TraversalWrapper<A, B>> {
+        private final Traversal<A, B> traversal;
+        private final String startLabel, endLabel;
+        private int totalInputs = 0;
+        private int totalOutputs = 0;
+        private double orderingFactor;
+
+        public TraversalWrapper(final Traversal<A, B> traversal,
+                                final String startLabel,
+                                final String endLabel) {
+            this.traversal = traversal;
+            this.startLabel = startLabel;
+            this.endLabel = endLabel;
+        }
+
+        public void incrementInputs() {
+            this.totalInputs++;
+        }
+
+        public void incrementOutputs(int outputs) {
+            this.totalOutputs += outputs;
+        }
+
+        // TODO: take variance into account, to avoid penalizing traversals for early encounters with super-inputs,
+        // or simply for never having been tried
+        public double findBranchFactor() {
+            return 0 == this.totalInputs ? 1 : this.totalOutputs / ((double) this.totalInputs);
+        }
+
+        @Override
+        public int compareTo(final TraversalWrapper<A, B> other) {
+            return ((Double) this.orderingFactor).compareTo(other.orderingFactor);
+        }
+
+        public Traversal<A, B> getTraversal() {
+            return this.traversal;
+        }
+
+        public void reset() {
+            this.traversal.asAdmin().reset();
+        }
+
+        @Override
+        public String toString() {
+            return this.traversal.toString();
+            //return "[" + this.startLabel + "->" + this.endLabel + "," + findBranchFactor() + ","
+            // + this.totalInputs + "," + this.totalOutputs + "," + this.traversal + "]";
+        }
+    }
+
+    /**
+     * A helper object which wraps a traversal, submitting starts and counting results per start
+     */
+    public static class TraversalUpdater<A, B> implements Iterator<B> {
+        private final TraversalWrapper<A, B> w;
+        private int outputs = -1;
+
+        public TraversalUpdater(final TraversalWrapper<A, B> w,
+                                final Iterator<A> inputs,
+                                final Traverser<A> start,
+                                final String as) {
+            this.w = w;
+
+            Iterator<A> seIter = new SideEffectIterator<>(inputs, ignored -> {
+                // only increment traversal input and output counts once an input
+                // has been completely processed by the traversal
+                if (-1 != outputs) {
+                    w.incrementInputs();
+                    w.incrementOutputs(outputs);
+                }
+                outputs = 0;
+            });
+            Iterator<Traverser<A>> starts = new MapIterator<>(seIter,
+                    o -> {
+                        final Traverser.Admin<A> traverser = ((Traverser.Admin<A>) start).split();
+                        traverser.set((A) o);
+                        return traverser;
+                    });
+
+            w.reset();
+
+            // with the traversal "empty" and ready for re-use, add new starts
+            w.traversal.asAdmin().addStarts(starts);
+        }
+
+        // note: may return true after first returning false (inheriting this behavior from e.g. DefaultTraversal)
+        @Override
+        public boolean hasNext() {
+            return w.traversal.hasNext();
+        }
+
+        @Override
+        public B next() {
+            outputs++;
+            B b = w.traversal.next();
+
+            // immediately check hasNext(), possibly updating the traverser's statistics
+            // even if we otherwise abandon the iterator
+            w.traversal.hasNext();
+
+            return b;
+        }
+    }
+
+    // an iterator which executes a side-effect the first time hasNext() is called before a next()
+    private static class SideEffectIterator<T> implements Iterator<T> {
+        private final Consumer onHasNext;
+        private final Iterator<T> baseIterator;
+        private boolean ready = true;
+
+        private SideEffectIterator(final Iterator<T> baseIterator,
+                                   final Consumer onHasNext) {
+            this.onHasNext = onHasNext;
+            this.baseIterator = baseIterator;
+        }
+
+        @Override
+        public boolean hasNext() {
+            if (this.ready) {
+                this.onHasNext.accept(null);
+                this.ready = false;
+            }
+            return this.baseIterator.hasNext();
+        }
+
+        @Override
+        public T next() {
+            T value = this.baseIterator.next();
+            this.ready = true;
+            return value;
+        }
+    }
+
+    private static class MapIterator<A, B> implements Iterator<B> {
+        private final Function<A, B> map;
+        private final Iterator<A> baseIterator;
+
+        public MapIterator(final Iterator<A> baseIterator, final Function<A, B> map) {
+            this.map = map;
+            this.baseIterator = baseIterator;
+        }
+
+        @Override
+        public boolean hasNext() {
+            return this.baseIterator.hasNext();
+        }
+
+        @Override
+        public B next() {
+            return this.map.apply(this.baseIterator.next());
+        }
+    }
+}
\ No newline at end of file


[14/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy
new file mode 100644
index 0000000..21c36cd
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyValueMapTest.groovy
@@ -0,0 +1,67 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyValueMapTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends ValueMapTest {
+        @Override
+        public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
+            g.V.valueMap
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
+            g.V.valueMap('name', 'age')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
+            g.V(v1Id).out('created').valueMap
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends ValueMapTest {
+        @Override
+        public Traversal<Vertex, Map<String, List>> get_g_V_valueMap() {
+            ComputerTestHelper.compute("g.V.valueMap", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, List>> get_g_V_valueMapXname_ageX() {
+            ComputerTestHelper.compute("g.V.valueMap('name', 'age')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, List<String>>> get_g_VX1X_outXcreatedX_valueMap(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out('created').valueMap", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy
new file mode 100644
index 0000000..2951c47
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyVertexTest.groovy
@@ -0,0 +1,293 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Direction
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyVertexTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends VertexTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V() {
+            g.V
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
+            g.V(v1Id).out
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
+            g.V(v2Id).in
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
+            g.V(v4Id).both
+        }
+
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E() {
+            g.E
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
+            g.V(v1Id).outE
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
+            g.V(v2Id).inE
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
+            g.V(v4Id).bothE
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
+            g.V(v4Id).bothE('created')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
+            g.V(v1Id).outE.inV
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
+            g.V(v2Id).inE.outV
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
+            g.V.outE.has('weight', 1.0d).outV
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
+            g.V.out.outE.inV.inE.inV.both.name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
+            g.V(v1Id).outE('knows').bothV.name
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
+            g.V(v1Id).out('knows')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
+            g.V(v1Id).out('knows', 'created')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
+            g.V(v1Id).outE('knows').inV()
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
+            g.V(v1Id).outE('knows', 'created').inV
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_out_out() {
+            g.V().out().out()
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
+            g.V(v1Id).out.out.out
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
+            g.V(v1Id).out.name
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
+            g.V(v1Id).outE.otherV
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
+            g.V(v4Id).bothE.otherV
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
+            g.V(v4Id).bothE.has('weight', Compare.lt, 1.0d).otherV
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
+            g.V(v1Id).to(Direction.OUT, 'knows');
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends VertexTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V() {
+            ComputerTestHelper.compute("g.V", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX2X_in(final Object v2Id) {
+            ComputerTestHelper.compute("g.V(${v2Id}).in", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_both(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).both", g);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E() {
+            ComputerTestHelper.compute("g.E", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outE(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX2X_inE(final Object v2Id) {
+            ComputerTestHelper.compute("g.V(${v2Id}).inE", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_bothE(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).bothE", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_bothEXcreatedX(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).bothE('created')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_inV(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE.inV", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX2X_inE_outV(final Object v2Id) {
+            ComputerTestHelper.compute("g.V(${v2Id}).inE.outV", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_outE_hasXweight_1X_outV() {
+            ComputerTestHelper.compute("g.V.outE.has('weight', 1.0d).outV", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_out_outE_inV_inE_inV_both_name() {
+            ComputerTestHelper.compute("g.V.out.outE.inV.inE.inV.both.name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_outEXknowsX_bothV_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').bothV.name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out('knows')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknows_createdX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out('knows', 'created')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknowsX_inV(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').inV()", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outEXknows_createdX_inV(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows', 'created').inV", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_out_out() {
+            ComputerTestHelper.compute("g.V().out().out()", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_out_out(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.out.out", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_otherV(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE.otherV", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_otherV(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).bothE.otherV", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_bothE_hasXweight_lt_1X_otherV(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).bothE.has('weight', Compare.lt, 1.0d).otherV", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_to_XOUT_knowsX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).to(Direction.OUT, 'knows')", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy
new file mode 100644
index 0000000..e22d6af
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyAggregateTest.groovy
@@ -0,0 +1,70 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAggregateTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends AggregateTest {
+
+        @Override
+        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_aggregateXxX_byXnameX_capXxX() {
+            g.V.aggregate('x').by('name').cap('x')
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
+            g.V.out.aggregate('a').path;
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends AggregateTest {
+
+        @Override
+        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_aggregateXxX_byXnameX_capXxX() {
+            ComputerTestHelper.compute("g.V.aggregate('x').by('name').cap('x')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_out_aggregateXaX_path() {
+            ComputerTestHelper.compute("g.V.out.aggregate('a').path", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy
new file mode 100644
index 0000000..cba9f10
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupCountTest.groovy
@@ -0,0 +1,126 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyGroupCountTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends GroupCountTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
+            g.V.out('created').groupCount.by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
+            g.V.out('created').groupCount('a').by('name').cap('a')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
+            g.V.out('created').name.groupCount
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
+            g.V.out('created').name.groupCount('a').cap('a')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
+            g.V.has('no').groupCount;
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
+            g.V.has('no').groupCount('a').cap('a');
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+            g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+            g.V.union(
+                    __.repeat(__.out).times(2).groupCount('m').by('lang'),
+                    __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends GroupCountTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCount_byXnameX() {
+            ComputerTestHelper.compute("g.V.out('created').groupCount.by('name')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_groupCountXaX_byXnameX_capXaX() {
+            ComputerTestHelper.compute("g.V.out('created').groupCount('a').by('name').cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCount() {
+            ComputerTestHelper.compute("g.V.out('created').name.groupCount", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_name_groupCountXaX_capXaX() {
+            ComputerTestHelper.compute("g.V.out('created').name.groupCount('a').cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCount() {
+            ComputerTestHelper.compute("g.V.has('no').groupCount", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Object, Long>> get_g_V_hasXnoX_groupCountXaX_capXaX() {
+            ComputerTestHelper.compute("g.V.has('no').groupCount('a').cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupCountXaX_byXnameXX_timesX2X_capXaX() {
+            ComputerTestHelper.compute("g.V.repeat(__.out.groupCount('a').by('name')).times(2).cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXoutX_timesX2X_groupCountXmX_byXlangXX__repeatXinX_timesX2X_groupCountXmX_byXnameXX_capXmX() {
+            ComputerTestHelper.compute("""
+            g.V.union(
+                    __.repeat(__.out).times(2).groupCount('m').by('lang'),
+                    __.repeat(__.in).times(2).groupCount('m').by('name')).cap('m')
+            """, g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
new file mode 100644
index 0000000..988ca17
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyGroupTest.groovy
@@ -0,0 +1,101 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyGroupTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends GroupTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
+            g.V.group.by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
+            g.V.group('a').by('name').cap('a')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+            g.V.has('lang').group('a').by('lang').by('name').out.cap('a')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
+            g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
+            g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
+            g.V.group.by(__.outE.count).by('name')
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends GroupTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_group_byXnameX() {
+            ComputerTestHelper.compute("g.V.group.by('name')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<Vertex>>> get_g_V_groupXaX_byXnameX_capXaX() {
+            ComputerTestHelper.compute("g.V.group('a').by('name').cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<String>>> get_g_V_hasXlangX_groupXaX_byXlangX_byXnameX_out_capXaX() {
+            ComputerTestHelper.compute("g.V.has('lang').group('a').by('lang').by('name').out.cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXlangX_group_byXlangX_byX1X_byXcountXlocalXX() {
+            ComputerTestHelper.compute("g.V.has('lang').group.by('lang').by(__.inject(1)).by(__.count(Scope.local))", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXout_groupXaX_byXnameX_by_byXcountXlocalXX_timesX2X_capXaX() {
+            ComputerTestHelper.compute("g.V.repeat(__.out.group('a').by('name').by.by(__.count(Scope.local))).times(2).cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Long, Collection<String>>> get_g_V_group_byXoutE_countX_byXnameX() {
+            ComputerTestHelper.compute("g.V.group.by(__.outE.count).by('name')", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy
new file mode 100644
index 0000000..e56f652
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy
@@ -0,0 +1,74 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyInjectTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends InjectTest {
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(final Object v1Id, final Object v2Id) {
+            g.V(v1Id).out.inject(g.V(v2Id).next()).name
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) {
+            g.V(v1Id).out().name.inject('daniel').as('a').map { it.length() }.path
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends InjectTest {
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_VX1X_out_injectXv2X_name() {
+            super.g_VX1X_out_injectXv2X_name()
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() {
+            super.g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path()
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_VX1X_out_injectXv2X_name(Object v1Id, Object v2Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Path> get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
new file mode 100644
index 0000000..41ca348
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
@@ -0,0 +1,93 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyProfileTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends ProfileTest {
+
+        @Override
+        Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
+            g.V.out.out.profile();
+        }
+
+        @Override
+        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
+            g.V.repeat(__.both()).times(3).profile();
+        }
+
+        @Override
+        Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+            g.V().has(__.in("created").count().is(1l)).values("name").profile();
+        }
+
+        @org.junit.Ignore
+        @Override
+        void g_V_sleep_sleep_profile() {
+        }
+
+        @Override
+        Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
+            return null
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends ProfileTest {
+
+        @Override
+        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_out_out_profile() {
+            ComputerTestHelper.compute("g.V.out.out.profile()", g);
+        }
+
+
+        @Override
+        public Traversal<Vertex, StandardTraversalMetrics> get_g_V_repeat_both_profile() {
+            ComputerTestHelper.compute("g.V.repeat(__.both()).times(3).profile()", g);
+        }
+
+        @Override
+        Traversal<Vertex, StandardTraversalMetrics> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+            ComputerTestHelper.compute(" g.V().has(__.in('created').count().is(1l)).values('name').profile()", g);
+        }
+
+        @Override
+        @org.junit.Ignore
+        void g_V_sleep_sleep_profile() {
+        }
+
+        @Override
+        Traversal<Vertex, StandardTraversalMetrics> get_g_V_sleep_sleep_profile() {
+            return null
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
new file mode 100644
index 0000000..1ccdb85
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySackTest.groovy
@@ -0,0 +1,72 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.structure.Operator.sum
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySackTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SackTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+            g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()
+        }
+
+        @Override
+        public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+            g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack
+        }
+
+        @Override
+        public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+            g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends SackTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_withSackX0X_outE_sackXsum_weightX_inV_sack_sum() {
+            ComputerTestHelper.compute("g.V().withSack(0.0f).outE.sack(sum, 'weight').inV.sack.sum()", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Float> get_g_V_withSackX0X_repeatXoutE_sackXsum_weightX_inVX_timesX2X_sack() {
+            ComputerTestHelper.compute("g.V.withSack(0.0f).repeat(__.outE.sack(sum, 'weight').inV).times(2).sack", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map> get_g_V_withSackXmap__map_cloneX_out_out_sackXmap_a_nameX_sack() {
+            ComputerTestHelper.compute("g.V.withSack { [:] } { m -> m.clone() }.out().out().sack { m, v -> m['a'] = v.name; m }.sack()", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
new file mode 100644
index 0000000..c717b61
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectCapTest.groovy
@@ -0,0 +1,64 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySideEffectCapTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SideEffectCapTest {
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+            g.V.has('age').groupCount('a').by('name').out.cap('a')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+            g.V.choose(__.has(T.label, 'person'),
+                    __.age.groupCount('a'),
+                    __.values("name").groupCount('b')).cap('a', 'b')
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends SideEffectCapTest {
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_hasXageX_groupCountXaX_byXnameX_out_capXaX() {
+            ComputerTestHelper.compute("g.V.has('age').groupCount('a').by('name').out.cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Map<Object, Long>>> get_g_V_chooseXlabel_person__age_groupCountXaX__name_groupCountXbXX_capXa_bX() {
+            ComputerTestHelper.compute("""
+            g.V.choose(__.has(T.label, 'person'),
+                    __.age.groupCount('a'),
+                    __.values("name").groupCount('b')).cap('a', 'b')
+            """, g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy
new file mode 100644
index 0000000..8e18716
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySideEffectTest.groovy
@@ -0,0 +1,56 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySideEffectTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SideEffectTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_sideEffectXstore_aX_name(final Object v1Id) {
+            g.V(v1Id).withSideEffect('a') { [] }.sideEffect {
+                it.sideEffects('a').clear();
+                it.sideEffects('a').add(it.get());
+            }.name;
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXincr_cX_name(final Object v1Id) {
+            g.V(v1Id).withSideEffect('c') { [0] }.out.sideEffect {
+                def temp = it.sideEffects('c')[0];
+                it.sideEffects('c').clear();
+                it.sideEffects('c').add(temp + 1);
+            }.name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_out_sideEffectXX_name(final Object v1Id) {
+            g.V(v1Id).out().sideEffect {}.name
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy
new file mode 100644
index 0000000..5e31723
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyStoreTest.groovy
@@ -0,0 +1,83 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyStoreTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends StoreTest {
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
+            g.V().store('a').by('name').out().cap('a');
+        }
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
+                final Object v1Id) {
+            g.V(v1Id).store('a').by('name').out().store('a').by('name').name.cap('a');
+        }
+
+        @Override
+        public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
+            g.V.withSideEffect('a') { [] as Set }.both.name.store('a').cap('a')
+        }
+
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
+            g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a');
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends StoreTest {
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXnameX_out_capXaX() {
+            ComputerTestHelper.compute("g.V().store('a').by('name').out().cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_VX1X_storeXaX_byXnameX_out_storeXaX_byXnameX_name_capXaX(
+                final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).store('a').by('name').out().store('a').by('name').name.cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Set<String>> get_g_V_withSideEffectXa_setX_both_name_storeXaX_capXaX() {
+            ComputerTestHelper.compute("g.V.withSideEffect('a'){[] as Set}.both.name.store('a').cap('a')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Collection> get_g_V_storeXaX_byXoutEXcreatedX_countX_out_out_storeXaX_byXinEXcreatedX_weight_sumX_capXaX() {
+            ComputerTestHelper.compute("g.V.store('a').by(__.outE('created').count).out.out.store('a').by(__.inE('created').weight.sum).cap('a')", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy
new file mode 100644
index 0000000..a7c00ee
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovySubgraphTest.groovy
@@ -0,0 +1,48 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Graph
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySubgraphTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SubgraphTest {
+
+        @Override
+        public Traversal<Vertex, Graph> get_g_V_withSideEffectXsgX_outEXknowsX_subgraphXsgX_name_capXsgX(
+                final Object v1Id, final Graph subgraph) {
+            g.V(v1Id).withSideEffect('sg') { subgraph }.outE('knows').subgraph('sg').name.cap('sg')
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_withSideEffectXsgX_repeatXbothEXcreatedX_subgraphXsgX_outVX_timesX5X_name_dedup(
+                final Graph subgraph) {
+            g.V.withSideEffect('sg') { subgraph }.repeat(__.bothE('created').subgraph('sg').outV).times(5).name.dedup
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy
new file mode 100644
index 0000000..5bd5bff
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyTreeTest.groovy
@@ -0,0 +1,109 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyTreeTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends TreeTest {
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
+            g.V.out.out.tree.by(T.id);
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
+            g.V.out.out.tree('a').by(T.id).cap('a');
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(final Object v1Id) {
+            g.V(v1Id).out.out.tree.by('name');
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(final Object v1Id) {
+            g.V(v1Id).out.out.tree('a').by('name').both.both.cap('a');
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
+            g.V.out.out.tree();
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
+            g.V.out.out.tree('a').cap('a');
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends TreeTest {
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_tree_byXidX() {
+            ComputerTestHelper.compute("g.V.out.out.tree.by(id)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_byXidX_capXaX() {
+            ComputerTestHelper.compute("g.V.out.out.tree('a').by(id).cap('a')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_tree() {
+            ComputerTestHelper.compute("g.V.out.out.tree()", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Tree> get_g_V_out_out_treeXaX_capXaX() {
+            ComputerTestHelper.compute("g.V.out.out.tree('a').cap('a')", g)
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_VX1X_out_out_tree_byXnameX() {
+
+        }
+
+        @Override
+        Traversal<Vertex, Tree> get_g_VX1X_out_out_tree_byXnameX(Object v1Id) {
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Tree> get_g_VX1X_out_out_treeXaX_byXnameX_both_both_capXaX(Object v1Id) {
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
index ba592c3..5378141 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/engine/GremlinExecutorPerformanceTest.java
@@ -27,7 +27,7 @@ import com.carrotsearch.junitbenchmarks.annotation.LabelType;
 import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
index 7488e6c..4be3f98 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GremlinGroovyScriptEngineOverGraphTest.java
@@ -25,8 +25,8 @@ import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.groovy.DefaultImportCustomizerProvider;
 import org.apache.tinkerpop.gremlin.groovy.NoImportCustomizerProvider;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.config.YamlConfiguration;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
index 57288bd..6279643 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
@@ -24,49 +24,49 @@ import org.apache.tinkerpop.gremlin.groovy.loaders.SugarLoader;
 import org.apache.tinkerpop.gremlin.groovy.util.SugarTestHelper;
 import org.apache.tinkerpop.gremlin.process.computer.GroovyGraphComputerTest;
 import org.apache.tinkerpop.gremlin.process.computer.ranking.PageRankVertexProgramTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyBranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyLocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyRepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyUnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyAndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyDedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyFilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyIsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyOrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyRangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyWhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyBackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyFoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyOrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyUnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyAggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyStoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyTreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyBranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyLocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyRepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyUnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyAndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyDedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyFilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyIsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyOrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyRangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyWhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyBackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyFoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyOrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyUnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyAggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyStoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyTreeTest;
 import org.junit.runners.model.InitializationError;
 import org.junit.runners.model.RunnerBuilder;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
index ebb7b40..56fbf6a 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
@@ -22,56 +22,56 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.GraphManager;
 import org.apache.tinkerpop.gremlin.groovy.loaders.SugarLoader;
 import org.apache.tinkerpop.gremlin.groovy.util.SugarTestHelper;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyBranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyLocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyRepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.GroovyUnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyAndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyCyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyDedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyExceptTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyFilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyHasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyIsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyOrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyRangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyRetainTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovySimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.GroovyWhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyAddEdgeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyAddVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyBackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyFoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyOrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyPropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovySumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyUnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyAggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyGroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySideEffectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyStoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovySubgraphTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyTreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyBranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyLocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyRepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.GroovyUnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyAndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyCyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyDedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyExceptTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyFilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyHasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyIsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyOrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyRangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyRetainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovySimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.GroovyWhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyAddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyAddVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyBackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyFoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyOrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyUnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyAggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyStoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyTreeTest;
 import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
 import org.junit.runners.model.InitializationError;
 import org.junit.runners.model.RunnerBuilder;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
index 3f20a2a..580c87d 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/StepLoader.groovy
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.groovy.function.GComparator
 import org.apache.tinkerpop.gremlin.groovy.function.GFunction
 import org.apache.tinkerpop.gremlin.groovy.function.GSupplier
 import org.apache.tinkerpop.gremlin.groovy.function.GUnaryOperator
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
index 6ebae15..41878a2 100644
--- a/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
+++ b/gremlin-groovy/src/main/groovy/org/apache/tinkerpop/gremlin/groovy/loaders/SugarLoader.groovy
@@ -18,11 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.groovy.loaders
 
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.Traverser
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper
 import org.apache.tinkerpop.gremlin.structure.*
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
index 0055aa4..da9b2a0 100644
--- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
+++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/AbstractImportCustomizerProvider.java
@@ -24,20 +24,20 @@ import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.algorithm.generator.AbstractGenerator;
 import org.apache.tinkerpop.gremlin.groovy.function.GFunction;
 import org.apache.tinkerpop.gremlin.groovy.loaders.GremlinLoader;
-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.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.clustering.peerpressure.PeerPressureVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.lambda.LambdaVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.util.metric.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Direction;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
index 87c7a61..9b55c4a 100644
--- a/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
+++ b/gremlin-server/src/main/java/org/apache/tinkerpop/gremlin/server/op/AbstractEvalOpProcessor.java
@@ -25,7 +25,7 @@ import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 import org.apache.tinkerpop.gremlin.groovy.engine.GremlinExecutor;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.server.Context;
 import org.apache.tinkerpop.gremlin.server.GremlinServer;
 import org.apache.tinkerpop.gremlin.server.OpProcessor;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
----------------------------------------------------------------------
diff --git a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
index 306f6d3..277e50e 100644
--- a/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
+++ b/gremlin-server/src/test/java/org/apache/tinkerpop/gremlin/server/GremlinServerIntegrateTest.java
@@ -24,14 +24,13 @@ import org.apache.tinkerpop.gremlin.driver.ResultSet;
 import org.apache.tinkerpop.gremlin.driver.Tokens;
 import org.apache.tinkerpop.gremlin.driver.exception.ResponseException;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
-import org.apache.tinkerpop.gremlin.driver.message.ResponseStatus;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
 import org.apache.tinkerpop.gremlin.driver.ser.Serializers;
 import org.apache.tinkerpop.gremlin.driver.simple.NioClient;
 import org.apache.tinkerpop.gremlin.driver.simple.SimpleClient;
 import org.apache.tinkerpop.gremlin.driver.simple.WebSocketClient;
 import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.server.channel.NioChannelizer;
 import org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor;
 import org.junit.Rule;


[28/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
new file mode 100644
index 0000000..ab364d8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/FilterStep.java
@@ -0,0 +1,45 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class FilterStep<S> extends AbstractStep<S, S> {
+
+    public FilterStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() {
+        while (true) {
+            final Traverser.Admin<S> traverser = this.starts.next();
+            if (this.filter(traverser)) {
+                return traverser;
+            }
+        }
+    }
+
+    protected abstract boolean filter(final Traverser.Admin<S> traverser);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
new file mode 100644
index 0000000..3efbe5b
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
@@ -0,0 +1,69 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class HasStep<S extends Element> extends FilterStep<S> implements HasContainerHolder {   // TODO: make final when graph strategies are fixed up
+
+    private final HasContainer hasContainer;
+
+    public HasStep(final Traversal.Admin traversal, final HasContainer hasContainer) {
+        super(traversal);
+        this.hasContainer = hasContainer;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        return this.hasContainer.test(traverser.get());
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.hasContainer);
+    }
+
+    @Override
+    public List<HasContainer> getHasContainers() {
+        return Collections.singletonList(this.hasContainer);
+    }
+
+    @Override
+    public void addHasContainer(final HasContainer hasContainer) {
+        throw new UnsupportedOperationException(this.getClass().getSimpleName() + " does not support adding new HasContainers");
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java
new file mode 100644
index 0000000..4cdfc8f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTraversalStep.java
@@ -0,0 +1,80 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+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.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class HasTraversalStep<S> extends AbstractStep<S, S> implements TraversalParent {
+
+    private Traversal.Admin<S, ?> hasTraversal;
+    private final boolean negate;
+
+    public HasTraversalStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> hasTraversal, final boolean negate) {
+        super(traversal);
+        this.negate = negate;
+        this.hasTraversal = this.integrateChild(hasTraversal);
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() throws NoSuchElementException {
+        while (true) {
+            final Traverser.Admin<S> start = this.starts.next();
+            if (TraversalUtil.test(start, this.hasTraversal) != this.negate)
+                return start;
+        }
+    }
+
+    @Override
+    public String toString() {
+        final String stepString = TraversalHelper.makeStepString(this, this.hasTraversal);
+        return this.negate ? stepString.replaceFirst("\\(", "(!") : stepString;
+    }
+
+    @Override
+    public List<Traversal<S, ?>> getLocalChildren() {
+        return Collections.singletonList(this.hasTraversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements();
+    }
+
+    @Override
+    public HasTraversalStep<S> clone() {
+        final HasTraversalStep<S> clone = (HasTraversalStep<S>) super.clone();
+        clone.hasTraversal = clone.integrateChild(this.hasTraversal.clone());
+        return clone;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
new file mode 100644
index 0000000..0f33178
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsStep.java
@@ -0,0 +1,66 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class IsStep<S> extends FilterStep<S> {
+
+    private final Object value;
+    private final BiPredicate<S, Object> biPredicate;
+
+    public IsStep(final Traversal.Admin traversal, final BiPredicate<S, Object> biPredicate, final Object value) {
+        super(traversal);
+        this.value = value;
+        this.biPredicate = biPredicate;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        return this.biPredicate.test(traverser.get(), this.value);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.biPredicate, this.value);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+
+    public Object getValue() {
+        return value;
+    }
+
+    public BiPredicate<S, Object> getPredicate() {
+        return biPredicate;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java
new file mode 100644
index 0000000..0036733
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/LambdaFilterStep.java
@@ -0,0 +1,52 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.function.Predicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaFilterStep<S> extends FilterStep<S> {
+
+    private final Predicate<Traverser<S>> predicate;
+
+    public LambdaFilterStep(final Traversal.Admin traversal, final Predicate<Traverser<S>> predicate) {
+        super(traversal);
+        this.predicate = predicate;
+    }
+
+    public Predicate<Traverser<S>> getPredicate() {
+        return predicate;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        return this.predicate.test(traverser);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this,this.predicate);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java
new file mode 100644
index 0000000..9f2dec8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrStep.java
@@ -0,0 +1,39 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class OrStep<S> extends ConjunctionStep<S> implements TraversalParent {
+
+    public OrStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... orTraversals) {
+        super(traversal, orTraversals);
+
+    }
+
+    public static final class OrMarker<S> extends ConjunctionMarker<S> {
+        public OrMarker(final Traversal.Admin traversal) {
+            super(traversal);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
new file mode 100644
index 0000000..72e92ef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -0,0 +1,113 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Ranging;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging {
+
+    private final long low;
+    private final long high;
+    private AtomicLong counter = new AtomicLong(0l);
+
+    public RangeGlobalStep(final Traversal.Admin traversal, final long low, final long high) {
+        super(traversal);
+        if (low != -1 && high != -1 && low > high) {
+            throw new IllegalArgumentException("Not a legal range: [" + low + ", " + high + ']');
+        }
+        this.low = low;
+        this.high = high;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        if (this.high != -1 && this.counter.get() >= this.high) {
+            throw FastNoSuchElementException.instance();
+        }
+
+        long avail = traverser.bulk();
+        if (this.counter.get() + avail <= this.low) {
+            // Will not surpass the low w/ this traverser. Skip and filter the whole thing.
+            this.counter.getAndAdd(avail);
+            return false;
+        }
+
+        // Skip for the low and trim for the high. Both can happen at once.
+
+        long toSkip = 0;
+        if (this.counter.get() < this.low) {
+            toSkip = this.low - this.counter.get();
+        }
+
+        long toTrim = 0;
+        if (this.high != -1 && this.counter.get() + avail >= this.high) {
+            toTrim = this.counter.get() + avail - this.high;
+        }
+
+        long toEmit = avail - toSkip - toTrim;
+        this.counter.getAndAdd(toSkip + toEmit);
+        traverser.asAdmin().setBulk(toEmit);
+
+        return true;
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.counter.set(0l);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.low, this.high);
+    }
+
+    public long getLowRange() {
+        return this.low;
+    }
+
+    public long getHighRange() {
+        return this.high;
+    }
+
+    @Override
+    public RangeGlobalStep<S> clone() {
+        final RangeGlobalStep<S> clone = (RangeGlobalStep<S>) super.clone();
+        clone.counter = new AtomicLong(0l);
+        return clone;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.BULK);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java
new file mode 100644
index 0000000..bc217d3
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainStep.java
@@ -0,0 +1,97 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class RetainStep<S> extends FilterStep<S> {
+
+    private final String sideEffectKeyOrPathLabel;
+    private final Collection<S> retainCollection;
+    private final S retainObject;
+    private final short choice;
+
+    public RetainStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
+        super(traversal);
+        this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
+        this.retainCollection = null;
+        this.retainObject = null;
+        this.choice = 0;
+    }
+
+    public RetainStep(final Traversal.Admin traversal, final Collection<S> retainCollection) {
+        super(traversal);
+        this.sideEffectKeyOrPathLabel = null;
+        this.retainCollection = retainCollection;
+        this.retainObject = null;
+        this.choice = 1;
+    }
+
+    public RetainStep(final Traversal.Admin traversal, final S retainObject) {
+        super(traversal);
+        this.sideEffectKeyOrPathLabel = null;
+        this.retainCollection = null;
+        this.retainObject = retainObject;
+        this.choice = 2;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        switch (this.choice) {
+            case 0: {
+                final Object retain = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
+                        traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
+                        traverser.path(this.sideEffectKeyOrPathLabel);
+                return retain instanceof Collection ?
+                        ((Collection) retain).contains(traverser.get()) :
+                        retain.equals(traverser.get());
+            }
+            case 1:
+                return this.retainCollection.contains(traverser.get());
+            default:
+                return this.retainObject.equals(traverser.get());
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return null == this.sideEffectKeyOrPathLabel ?
+                Collections.singleton(TraverserRequirement.OBJECT) :
+                Stream.of(TraverserRequirement.OBJECT,
+                        TraverserRequirement.SIDE_EFFECTS,
+                        TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java
new file mode 100644
index 0000000..5817f37
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleGlobalStep.java
@@ -0,0 +1,117 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
+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.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SampleGlobalStep<S> extends CollectingBarrierStep<S> implements TraversalParent {
+
+    private Traversal.Admin<S, Number> probabilityTraversal = new ConstantTraversal<>(1.0d);
+    private final int amountToSample;
+    private static final Random RANDOM = new Random();
+
+    public SampleGlobalStep(final Traversal.Admin traversal, final int amountToSample) {
+        super(traversal);
+        this.amountToSample = amountToSample;
+    }
+
+    @Override
+    public List<Traversal.Admin<S, Number>> getLocalChildren() {
+        return Collections.singletonList(this.probabilityTraversal);
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> probabilityTraversal) {
+        this.probabilityTraversal = this.integrateChild(probabilityTraversal);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.amountToSample, this.probabilityTraversal);
+    }
+
+    @Override
+    public void barrierConsumer(final TraverserSet<S> traverserSet) {
+        // return the entire traverser set if the set is smaller than the amount to sample
+        if (traverserSet.bulkSize() <= this.amountToSample)
+            return;
+        //////////////// else sample the set
+        double totalWeight = 0.0d;
+        for (final Traverser<S> s : traverserSet) {
+            totalWeight = totalWeight + TraversalUtil.apply(s.asAdmin(), this.probabilityTraversal).doubleValue() * s.bulk();
+        }
+        ///////
+        final TraverserSet<S> sampledSet = new TraverserSet<>();
+        int runningAmountToSample = 0;
+        while (runningAmountToSample < this.amountToSample) {
+            boolean reSample = false;
+            double runningWeight = 0.0d;
+            for (final Traverser.Admin<S> s : traverserSet) {
+                long sampleBulk = sampledSet.contains(s) ? sampledSet.get(s).bulk() : 0;
+                if (sampleBulk < s.bulk()) {
+                    final double currentWeight = TraversalUtil.apply(s, this.probabilityTraversal).doubleValue();
+                    for (int i = 0; i < (s.bulk() - sampleBulk); i++) {
+                        runningWeight = runningWeight + currentWeight;
+                        if (RANDOM.nextDouble() <= (runningWeight / totalWeight)) {
+                            final Traverser.Admin<S> split = s.asAdmin().split();
+                            split.asAdmin().setBulk(1l);
+                            sampledSet.add(split);
+                            runningAmountToSample++;
+                            totalWeight = totalWeight - currentWeight;
+                            reSample = true;
+                            break;
+                        }
+                    }
+                    if (reSample || (runningAmountToSample >= this.amountToSample))
+                        break;
+                }
+            }
+        }
+        traverserSet.clear();
+        traverserSet.addAll(sampledSet);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.BULK);
+    }
+
+    @Override
+    public SampleGlobalStep<S> clone() {
+        final SampleGlobalStep<S> clone = (SampleGlobalStep<S>) super.clone();
+        clone.probabilityTraversal = clone.integrateChild(this.probabilityTraversal.clone());
+        return clone;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
new file mode 100644
index 0000000..5789803
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathStep.java
@@ -0,0 +1,47 @@
+/*
+ * 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.filter;
+
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SimplePathStep<S> extends FilterStep<S> {
+
+    public SimplePathStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        return traverser.path().isSimple();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.PATH);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java
new file mode 100644
index 0000000..c0e5f28
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TimeLimitStep.java
@@ -0,0 +1,80 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Randall Barnhart (random pi)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public final class TimeLimitStep<S> extends FilterStep<S> {
+
+    private AtomicLong startTime = new AtomicLong(-1);
+    private final long timeLimit;
+    private AtomicBoolean timedOut = new AtomicBoolean(false);
+
+
+    public TimeLimitStep(final Traversal.Admin traversal, final long timeLimit) {
+        super(traversal);
+        this.timeLimit = timeLimit;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        if (this.startTime.get() == -1l)
+            this.startTime.set(System.currentTimeMillis());
+        if ((System.currentTimeMillis() - this.startTime.get()) >= this.timeLimit) {
+            this.timedOut.set(true);
+            throw FastNoSuchElementException.instance();
+        }
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.timeLimit);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.startTime.set(-1l);
+        this.timedOut.set(false);
+    }
+
+    public boolean getTimedOut() {
+        return this.timedOut.get();
+    }
+
+    @Override
+    public TimeLimitStep<S> clone() {
+        final TimeLimitStep<S> clone = (TimeLimitStep<S>) super.clone();
+        clone.timedOut = new AtomicBoolean(this.timedOut.get());
+        clone.startTime = new AtomicLong(this.startTime.get());
+        return clone;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
new file mode 100644
index 0000000..14c541a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereStep.java
@@ -0,0 +1,132 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MarkerIdentityStep;
+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.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.BiPredicate;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class WhereStep<E> extends FilterStep<Map<String, E>> implements TraversalParent {
+
+    private final String firstKey;
+    private final String secondKey;
+    private final BiPredicate biPredicate;
+    private Traversal.Admin constraint;
+
+
+    public WhereStep(final Traversal.Admin traversal, final String firstKey, final String secondKey, final BiPredicate<E, E> biPredicate) {
+        super(traversal);
+        this.firstKey = firstKey;
+        this.secondKey = secondKey;
+        this.biPredicate = biPredicate;
+        this.constraint = null;
+    }
+
+    public WhereStep(final Traversal.Admin traversal, final Traversal.Admin constraint) {
+        super(traversal);
+        this.firstKey = null;
+        this.secondKey = null;
+        this.biPredicate = null;
+        this.constraint = this.integrateChild(constraint);
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<Map<String, E>> traverser) {
+        if (null == this.constraint) {
+            final Map<String, E> map = traverser.get();
+            if (!map.containsKey(this.firstKey))
+                throw new IllegalArgumentException("The provided key is not in the current map: " + this.firstKey);
+            if (!map.containsKey(this.secondKey))
+                throw new IllegalArgumentException("The provided key is not in the current map: " + this.secondKey);
+            return this.biPredicate.test(map.get(this.firstKey), map.get(this.secondKey));
+        } else {
+            final Step<?, ?> startStep = this.constraint.getStartStep();
+            Step<?, ?> endStep = this.constraint.getEndStep();
+            if (endStep instanceof MarkerIdentityStep) // DAH!
+                endStep = endStep.getPreviousStep();
+
+            final Map<String, E> map = traverser.get();
+            if (!map.containsKey(startStep.getLabel().get()))
+                throw new IllegalArgumentException("The provided key is not in the current map: " + startStep.getLabel().get());
+            final Object startObject = map.get(startStep.getLabel().get());
+            final Object endObject;
+            if (endStep.getLabel().isPresent()) {
+                if (!map.containsKey(endStep.getLabel().get()))
+                    throw new IllegalArgumentException("The provided key is not in the current map: " + endStep.getLabel().get());
+                endObject = map.get(endStep.getLabel().get());
+            } else
+                endObject = null;
+
+            startStep.addStart(this.getTraversal().asAdmin().getTraverserGenerator().generate(startObject, (Step) startStep, traverser.bulk()));
+            if (null == endObject) {
+                if (this.constraint.hasNext()) {
+                    this.constraint.reset();
+                    return true;
+                } else {
+                    return false;
+                }
+
+            } else {
+                while (this.constraint.hasNext()) {
+                    if (this.constraint.next().equals(endObject)) {
+                        this.constraint.reset();
+                        return true;
+                    }
+                }
+                return false;
+            }
+        }
+    }
+
+    @Override
+    public List<Traversal.Admin> getLocalChildren() {
+        return null == this.constraint ? Collections.emptyList() : Collections.singletonList(this.constraint);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.firstKey, this.biPredicate, this.secondKey, this.constraint);
+    }
+
+    @Override
+    public WhereStep<E> clone() {
+        final WhereStep<E> clone = (WhereStep<E>) super.clone();
+        if (null != this.constraint)
+            clone.constraint = clone.integrateChild(this.constraint.clone());
+        return clone;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java
new file mode 100644
index 0000000..9671f34
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeByPathStep.java
@@ -0,0 +1,95 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddEdgeByPathStep extends MapStep<Vertex, Edge> implements Mutating {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.PATH,
+            TraverserRequirement.OBJECT
+    );
+
+    // TODO: Weight key based on Traverser.getCount() ?
+
+    private final Direction direction;
+    private final String edgeLabel;
+    private final String stepLabel;
+    private final Object[] keyValues;
+
+    public AddEdgeByPathStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final String stepLabel, final Object... keyValues) {
+        super(traversal);
+        this.direction = direction;
+        if (this.direction.equals(Direction.BOTH))
+            throw new IllegalArgumentException("Only in- and out- directions are supported by " + AddEdgeByPathStep.class.getSimpleName());
+        this.edgeLabel = edgeLabel;
+        this.stepLabel = stepLabel;
+        this.keyValues = keyValues;
+    }
+
+    public Direction getDirection() {
+        return direction;
+    }
+
+    public String getEdgeLabel() {
+        return edgeLabel;
+    }
+
+    public String getStepLabel() {
+        return stepLabel;
+    }
+
+    public Object[] getKeyValues() {
+        return keyValues;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.direction.name(), this.edgeLabel, this.stepLabel);
+    }
+
+    @Override
+    protected Edge map(Traverser.Admin<Vertex> traverser) {
+        final Vertex currentVertex = traverser.get();
+        final Vertex otherVertex = traverser.path().get(this.stepLabel);
+        if (this.direction.equals(Direction.IN))
+            return otherVertex.addEdge(this.edgeLabel, currentVertex, this.keyValues);
+        else
+            return currentVertex.addEdge(this.edgeLabel, otherVertex, this.keyValues);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
new file mode 100644
index 0000000..e96c65f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
@@ -0,0 +1,86 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddEdgeStep extends FlatMapStep<Vertex, Edge> implements Mutating {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+
+    private final String edgeLabel;
+    private final Object[] keyValues;
+    private final List<Vertex> vertices;
+    private final Direction direction;
+
+    public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Vertex vertex, final Object... keyValues) {
+        this(traversal, direction, edgeLabel, IteratorUtils.of(vertex), keyValues);
+    }
+
+    public AddEdgeStep(final Traversal.Admin traversal, final Direction direction, final String edgeLabel, final Iterator<Vertex> vertices, final Object... keyValues) {
+        super(traversal);
+        this.direction = direction;
+        this.edgeLabel = edgeLabel;
+        this.vertices = IteratorUtils.list(vertices);
+        this.keyValues = keyValues;
+    }
+
+    public Direction getDirection() {
+        return direction;
+    }
+
+    public String getEdgeLabel() {
+        return edgeLabel;
+    }
+
+    public Object[] getKeyValues() {
+        return keyValues;
+    }
+
+    public List<Vertex> getVertices() {
+        return vertices;
+    }
+
+    @Override
+    protected Iterator<Edge> flatMap(final Traverser.Admin<Vertex> traverser) {
+        return IteratorUtils.map(this.vertices.iterator(), this.direction.equals(Direction.OUT) ?
+                vertex -> traverser.get().addEdge(this.edgeLabel, vertex, this.keyValues) :
+                vertex -> vertex.addEdge(this.edgeLabel, traverser.get(), this.keyValues));
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
new file mode 100644
index 0000000..2f90ea1
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java
@@ -0,0 +1,53 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddVertexStartStep extends AbstractStep<Vertex, Vertex> implements Mutating {
+
+    private final Object[] keyValues;
+    private boolean first = true;
+
+    public AddVertexStartStep(final Traversal.Admin traversal, final Object... keyValues) {
+        super(traversal);
+        this.keyValues = keyValues;
+    }
+
+    public Object[] getKeyValues() {
+        return keyValues;
+    }
+
+    @Override
+    protected Traverser<Vertex> processNextStart() {
+        if (this.first) {
+            this.first = false;
+            return this.getTraversal().getTraverserGenerator().generate(this.getTraversal().getGraph().get().addVertex(this.keyValues), this, 1l);
+        } else
+            throw FastNoSuchElementException.instance();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
new file mode 100644
index 0000000..0632f87
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java
@@ -0,0 +1,49 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddVertexStep<S> extends MapStep<S, Vertex> implements Mutating {
+
+    private final Object[] keyValues;
+    private final transient Graph graph;
+
+    public AddVertexStep(final Traversal.Admin traversal, final Object... keyValues) {
+        super(traversal);
+        this.keyValues = keyValues;
+        this.graph = this.getTraversal().getGraph().get();
+    }
+
+    public Object[] getKeyValues() {
+        return keyValues;
+    }
+
+    @Override
+    protected Vertex map(final Traverser.Admin<S> traverser) {
+        return this.graph.addVertex(this.keyValues);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java
new file mode 100644
index 0000000..9d683df
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackStep.java
@@ -0,0 +1,64 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class BackStep<S, E> extends MapStep<S, E> implements EngineDependent {
+
+    private final String stepLabel;
+    private boolean requiresPaths = false;
+
+    public BackStep(final Traversal.Admin traversal, final String stepLabel) {
+        super(traversal);
+        this.stepLabel = stepLabel;
+    }
+
+    @Override
+    protected E map(final Traverser.Admin<S> traverser) {
+        return traverser.path(this.stepLabel);
+    }
+
+    @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        this.requiresPaths = traversalEngine.isComputer();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        //return this.requiresPaths ? Collections.singleton(TraverserRequirement.PATH) : Collections.singleton(TraverserRequirement.PATH_ACCESS);
+        return Collections.singleton(TraverserRequirement.PATH); // TODO: if the traversal isn't nested, path access works
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.stepLabel);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java
new file mode 100644
index 0000000..a0a8d7f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceStep.java
@@ -0,0 +1,86 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+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.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class CoalesceStep<S, E> extends FlatMapStep<S, E> implements TraversalParent {
+
+    private List<Traversal.Admin<S, E>> coalesceTraversals;
+
+    @SafeVarargs
+    public CoalesceStep(final Traversal.Admin traversal, final Traversal.Admin<S, E>... coalesceTraversals) {
+        super(traversal);
+        this.coalesceTraversals = Arrays.asList(coalesceTraversals);
+        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
+            this.integrateChild(conjunctionTraversal);
+        }
+    }
+
+    @Override
+    protected Iterator<E> flatMap(final Traverser.Admin<S> traverser) {
+        for (final Traversal.Admin<S, E> coalesceTraversal : this.coalesceTraversals) {
+            coalesceTraversal.reset();
+            coalesceTraversal.addStart(traverser.asAdmin().split());
+            if (coalesceTraversal.hasNext())
+                return coalesceTraversal;
+        }
+        return EmptyIterator.instance();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements();
+    }
+
+    @Override
+    public List<Traversal.Admin<S, E>> getLocalChildren() {
+        return Collections.unmodifiableList(this.coalesceTraversals);
+    }
+
+    @Override
+    public CoalesceStep<S, E> clone() {
+        final CoalesceStep<S, E> clone = (CoalesceStep<S, E>) super.clone();
+        clone.coalesceTraversals = new ArrayList<>();
+        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.coalesceTraversals) {
+            clone.coalesceTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
+        }
+        return clone;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.coalesceTraversals);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
new file mode 100644
index 0000000..cb7ede4
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountGlobalStep.java
@@ -0,0 +1,134 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.io.Serializable;
+import java.util.EnumSet;
+import java.util.Iterator;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class CountGlobalStep<S> extends ReducingBarrierStep<S, Long> implements MapReducer {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.BULK);
+
+    public CountGlobalStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.setSeedSupplier(new ConstantSupplier<>(0L));
+        this.setBiFunction(CountBiFunction.<S>instance());
+    }
+
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> getMapReduce() {
+        return CountGlobalMapReduce.instance();
+    }
+
+    ///////////
+
+    private static class CountBiFunction<S> implements BiFunction<Long, Traverser<S>, Long>, Serializable {
+
+        private static final CountBiFunction INSTANCE = new CountBiFunction();
+
+        private CountBiFunction() {
+
+        }
+
+        @Override
+        public Long apply(final Long mutatingSeed, final Traverser<S> traverser) {
+            return mutatingSeed + traverser.bulk();
+        }
+
+        public final static <S> CountBiFunction<S> instance() {
+            return INSTANCE;
+        }
+    }
+
+    ///////////
+
+    private static class CountGlobalMapReduce extends StaticMapReduce<MapReduce.NullObject, Long, MapReduce.NullObject, Long, Long> {
+
+        private static CountGlobalMapReduce INSTANCE = new CountGlobalMapReduce();
+
+        private CountGlobalMapReduce() {
+
+        }
+
+        @Override
+        public boolean doStage(final MapReduce.Stage stage) {
+            return true;
+        }
+
+        @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())));
+        }
+
+        @Override
+        public void combine(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
+            this.reduce(key, values, emitter);
+        }
+
+        @Override
+        public void reduce(final NullObject key, final Iterator<Long> values, final ReduceEmitter<NullObject, Long> emitter) {
+            long count = 0l;
+            while (values.hasNext()) {
+                count = count + values.next();
+            }
+            emitter.emit(count);
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return REDUCING;
+        }
+
+        @Override
+        public Long generateFinalResult(final Iterator<KeyValue<NullObject, Long>> keyValues) {
+            return keyValues.hasNext() ? keyValues.next().getValue() : 0L;
+        }
+
+        public static final CountGlobalMapReduce instance() {
+            return INSTANCE;
+        }
+
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
new file mode 100644
index 0000000..8c6dc9d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountLocalStep.java
@@ -0,0 +1,51 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class CountLocalStep<S> extends MapStep<S, Long> {
+
+    public CountLocalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Long map(final Traverser.Admin<S> traverser) {
+        final S item = traverser.get();
+        return (item instanceof Collection) ? ((Collection) item).size()
+                : (item instanceof Map) ? ((Map) item).size() : 1L;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java
new file mode 100644
index 0000000..59c66c7
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DedupLocalStep.java
@@ -0,0 +1,51 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.LinkedHashSet;
+import java.util.Set;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public final class DedupLocalStep<E, S extends Iterable<E>> extends MapStep<S, Set<E>> {
+
+    public DedupLocalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Set<E> map(final Traverser.Admin<S> traverser) {
+        final Set<E> result = new LinkedHashSet<>();
+        for (final E item : traverser.get()) {
+            result.add(item);
+        }
+        return result;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java
new file mode 100644
index 0000000..411737c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeOtherVertexStep.java
@@ -0,0 +1,58 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EdgeOtherVertexStep extends MapStep<Edge, Vertex> {
+
+    public EdgeOtherVertexStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Vertex map(final Traverser.Admin<Edge> traverser) {
+        final List<Object> objects = traverser.path().objects();
+        for (int i = objects.size() - 2; i >= 0; i--) {
+            if (objects.get(i) instanceof Vertex) {
+                return ElementHelper.areEqual((Vertex) objects.get(i), traverser.get().outVertex()) ?
+                        traverser.get().inVertex() :
+                        traverser.get().outVertex();
+            }
+        }
+        throw new IllegalStateException("The path history of the traverser does not contain a previous vertex: " + traverser.path());
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.PATH);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java
new file mode 100644
index 0000000..4783e25
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/EdgeVertexStep.java
@@ -0,0 +1,67 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EdgeVertexStep extends FlatMapStep<Edge, Vertex> {
+
+    private Direction direction;
+
+    public EdgeVertexStep(final Traversal.Admin traversal, final Direction direction) {
+        super(traversal);
+        this.direction = direction;
+    }
+
+    @Override
+    protected Iterator<Vertex> flatMap(final Traverser.Admin<Edge> traverser) {
+        return traverser.get().vertices(this.direction);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.direction);
+    }
+
+    public Direction getDirection() {
+        return this.direction;
+    }
+
+    public void reverseDirection() {
+        this.direction = this.direction.opposite();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.OBJECT);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java
new file mode 100644
index 0000000..eb111c8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FlatMapStep.java
@@ -0,0 +1,59 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.Iterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class FlatMapStep<S, E> extends AbstractStep<S, E> {
+
+    private Traverser.Admin<S> head = null;
+    private Iterator<E> iterator = EmptyIterator.instance();
+
+    public FlatMapStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<E> processNextStart() {
+        while (true) {
+            if (this.iterator.hasNext()) {
+                return this.head.split(this.iterator.next(), this);
+            } else {
+                this.head = this.starts.next();
+                this.iterator = this.flatMap(this.head);
+            }
+        }
+    }
+
+    protected abstract Iterator<E> flatMap(final Traverser.Admin<S> traverser);
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.iterator = EmptyIterator.instance();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
new file mode 100644
index 0000000..27580a9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldStep.java
@@ -0,0 +1,93 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.function.ArrayListSupplier;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.BiFunction;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class FoldStep<S, E> extends ReducingBarrierStep<S, E> {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+
+    public FoldStep(final Traversal.Admin traversal) {
+        this(traversal, (Supplier) ArrayListSupplier.instance(), (BiFunction) ArrayListBiFunction.instance());
+    }
+
+    public FoldStep(final Traversal.Admin traversal, final Supplier<E> seed, final BiFunction<E, S, E> foldFunction) {
+        super(traversal);
+        this.setSeedSupplier(seed);
+        this.setBiFunction(new FoldBiFunction<>(foldFunction));
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+
+    /////////
+
+    private static class ArrayListBiFunction<S> implements BiFunction<ArrayList<S>, S, ArrayList<S>>, Serializable {
+
+        private static final ArrayListBiFunction INSTANCE = new ArrayListBiFunction();
+
+        private ArrayListBiFunction() {
+
+        }
+
+        @Override
+        public ArrayList<S> apply(final ArrayList<S> mutatingSeed, final S traverser) {
+            mutatingSeed.add(traverser);
+            return mutatingSeed;
+        }
+
+        public final static <S> ArrayListBiFunction<S> instance() {
+            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());
+        }
+
+    }
+}


[19/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
index aa9b8b4..fbbcb4a 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/structure/util/ElementHelperTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.structure.util;
 
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
index e7df760..a6a20f5 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/ArrayIteratorTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.junit.Test;
 
 import java.util.Iterator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
index ffed272..321f201 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/DoubleIteratorTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.junit.Test;
 
 import java.util.Iterator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
index 341795e..6ed1e90 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/EmptyIteratorTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.junit.Test;
 
 import static org.junit.Assert.assertFalse;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
index 1230934..1ee3c5c 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/MultiIteratorTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.junit.Test;
 
 import java.util.ArrayList;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
index 7e5726e..5677fec 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/util/iterator/SingleIteratorTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.util.iterator;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.junit.Test;
 
 import java.util.Iterator;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
index a310096..67594e7 100644
--- a/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
+++ b/gremlin-driver/src/main/java/org/apache/tinkerpop/gremlin/driver/message/ResponseStatusCode.java
@@ -59,7 +59,7 @@ public enum ResponseStatusCode {
     SERVER_ERROR(500),
 
     /**
-     * The remote {@link org.apache.tinkerpop.gremlin.process.Traversal} submitted for processing evaluated in on the
+     * The remote {@link org.apache.tinkerpop.gremlin.process.traversal.Traversal} submitted for processing evaluated in on the
      * server with errors and could not be processed.
      */
     SERVER_ERROR_TRAVERSAL_EVALUATION(596),

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
index 8d481fc..1403c98 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/GryoMessageSerializerV1D0Test.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.driver.ser;
 import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
index a385cb5..85c669e 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerGremlinV1d0Test.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.driver.ser;
 import org.apache.tinkerpop.gremlin.driver.MessageSerializer;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
----------------------------------------------------------------------
diff --git a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
index b50a18d..15eb158 100644
--- a/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
+++ b/gremlin-driver/src/test/java/org/apache/tinkerpop/gremlin/driver/ser/JsonMessageSerializerV1d0Test.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.driver.ser;
 import org.apache.tinkerpop.gremlin.driver.message.RequestMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseMessage;
 import org.apache.tinkerpop.gremlin.driver.message.ResponseStatusCode;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Compare;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy
deleted file mode 100644
index 1414a67..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/ComputerTestHelper.groovy
+++ /dev/null
@@ -1,45 +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
-
-import org.apache.tinkerpop.gremlin.process.computer.ComputerResult
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource
-import org.apache.tinkerpop.gremlin.structure.Graph
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class ComputerTestHelper {
-
-    public static final Traversal compute(
-            final Graph graph,
-            final TraversalSource.Builder builder,
-            final String scriptEngineName,
-            final String traversalScript) {
-
-        final TraversalVertexProgram program = TraversalVertexProgram.build().traversal(graph.getClass(), builder, scriptEngineName, traversalScript).create();
-        final ComputerResult result = builder.create(graph).getGraphComputer().get().program(program).submit().get();
-        return program.computerResultTraversal(result);
-    }
-
-    public static final Traversal compute(final String script, final GraphTraversalSource g) {
-        return ComputerTestHelper.compute(g.getGraph().get(), g.asBuilder(), "gremlin-groovy", script);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy
new file mode 100644
index 0000000..f62ad8c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/computer/ComputerTestHelper.groovy
@@ -0,0 +1,46 @@
+/*
+ * 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.computer
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource
+import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
+import org.apache.tinkerpop.gremlin.structure.Graph
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class ComputerTestHelper {
+
+    public static final Traversal compute(
+            final Graph graph,
+            final TraversalSource.Builder builder,
+            final String scriptEngineName,
+            final String traversalScript) {
+
+        final TraversalVertexProgram program = TraversalVertexProgram.build().traversal(graph.getClass(), builder, scriptEngineName, traversalScript).create();
+        final ComputerResult result = builder.create(graph).getGraphComputer().get().program(program).submit().get();
+        return program.computerResultTraversal(result);
+    }
+
+    public static final Traversal compute(final String script, final GraphTraversalSource g) {
+        return ComputerTestHelper.compute(g.getGraph().get(), g.asBuilder(), "gremlin-groovy", script);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy
deleted file mode 100644
index 926fdeb..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyBranchTest.groovy
+++ /dev/null
@@ -1,80 +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.branch
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyBranchTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends BranchTest {
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
-            g.V.branch(__.label.is('person').count)
-                    .option(1L, __.age)
-                    .option(0L, __.lang)
-                    .option(0L, __.name)
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
-            g.V.branch(__.label)
-                    .option('person', __.age)
-                    .option('software', __.lang)
-                    .option('software', __.name);
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends BranchTest {
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
-            super.g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
-            ComputerTestHelper.compute("g.V.branch(__.label.is('person').count).option(1L, __.age).option(0L, __.lang).option(0L,__.name)", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
-            ComputerTestHelper.compute("""
-            g.V.branch(__.label)
-                    .option('person', __.age)
-                    .option('software', __.lang)
-                    .option('software', __.name)
-            """, g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy
deleted file mode 100644
index 4f44727..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyChooseTest.groovy
+++ /dev/null
@@ -1,51 +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.branch
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class GroovyChooseTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends ChooseTest {
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
-            g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends ChooseTest {
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
-            ComputerTestHelper.compute("g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy
deleted file mode 100644
index cf41776..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyLocalTest.groovy
+++ /dev/null
@@ -1,146 +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.branch
-
-import org.apache.tinkerpop.gremlin.process.T
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalTest
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Order
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyLocalTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends LocalTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
-            g.V.local(__.properties('location').order.by(T.value, Order.incr).limit(2)).value
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
-            g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
-            g.V.local(__.outE.count());
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
-            g.V(v1Id).local(__.outE('knows').limit(1)).inV.name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
-            g.V().local(__.bothE('created').limit(1)).otherV.name
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
-            g.V(v4Id).local(__.bothE('created').limit(1))
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
-            g.V(v4Id).local(__.bothE('knows', 'created').limit(1))
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
-            g.V(v4Id).local(__.bothE.limit(1)).otherV.name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
-            g.V(v4Id).local(__.bothE.limit(2).otherV).name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
-            g.V().inE('knows').local(__.limit(2).outV).name
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends LocalTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
-            ComputerTestHelper.compute("g.V.local(__.properties('location').order.by(T.value,Order.incr).limit(2)).value", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
-            ComputerTestHelper.compute("g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
-            ComputerTestHelper.compute("g.V.local(__.outE.count())", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).local(__.outE('knows').limit(1)).inV.name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
-            ComputerTestHelper.compute("g.V().local(__.bothE('created').limit(1)).otherV.name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('created').limit(1))", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('knows', 'created').limit(1))", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(1)).otherV.name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
-            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(2)).otherV.name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
-            ComputerTestHelper.compute("g.V().local(__.inE('knows').limit(2).outV).name", g);
-        }
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy
deleted file mode 100644
index e5bf7df..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyRepeatTest.groovy
+++ /dev/null
@@ -1,134 +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.branch
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.Path
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyRepeatTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends RepeatTest {
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
-            g.V.repeat(__.out).times(2).emit.path
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
-            g.V.repeat(__.out).times(2).repeat(__.in).times(2).name
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
-            g.V.repeat(__.out).times(2)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
-            g.V.repeat(__.out).times(2).emit;
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
-            g.V(v1Id).times(2).repeat(__.out).name
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
-            g.V.emit.repeat(__.out).times(2).path
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
-            g.V.emit.times(2).repeat(__.out).path
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
-            g.V(v1Id).emit(has(T.label, 'person')).repeat(__.out).name
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
-            g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends RepeatTest {
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
-            ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit.path", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
-            ComputerTestHelper.compute("g.V.repeat(__.out).times(2).repeat(__.in).times(2).name", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
-            ComputerTestHelper.compute("g.V.repeat(__.out).times(2)", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
-            ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).times(2).repeat(__.out).name", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
-            ComputerTestHelper.compute("g.V.emit.repeat(__.out).times(2).path", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
-            ComputerTestHelper.compute("g.V.emit.times(2).repeat(__.out).path", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).emit(has(T.label, 'person')).repeat(__.out).name", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
-            ComputerTestHelper.compute("g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')", g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy
deleted file mode 100644
index 12d125d..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/GroovyUnionTest.groovy
+++ /dev/null
@@ -1,111 +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.branch
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyUnionTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends UnionTest {
-
-        public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
-            g.V.union(__.out, __.in).name
-        }
-
-        public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
-            g.V(v1Id).union(repeat(__.out).times(2), __.out).name
-        }
-
-        public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
-            g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)
-        }
-
-        public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
-            g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount
-        }
-
-        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
-            g.V.union(
-                    repeat(union(
-                            out('created'),
-                            __.in('created'))).times(2),
-                    repeat(union(
-                            __.in('created'),
-                            out('created'))).times(2)).label.groupCount()
-        }
-
-        @Override
-        public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
-                final Object v1Id, final Object v2Id) {
-            g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
-        }
-
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends UnionTest {
-
-        public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
-            ComputerTestHelper.compute("g.V.union(__.out, __.in).name", g)
-        }
-
-        public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).union(repeat(__.out).times(2), __.out).name", g)
-        }
-
-        public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
-            ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)", g)
-        }
-
-        public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
-            ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount", g)
-        }
-
-        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
-            ComputerTestHelper.compute("""
-            g.V.union(
-                    repeat(union(
-                            out('created'),
-                            __.in('created'))).times(2),
-                    repeat(union(
-                            __.in('created'),
-                            out('created'))).times(2)).label.groupCount()
-           """, g)
-        }
-
-        @Override
-        public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
-                final Object v1Id, final Object v2Id) {
-            g.engine(StandardTraversalEngine.INSTANCE);
-            g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy
deleted file mode 100644
index 79ebbda..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyAndTest.groovy
+++ /dev/null
@@ -1,66 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.step.filter.AndTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.has
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyAndTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends AndTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
-            g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
-            g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends AndTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
-            ComputerTestHelper.compute("g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
-            ComputerTestHelper.compute("g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name", g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy
deleted file mode 100644
index c2d1caf..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCoinTest.groovy
+++ /dev/null
@@ -1,60 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyCoinTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends CoinTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
-            g.V.coin(1.0f)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
-            g.V.coin(0.0f)
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends CoinTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
-            ComputerTestHelper.compute("g.V.coin(1.0f)", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
-            ComputerTestHelper.compute("g.V.coin(0.0f)", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy
deleted file mode 100644
index 3084cc3..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyCyclicPathTest.groovy
+++ /dev/null
@@ -1,61 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.Path
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyCyclicPathTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends CyclicPathTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
-            g.V(v1Id).out('created').in('created').cyclicPath
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
-            g.V(v1Id).out('created').in('created').cyclicPath.path
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends CyclicPathTest {
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1) {
-            ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath", g);
-        }
-
-        @Override
-        Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1) {
-            ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath().path()", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 51c1c27..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyDedupTest.groovy
+++ /dev/null
@@ -1,100 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.*
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.dedup
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyDedupTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends DedupTest {
-        @Override
-        public Traversal<Vertex, String> get_g_V_both_dedup_name() {
-            g.V.both.dedup.name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
-            g.V.both.has(T.label, 'software').dedup.by('lang').name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
-            g.V().both().properties('name').order.by { a, b -> a.value() <=> b.value() }.dedup.value
-        }
-
-        @Override
-        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))
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends DedupTest {
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_both_dedup_name() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
-        }
-
-        @Override
-        @Test
-        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
-        public void g_V_both_name_orderXa_bX_dedup() {
-        }
-
-        @Override
-        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
-        Traversal<Vertex, String> get_g_V_both_dedup_name() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-
-        @Override
-        Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
-            // override with nothing until the test itself is supported
-            return null
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy
deleted file mode 100644
index 5110063..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyExceptTest.groovy
+++ /dev/null
@@ -1,115 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.Path
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyExceptTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends ExceptTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
-            g.V(v1Id).out.except(g.V(v2Id).next())
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
-            g.V(v1Id).out.aggregate('x').out.except('x')
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
-            g.V(v1Id).out('created').in('created').except(g.V(v1Id).next()).values('name')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
-            g.V.out.except(g.V.toList())
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
-            g.V.out.except([])
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
-                final Object v1Id) {
-            g.V(v1Id).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
-            g.V(v1Id).as('a').out('created').in('created').except('a').name
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends ExceptTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.except(g.V(${v2Id}).next())", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.except('x')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').except(g.V(${v1Id}).next()).values('name')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
-            ComputerTestHelper.compute("g.V.out.except(g.V.toList())", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
-            ComputerTestHelper.compute("g.V.out.except([])", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
-                final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').except('a').name", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy
deleted file mode 100644
index fe67966..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyFilterTest.groovy
+++ /dev/null
@@ -1,179 +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.filter
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.junit.Test
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyFilterTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends FilterTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
-            g.V.filter { false }
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
-            g.V.filter { true }
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
-            g.V.filter { it.property('lang').orElse("none") == 'java' }
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
-            g.V(v1Id).filter { it.age > 30 }
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
-            g.V(v1Id).out.filter { it.property('age').orElse(0) > 30 }
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
-            g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
-            g.E.filter { false }
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
-            g.E.filter { true }
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends FilterTest {
-
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_V_filterXfalseX() {
-            super.g_V_filterXfalseX();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_V_filterXtrueX() {
-            super.g_V_filterXtrueX();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_V_filterXlang_eq_javaX() {
-            super.g_V_filterXlang_eq_javaX();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_VX1X_filterXage_gt_30X() {
-            super.g_VX1X_filterXage_gt_30X();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_VX1X_out_filterXage_gt_30X() {
-            super.g_VX1X_out_filterXage_gt_30X();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
-            super.g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_E_filterXfalseX() {
-            super.g_E_filterXfalseX();
-        }
-
-        @Test
-        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
-        @Override
-        public void g_E_filterXtrueX() {
-            super.g_E_filterXtrueX();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
-            ComputerTestHelper.compute("g.V.filter { false }", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
-            ComputerTestHelper.compute("g.V.filter { true }", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
-            ComputerTestHelper.compute("g.V.filter { it.property('lang').orElse('none') == 'java' }", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).filter { it.age > 30 }", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).out.filter { it.property('age').orElse(0) > 30 }", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
-            ComputerTestHelper.compute("g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }", g);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
-            ComputerTestHelper.compute("g.E.filter { false }", g);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
-            ComputerTestHelper.compute("g.E.filter { true }", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy
deleted file mode 100644
index 4283e0b..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasNotTest.groovy
+++ /dev/null
@@ -1,68 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.__
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class GroovyHasNotTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends HasNotTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
-            g.V(v1Id).hasNot(propertyKey)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
-            g.V.hasNot(propertyKey)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
-            return g.V().hasNot(__.out('created')).values('name');
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends HasNotTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
-            ComputerTestHelper.compute("g.V(${v1Id}).hasNot('${propertyKey}')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
-            ComputerTestHelper.compute("g.V.hasNot('${propertyKey}')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
-            ComputerTestHelper.compute("return g.V().hasNot(__.out('created')).values('name')", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy
deleted file mode 100644
index a591901..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyHasTest.groovy
+++ /dev/null
@@ -1,191 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Edge
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyHasTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends HasTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
-            g.V.out('knows').has(__.out('created')).name
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
-            g.V(v1Id).has(key)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
-            g.V(v1Id).has('name', 'marko')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
-            g.V.has('name', 'marko')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
-            g.V.has('name', 'blah')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
-            g.V.has('blah')
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
-            g.V(v1Id).has('age', Compare.gt, 30)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
-            g.V(v1Id).out.hasId(v2Id)
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
-            g.V.has('age', Compare.gt, 30)
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
-            g.E(e7Id).hasLabel('knows')
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
-            g.E.hasLabel('knows')
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
-            g.E.hasLabel('uses', 'traverses')
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
-            g.V.hasLabel("person", "software", 'blah');
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
-            g.V.has('person', 'name', 'marko').age;
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
-            g.V(v1Id).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends HasTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
-            ComputerTestHelper.compute("g.V.out('knows').has(__.out('created')).name", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
-            ComputerTestHelper.compute("g.V(${v1Id}).has('${key}')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).has('name', 'marko')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
-            ComputerTestHelper.compute("g.V.has('name', 'marko')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
-            ComputerTestHelper.compute(" g.V.has('name', 'blah')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
-            ComputerTestHelper.compute("g.V.has('blah')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).has('age', Compare.gt, 30)", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
-            ComputerTestHelper.compute(" g.V(${v1Id}).out.hasId(${v2Id})", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
-            ComputerTestHelper.compute("g.V.has('age', Compare.gt, 30)", g);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
-            ComputerTestHelper.compute(" g.E(${e7Id}).hasLabel('knows')", g);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
-            ComputerTestHelper.compute("g.E.hasLabel('knows')", g);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
-            ComputerTestHelper.compute("g.E.hasLabel('uses', 'traverses')", g);
-        }
-
-        @Override
-        Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
-            ComputerTestHelper.compute("g.V.hasLabel('person', 'software', 'blah')", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
-            ComputerTestHelper.compute("g.V.has('person', 'name', 'marko').age", g);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
-            ComputerTestHelper.compute("g.V(${v1Id}).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV", g);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy
deleted file mode 100644
index 4803da0..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyIsTest.groovy
+++ /dev/null
@@ -1,91 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.Traversal
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-import org.apache.tinkerpop.gremlin.process.TraversalEngine
-import org.apache.tinkerpop.gremlin.process.UseEngine
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsTest
-import org.apache.tinkerpop.gremlin.structure.Compare
-import org.apache.tinkerpop.gremlin.structure.Vertex
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class GroovyIsTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends IsTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
-            return g.V().values('age').is(32);
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
-            return g.V().values('age').is(Compare.lte, 30);
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
-            return g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
-            return g.V().has(__.in('created').count().is(1l)).values('name');
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
-            return g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name');
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends IsTest {
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
-            ComputerTestHelper.compute("g.V().values('age').is(32)", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
-            ComputerTestHelper.compute("g.V().values('age').is(Compare.lte, 30)", g)
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
-            ComputerTestHelper.compute("g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34)", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
-            ComputerTestHelper.compute("g.V().has(__.in('created').count().is(1l)).values('name')", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
-            ComputerTestHelper.compute("g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name')", g)
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy
deleted file mode 100644
index 5208d15..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/GroovyOrTest.groovy
+++ /dev/null
@@ -1,66 +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.filter
-
-import org.apache.tinkerpop.gremlin.process.ComputerTestHelper
-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.graph.traversal.step.filter.OrTest
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.has
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyOrTest {
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class StandardTraversals extends OrTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
-            g.V.or(has('age', gt, 27), outE().count.gte(2l)).name
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
-            g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name
-        }
-    }
-
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class ComputerTraversals extends OrTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
-            ComputerTestHelper.compute("g.V.or(has('age', gt, 27), outE().count.gte(2l)).name", g)
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
-            ComputerTestHelper.compute("g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name", g)
-        }
-    }
-}


[30/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
new file mode 100644
index 0000000..50e1fd8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -0,0 +1,847 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.LoopTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.ComparatorHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ExceptStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTraversalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RetainStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TimeLimitStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.BackStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.DedupLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeOtherVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.IdStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.KeyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LabelStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaFlatMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.LambdaMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyValueStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.RangeLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SackStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SampleLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumLocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.match.MatchStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AddPropertyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.LambdaSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackElementValueStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackObjectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathIdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraverserTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraverserTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ElementFunctionComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ElementValueComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.TraversalComparator;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+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.Order;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.PropertyType;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
+
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+import java.util.NoSuchElementException;
+import java.util.Optional;
+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)
+ */
+public interface GraphTraversal<S, E> extends Traversal<S, E> {
+
+    public interface Admin<S, E> extends Traversal.Admin<S, E>, GraphTraversal<S, E> {
+
+        @Override
+        public default <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
+            return (GraphTraversal.Admin<S, E2>) Traversal.Admin.super.addStep((Step) step);
+        }
+
+        @Override
+        public default GraphTraversal<S, E> iterate() {
+            return GraphTraversal.super.iterate();
+        }
+
+        @Override
+        public GraphTraversal.Admin<S, E> clone();
+    }
+
+    @Override
+    public default GraphTraversal.Admin<S, E> asAdmin() {
+        return (GraphTraversal.Admin<S, E>) this;
+    }
+
+    ///////////////////// MAP STEPS /////////////////////
+
+    public default <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, E2> function) {
+        return this.asAdmin().addStep(new LambdaMapStep<>(this.asAdmin(), function));
+    }
+
+    public default <E2> GraphTraversal<S, E2> flatMap(final Function<Traverser<E>, Iterator<E2>> function) {
+        return this.asAdmin().addStep(new LambdaFlatMapStep<>(this.asAdmin(), function));
+    }
+
+    public default GraphTraversal<S, Object> id() {
+        return this.asAdmin().addStep(new IdStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, String> label() {
+        return this.asAdmin().addStep(new LabelStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, E> identity() {
+        return this.asAdmin().addStep(new IdentityStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
+        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, direction, edgeLabels));
+    }
+
+    public default GraphTraversal<S, Vertex> out(final String... edgeLabels) {
+        return this.to(Direction.OUT, edgeLabels);
+    }
+
+    public default GraphTraversal<S, Vertex> in(final String... edgeLabels) {
+        return this.to(Direction.IN, edgeLabels);
+    }
+
+    public default GraphTraversal<S, Vertex> both(final String... edgeLabels) {
+        return this.to(Direction.BOTH, edgeLabels);
+    }
+
+    public default GraphTraversal<S, Edge> toE(final Direction direction, final String... edgeLabels) {
+        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, direction, edgeLabels));
+    }
+
+    public default GraphTraversal<S, Edge> outE(final String... edgeLabels) {
+        return this.toE(Direction.OUT, edgeLabels);
+    }
+
+    public default GraphTraversal<S, Edge> inE(final String... edgeLabels) {
+        return this.toE(Direction.IN, edgeLabels);
+    }
+
+    public default GraphTraversal<S, Edge> bothE(final String... edgeLabels) {
+        return this.toE(Direction.BOTH, edgeLabels);
+    }
+
+    public default GraphTraversal<S, Vertex> toV(final Direction direction) {
+        return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), direction));
+    }
+
+    public default GraphTraversal<S, Vertex> inV() {
+        return this.toV(Direction.IN);
+    }
+
+    public default GraphTraversal<S, Vertex> outV() {
+        return this.toV(Direction.OUT);
+    }
+
+    public default GraphTraversal<S, Vertex> bothV() {
+        return this.toV(Direction.BOTH);
+    }
+
+    public default GraphTraversal<S, Vertex> otherV() {
+        return this.asAdmin().addStep(new EdgeOtherVertexStep(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, E> order() {
+        return this.order(Scope.global);
+    }
+
+    public default GraphTraversal<S, E> order(final Scope scope) {
+        return this.asAdmin().addStep(scope.equals(Scope.global) ? new OrderGlobalStep<>(this.asAdmin()) : new OrderLocalStep<>(this.asAdmin()));
+    }
+
+    public default <E2> GraphTraversal<S, ? extends Property<E2>> properties(final String... propertyKeys) {
+        return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.PROPERTY, propertyKeys));
+    }
+
+    public default <E2> GraphTraversal<S, E2> values(final String... propertyKeys) {
+        return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.VALUE, propertyKeys));
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final String... propertyKeys) {
+        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.PROPERTY, propertyKeys));
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final String... propertyKeys) {
+        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.VALUE, propertyKeys));
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
+        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), includeTokens, PropertyType.VALUE, propertyKeys));
+    }
+
+    public default GraphTraversal<S, String> key() {
+        return this.asAdmin().addStep(new KeyStep(this.asAdmin()));
+    }
+
+    public default <E2> GraphTraversal<S, E2> value() {
+        return this.asAdmin().addStep(new PropertyValueStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, Path> path() {
+        return this.asAdmin().addStep(new PathStep<>(this.asAdmin()));
+    }
+
+    public default <E2> GraphTraversal<S, E2> back(final String stepLabel) {
+        return this.asAdmin().addStep(new BackStep<>(this.asAdmin(), stepLabel));
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
+        return (GraphTraversal) this.asAdmin().addStep(new MatchStep<E, Map<String, E2>>(this.asAdmin(), startLabel, traversals));
+    }
+
+    public default <E2> GraphTraversal<S, E2> sack() {
+        return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> select(final String... stepLabels) {
+        return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), stepLabels));
+    }
+
+    public default <E2> GraphTraversal<S, E2> select(final String stepLabel) {
+        return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), stepLabel));
+    }
+
+    public default <E2> GraphTraversal<S, E2> unfold() {
+        return this.asAdmin().addStep(new UnfoldStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, List<E>> fold() {
+        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin()));
+    }
+
+    public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
+        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier?
+    }
+
+    public default GraphTraversal<S, Long> count() {
+        return this.count(Scope.global);
+    }
+
+    public default GraphTraversal<S, Long> count(final Scope scope) {
+        return this.asAdmin().addStep(scope.equals(Scope.global) ? new CountGlobalStep<>(this.asAdmin()) : new CountLocalStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, Double> sum() {
+        return this.sum(Scope.global);
+    }
+
+    public default GraphTraversal<S, Double> sum(final Scope scope) {
+        return this.asAdmin().addStep(scope.equals(Scope.global) ? new SumGlobalStep(this.asAdmin()) : new SumLocalStep<>(this.asAdmin()));
+    }
+
+    public default <E2 extends Number> GraphTraversal<S, E2> max() {
+        return this.max(Scope.global);
+    }
+
+    public default <E2 extends Number> GraphTraversal<S, E2> max(final Scope scope) {
+        return this.asAdmin().addStep(scope.equals(Scope.global) ? new MaxGlobalStep<E2>(this.asAdmin()) : new MaxLocalStep(this.asAdmin()));
+    }
+
+    public default <E2 extends Number> GraphTraversal<S, E2> min() {
+        return this.min(Scope.global);
+    }
+
+    public default <E2 extends Number> GraphTraversal<S, E2> min(final Scope scope) {
+        return this.asAdmin().addStep(scope.equals(Scope.global) ? new MinGlobalStep<E2>(this.asAdmin()) : new MinLocalStep(this.asAdmin()));
+    }
+
+
+    public default GraphTraversal<S, Double> mean() {
+        return this.mean(Scope.global);
+    }
+
+    public default GraphTraversal<S, Double> mean(final Scope scope) {
+        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()));
+    }
+
+    public default GraphTraversal<S, Tree> tree() {
+        return this.asAdmin().addStep(new TreeStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, Vertex> addV(final Object... keyValues) {
+        return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), keyValues));
+    }
+
+    public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+        return this.asAdmin().addStep(new AddEdgeByPathStep(this.asAdmin(), direction, edgeLabel, stepLabel, propertyKeyValues));
+    }
+
+    public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
+        return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertex, propertyKeyValues));
+    }
+
+    public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
+        return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertices, propertyKeyValues));
+    }
+
+    public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+        return this.addE(Direction.IN, edgeLabel, stepLabel, propertyKeyValues);
+    }
+
+    public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
+        return this.addE(Direction.IN, edgeLabel, otherVertex, propertyKeyValues);
+    }
+
+    public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
+        return this.addE(Direction.IN, edgeLabel, otherVertices, propertyKeyValues);
+    }
+
+    public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+        return this.addE(Direction.OUT, edgeLabel, stepLabel, propertyKeyValues);
+    }
+
+    public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
+        return this.addE(Direction.OUT, edgeLabel, otherVertex, propertyKeyValues);
+    }
+
+    public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
+        return this.addE(Direction.OUT, edgeLabel, otherVertices, propertyKeyValues);
+    }
+
+    public default GraphTraversal<S, E> property(final String key, final Object value) {
+        return this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), key, value));
+    }
+
+    ///////////////////// FILTER STEPS /////////////////////
+
+    public default GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) {
+        return this.asAdmin().addStep(new LambdaFilterStep<>(this.asAdmin(), predicate));
+    }
+
+    public default GraphTraversal<S, E> or(final Traversal<?, ?>... orTraversals) {
+        return this.asAdmin().addStep(0 == orTraversals.length ?
+                new OrStep.OrMarker<>(this.asAdmin()) :
+                new OrStep(this.asAdmin(), Arrays.copyOf(orTraversals, orTraversals.length, Traversal.Admin[].class)));
+    }
+
+    public default GraphTraversal<S, E> and(final Traversal<?, ?>... andTraversals) {
+        return this.asAdmin().addStep(0 == andTraversals.length ?
+                new AndStep.AndMarker<>(this.asAdmin()) :
+                new AndStep(this.asAdmin(), Arrays.copyOf(andTraversals, andTraversals.length, Traversal.Admin[].class)));
+    }
+
+    public default GraphTraversal<S, E> inject(final E... injections) {
+        return this.asAdmin().addStep(new InjectStep<>(this.asAdmin(), injections));
+    }
+
+    public default GraphTraversal<S, E> dedup() {
+        return this.dedup(Scope.global);
+    }
+
+    public default GraphTraversal<S, E> dedup(final Scope scope) {
+        return this.asAdmin().addStep(scope.equals(Scope.global) ? new DedupGlobalStep<>(this.asAdmin()) : new DedupLocalStep(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, E> except(final String sideEffectKeyOrPathLabel) {
+        return this.asAdmin().addStep(new ExceptStep<E>(this.asAdmin(), sideEffectKeyOrPathLabel));
+    }
+
+    public default GraphTraversal<S, E> except(final E exceptObject) {
+        return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptObject));
+    }
+
+    public default GraphTraversal<S, E> except(final Collection<E> exceptCollection) {
+        return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptCollection));
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
+        return this.asAdmin().addStep(new WhereStep(this.asAdmin(), firstKey, secondKey, predicate));
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
+        return this.where(firstKey, secondKey, predicate);
+    }
+
+    public default <E2> GraphTraversal<S, Map<String, E2>> where(final Traversal constraint) {
+        return this.asAdmin().addStep(new WhereStep<>(this.asAdmin(), constraint.asAdmin()));
+    }
+
+    public default GraphTraversal<S, E> has(final Traversal<?, ?> hasNextTraversal) {
+        return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNextTraversal, false));
+    }
+
+    public default GraphTraversal<S, E> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
+        return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNotNextTraversal, true));
+    }
+
+    public default GraphTraversal<S, E> has(final String key) {
+        return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.within)));
+    }
+
+    public default GraphTraversal<S, E> has(final String key, final Object value) {
+        return this.has(key, Compare.eq, value);
+    }
+
+    public default GraphTraversal<S, E> has(final T accessor, final Object value) {
+        return this.has(accessor.getAccessor(), value);
+    }
+
+    public default GraphTraversal<S, E> has(final String key, final BiPredicate predicate, final Object value) {
+        return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, predicate, value)));
+    }
+
+    public default GraphTraversal<S, E> has(final T accessor, final BiPredicate predicate, final Object value) {
+        return this.has(accessor.getAccessor(), predicate, value);
+    }
+
+    public default GraphTraversal<S, E> has(final String label, final String key, final Object value) {
+        return this.has(label, key, Compare.eq, value);
+    }
+
+    public default GraphTraversal<S, E> has(final String label, final String key, final BiPredicate predicate, final Object value) {
+        return this.has(T.label, label).has(key, predicate, value);
+    }
+
+    public default GraphTraversal<S, E> hasNot(final String key) {
+        return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.without)));
+    }
+
+    public default GraphTraversal<S, E> hasLabel(final String... labels) {
+        return labels.length == 1 ? this.has(T.label, labels[0]) : this.has(T.label, Contains.within, Arrays.asList(labels));
+    }
+
+    public default GraphTraversal<S, E> hasId(final Object... ids) {
+        return ids.length == 1 ? this.has(T.id, ids[0]) : this.has(T.id, Contains.within, Arrays.asList(ids));
+    }
+
+    public default GraphTraversal<S, E> hasKey(final String... keys) {
+        return keys.length == 1 ? this.has(T.key, keys[0]) : this.has(T.key, Contains.within, Arrays.asList(keys));
+    }
+
+    public default GraphTraversal<S, E> hasValue(final Object... values) {
+        return values.length == 1 ? this.has(T.value, values[0]) : this.has(T.value, Contains.within, Arrays.asList(values));
+    }
+
+    public default GraphTraversal<S, E> is(final Object value) {
+        return this.is(Compare.eq, value);
+    }
+
+    public default GraphTraversal<S, E> is(final BiPredicate predicate, final Object value) {
+        return this.asAdmin().addStep(new IsStep(this.asAdmin(), predicate, value));
+    }
+
+    public default GraphTraversal<S, E> coin(final double probability) {
+        return this.asAdmin().addStep(new CoinStep<>(this.asAdmin(), probability));
+    }
+
+    public default GraphTraversal<S, E> range(final long low, final long high) {
+        return this.range(Scope.global, low, high);
+    }
+
+    public default GraphTraversal<S, E> range(final Scope scope, final long low, final long high) {
+        return this.asAdmin().addStep(scope.equals(Scope.global)
+                ? new RangeGlobalStep<>(this.asAdmin(), low, high)
+                : new RangeLocalStep<>(this.asAdmin(), low, high));
+    }
+
+    public default GraphTraversal<S, E> limit(final long limit) {
+        return this.range(Scope.global, 0, limit);
+    }
+
+    public default GraphTraversal<S, E> limit(final Scope scope, final long limit) {
+        return this.range(scope, 0, limit);
+    }
+
+    public default GraphTraversal<S, E> retain(final String sideEffectKeyOrPathLabel) {
+        return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), sideEffectKeyOrPathLabel));
+    }
+
+    public default GraphTraversal<S, E> retain(final E retainObject) {
+        return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainObject));
+    }
+
+    public default GraphTraversal<S, E> retain(final Collection<E> retainCollection) {
+        return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainCollection));
+    }
+
+    public default GraphTraversal<S, E> simplePath() {
+        return this.asAdmin().addStep(new SimplePathStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, E> cyclicPath() {
+        return this.asAdmin().addStep(new CyclicPathStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, E> sample(final int amountToSample) {
+        return this.sample(Scope.global, amountToSample);
+    }
+
+    public default GraphTraversal<S, E> sample(final Scope scope, final int amountToSample) {
+        return this.asAdmin().addStep(scope.equals(Scope.global)
+                ? new SampleGlobalStep<>(this.asAdmin(), amountToSample)
+                : new SampleLocalStep<>(this.asAdmin(), amountToSample));
+    }
+
+    ///////////////////// SIDE-EFFECT STEPS /////////////////////
+
+    public default GraphTraversal<S, E> sideEffect(final Consumer<Traverser<E>> consumer) {
+        return this.asAdmin().addStep(new LambdaSideEffectStep<>(this.asAdmin(), consumer));
+    }
+
+    public default <E2> GraphTraversal<S, E2> cap(final String... sideEffectKeys) {
+        return this.asAdmin().addStep(new SideEffectCapStep<>(this.asAdmin(), sideEffectKeys));
+    }
+
+    public default GraphTraversal<S, Edge> subgraph(final String sideEffectKey) {
+        return this.asAdmin().addStep(new SubgraphStep(this.asAdmin(), sideEffectKey));
+    }
+
+    public default GraphTraversal<S, E> aggregate(final String sideEffectKey) {
+        return this.asAdmin().addStep(new AggregateStep<>(this.asAdmin(), sideEffectKey));
+    }
+
+    public default GraphTraversal<S, E> group(final String sideEffectKey) {
+        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 GraphTraversal<S, E> timeLimit(final long timeLimit) {
+        return this.asAdmin().addStep(new TimeLimitStep<E>(this.asAdmin(), timeLimit));
+    }
+
+    public default GraphTraversal<S, E> tree(final String sideEffectKey) {
+        return this.asAdmin().addStep(new TreeSideEffectStep<>(this.asAdmin(), sideEffectKey));
+    }
+
+    public default <V> GraphTraversal<S, E> sack(final BiFunction<V, E, V> sackFunction) {
+        return this.asAdmin().addStep(new SackObjectStep<>(this.asAdmin(), sackFunction));
+    }
+
+    public default <V> GraphTraversal<S, E> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
+        return this.asAdmin().addStep(new SackElementValueStep(this.asAdmin(), sackOperator, elementPropertyKey));
+    }
+
+    public default GraphTraversal<S, E> store(final String sideEffectKey) {
+        return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), sideEffectKey));
+    }
+
+    public default GraphTraversal<S, E> profile() {
+        return this.asAdmin().addStep(new ProfileStep<>(this.asAdmin()));
+    }
+
+    ///////////////////// BRANCH STEPS /////////////////////
+
+    public default <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> branchTraversal) {
+        final BranchStep<E, E2, M> branchStep = new BranchStep<>(this.asAdmin());
+        branchStep.setBranchTraversal((Traversal.Admin<E, M>) branchTraversal);
+        return this.asAdmin().addStep(branchStep);
+    }
+
+    public default <M, E2> GraphTraversal<S, E2> branch(final Function<Traverser<E>, M> function) {
+        return this.branch(new MapTraverserTraversal<>(function));
+    }
+
+    public default <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) {
+        return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), (Traversal.Admin<E, M>) choiceTraversal));
+    }
+
+    public default <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+        return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) traversalPredicate, (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice));
+    }
+
+    public default <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> choiceFunction) {
+        return this.choose(new MapTraversal<>(choiceFunction));
+    }
+
+    public default <E2> GraphTraversal<S, E2> choose(final Predicate<E> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+        return this.choose(new FilterTraversal<>(choosePredicate), trueChoice, falseChoice);
+    }
+
+    public default <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) {
+        return this.asAdmin().addStep(new UnionStep(this.asAdmin(), Arrays.copyOf(unionTraversals, unionTraversals.length, Traversal.Admin[].class)));
+    }
+
+    public default <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, E2>... coalesceTraversals) {
+        return this.asAdmin().addStep(new CoalesceStep(this.asAdmin(), Arrays.copyOf(coalesceTraversals, coalesceTraversals.length, Traversal.Admin[].class)));
+    }
+
+    public default GraphTraversal<S, E> repeat(final Traversal<?, E> repeatTraversal) {
+        return RepeatStep.addRepeatToTraversal(this, (Traversal.Admin<E, E>) repeatTraversal);
+    }
+
+    public default GraphTraversal<S, E> emit(final Traversal<?, ?> emitTraversal) {
+        return RepeatStep.addEmitToTraversal(this, (Traversal.Admin<E, ?>) emitTraversal);
+    }
+
+    public default GraphTraversal<S, E> emit(final Predicate<Traverser<E>> emitPredicate) {
+        return this.emit(new FilterTraverserTraversal<>(emitPredicate));
+    }
+
+    public default GraphTraversal<S, E> emit() {
+        return this.emit(TrueTraversal.instance());
+    }
+
+    public default GraphTraversal<S, E> until(final Traversal<?, ?> untilTraversal) {
+        return RepeatStep.addUntilToTraversal(this, (Traversal.Admin<E, ?>) untilTraversal);
+    }
+
+    public default GraphTraversal<S, E> until(final Predicate<Traverser<E>> untilPredicate) {
+        return this.until(new FilterTraverserTraversal<>(untilPredicate));
+    }
+
+    public default GraphTraversal<S, E> times(final int maxLoops) {
+        return this.until(new LoopTraversal(maxLoops));
+    }
+
+    public default <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) {
+        return this.asAdmin().addStep(new LocalStep<>(this.asAdmin(), localTraversal.asAdmin()));
+    }
+
+    ///////////////////// UTILITY STEPS /////////////////////
+
+    public default GraphTraversal<S, E> withSideEffect(final String key, final Supplier supplier) {
+        this.asAdmin().getSideEffects().registerSupplier(key, supplier);
+        return this;
+    }
+
+    public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
+        this.asAdmin().getSideEffects().setSack(initialValue, Optional.of(splitOperator));
+        return this;
+    }
+
+    public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue) {
+        this.asAdmin().getSideEffects().setSack(initialValue, Optional.empty());
+        return this;
+    }
+
+    public default <A> GraphTraversal<S, E> withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
+        this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.of(splitOperator));
+        return this;
+    }
+
+    public default <A> GraphTraversal<S, E> withSack(A initialValue) {
+        this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.empty());
+        return this;
+    }
+
+    public default GraphTraversal<S, E> withPath() {
+        return this.asAdmin().addStep(new PathIdentityStep<>(this.asAdmin()));
+    }
+
+    public default GraphTraversal<S, E> as(final String stepLabel) {
+        if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin()));
+        this.asAdmin().getEndStep().setLabel(stepLabel);
+        return this;
+    }
+
+    public default GraphTraversal<S, E> barrier() {
+        return this.asAdmin().addStep(new CollectingBarrierStep(asAdmin()) {
+            @Override
+            public void barrierConsumer(TraverserSet traverserSet) {
+
+            }
+        });
+    }
+
+    ////
+
+    public default GraphTraversal<S, E> by() {
+        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new IdentityTraversal<>());
+        return this;
+    }
+
+    public default <V> GraphTraversal<S, E> by(final Function<V, Object> functionProjection) {
+        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(functionProjection));
+        return this;
+    }
+
+    public default GraphTraversal<S, E> by(final T tokenProjection) {
+        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(tokenProjection));
+        return this;
+    }
+
+    public default GraphTraversal<S, E> by(final String elementPropertyKey) {
+        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new ElementValueTraversal<>(elementPropertyKey));
+        return this;
+    }
+
+    public default GraphTraversal<S, E> by(final Traversal<?, ?> byTraversal) {
+        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(byTraversal.asAdmin());
+        return this;
+    }
+
+    ////
+
+    public default GraphTraversal<S, E> by(final Order order) {
+        ((ComparatorHolder) this.asAdmin().getEndStep()).addComparator(order);
+        return this;
+    }
+
+    public default GraphTraversal<S, E> by(final Comparator<E> comparator) {
+        ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(comparator);
+        return this;
+    }
+
+    public default <V> GraphTraversal<S, E> by(final Function<Element, V> elementFunctionProjection, final Comparator<V> elementFunctionValueComparator) {
+        ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementFunctionComparator<>(elementFunctionProjection, elementFunctionValueComparator));
+        return this;
+    }
+
+    public default <V> GraphTraversal<S, E> by(final String elementPropertyProjection, final Comparator<V> propertyValueComparator) {
+        ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementValueComparator<>(elementPropertyProjection, propertyValueComparator));
+        return this;
+    }
+
+    public default <V> GraphTraversal<S, E> by(final Traversal<?, ?> traversal, final Comparator<V> endComparator) {
+        ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(new TraversalComparator(traversal.asAdmin(), endComparator));
+        return this;
+    }
+
+    ////
+
+    public default <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) {
+        ((TraversalOptionParent<M, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(pickToken, traversalOption.asAdmin());
+        return this;
+    }
+
+    public default <E2> GraphTraversal<S, E> option(final Traversal<E, E2> traversalOption) {
+        ((TraversalOptionParent<TraversalOptionParent.Pick, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(TraversalOptionParent.Pick.any, traversalOption.asAdmin());
+        return this;
+    }
+
+    ////
+
+    @Override
+    public default void remove() {
+        try {
+            this.asAdmin().applyStrategies();
+            final Step<?, E> endStep = this.asAdmin().getEndStep();
+            while (true) {
+                final Object object = endStep.next().get();
+                if (object instanceof Element)
+                    ((Element) object).remove();
+                else if (object instanceof Property)
+                    ((Property) object).remove();
+                else {
+                    throw new IllegalStateException("The following object does not have a remove() method: " + object);
+                }
+            }
+        } catch (final NoSuchElementException ignored) {
+
+        }
+    }
+
+    @Override
+    public default GraphTraversal<S, E> iterate() {
+        Traversal.super.iterate();
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
new file mode 100644
index 0000000..b1d8bb0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java
@@ -0,0 +1,138 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Transaction;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GraphTraversalSource implements TraversalSource {
+
+    public static final Builder standard = GraphTraversalSource.build().engine(StandardTraversalEngine.build());
+    public static final Builder computer = GraphTraversalSource.build().engine(ComputerTraversalEngine.build());
+
+    public static Builder computer(final Class<? extends GraphComputer> graphComputerClass) {
+        return GraphTraversalSource.build().engine(ComputerTraversalEngine.build().computer(graphComputerClass));
+    }
+
+    ////
+
+    private final transient Graph graph;
+    private final TraversalEngine.Builder engine;
+    private final TraversalStrategies strategies;
+
+    public GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engine, final TraversalStrategy... strategies) {
+        this.graph = graph;
+        this.engine = engine;
+        final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass());
+        this.strategies = strategies.length == 0 ? tempStrategies : tempStrategies.clone().addStrategies(strategies);
+    }
+
+    public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
+        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
+        traversal.setEngine(this.engine.create(this.graph));
+        traversal.setStrategies(this.strategies);
+        return traversal.addStep(new AddVertexStartStep(traversal, keyValues));
+    }
+
+    public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
+        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
+        traversal.setEngine(this.engine.create(this.graph));
+        traversal.setStrategies(this.strategies);
+        return traversal.addStep(new GraphStep<>(traversal, Vertex.class, vertexIds));
+    }
+
+    public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
+        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this.graph);
+        traversal.setEngine(this.engine.create(this.graph));
+        traversal.setStrategies(this.strategies);
+        return traversal.addStep(new GraphStep<>(traversal, Edge.class, edgesIds));
+    }
+
+    public Transaction tx() {
+        return this.graph.tx();
+    }
+
+    public static Builder build() {
+        return new Builder();
+    }
+
+
+    @Override
+    public Optional<GraphComputer> getGraphComputer() {
+        return this.engine.create(this.graph).getGraphComputer();
+    }
+
+    @Override
+    public Optional<Graph> getGraph() {
+        return Optional.ofNullable(this.graph);
+    }
+
+    @Override
+    public GraphTraversalSource.Builder asBuilder() {
+        final GraphTraversalSource.Builder builder = GraphTraversalSource.build().engine(this.engine);
+        this.strategies.toList().forEach(builder::strategy);
+        return builder;
+    }
+
+    @Override
+    public String toString() {
+        return StringFactory.traversalSourceString(this);
+    }
+
+    //////
+
+    public static class Builder implements TraversalSource.Builder<GraphTraversalSource> {
+
+        private TraversalEngine.Builder engineBuilder = StandardTraversalEngine.build();
+        private List<TraversalStrategy> strategies = new ArrayList<>();
+
+        public Builder engine(final TraversalEngine.Builder engineBuilder) {
+            this.engineBuilder = engineBuilder;
+            return this;
+        }
+
+        public Builder strategy(final TraversalStrategy strategy) {
+            this.strategies.add(strategy);
+            return this;
+        }
+
+        public GraphTraversalSource create(final Graph graph) {
+            return new GraphTraversalSource(graph, this.engineBuilder, this.strategies.toArray(new TraversalStrategy[this.strategies.size()]));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
new file mode 100644
index 0000000..7946e5c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java
@@ -0,0 +1,602 @@
+/*
+ * 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.dsl.graph;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
+
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+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)
+ */
+public class __ {
+
+    protected __() {
+    }
+
+    //////////////////////////////////////////////////////////////////////
+
+    public static <A> GraphTraversal<A, A> start() {
+        return new DefaultGraphTraversal<>(EmptyGraph.instance());
+    }
+
+    public static <A> GraphTraversal<A, A> __(final Object... starts) {
+        return inject(starts);
+    }
+
+    ///////////////////// MAP STEPS /////////////////////
+
+    public static <A, E2> GraphTraversal<A, E2> map(final Function<Traverser<A>, E2> function) {
+        return __.<A>start().map(function);
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> flatMap(final Function<Traverser<A>, Iterator<E2>> function) {
+        return __.<A>start().flatMap(function);
+    }
+
+    public static <A> GraphTraversal<A, A> identity() {
+        return __.<A>start().identity();
+    }
+
+    public static <A> GraphTraversal<A, String> label() {
+        return __.<A>start().label();
+    }
+
+    public static <A> GraphTraversal<A, Object> id() {
+        return __.<A>start().id();
+    }
+
+    public static <A> GraphTraversal<A, Vertex> to(final Direction direction, final String... edgeLabels) {
+        return __.<A>start().to(direction, edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Vertex> out(final String... edgeLabels) {
+        return __.<A>start().out(edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Vertex> in(final String... edgeLabels) {
+        return __.<A>start().in(edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Vertex> both(final String... edgeLabels) {
+        return __.<A>start().both(edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Edge> toE(final Direction direction, final String... edgeLabels) {
+        return __.<A>start().toE(direction, edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Edge> outE(final String... edgeLabels) {
+        return __.<A>start().outE(edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Edge> inE(final String... edgeLabels) {
+        return __.<A>start().inE(edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Edge> bothE(final String... edgeLabels) {
+        return __.<A>start().bothE(edgeLabels);
+    }
+
+    public static <A> GraphTraversal<A, Vertex> toV(final Direction direction) {
+        return __.<A>start().toV(direction);
+    }
+
+    public static <A> GraphTraversal<A, Vertex> inV() {
+        return __.<A>start().inV();
+    }
+
+    public static <A> GraphTraversal<A, Vertex> outV() {
+        return __.<A>start().outV();
+    }
+
+    public static <A> GraphTraversal<A, Vertex> bothV() {
+        return __.<A>start().bothV();
+    }
+
+    public static <A> GraphTraversal<A, Vertex> otherV() {
+        return __.<A>start().otherV();
+    }
+
+    public static <A> GraphTraversal<A, A> order() {
+        return __.<A>start().order();
+    }
+
+    public static <A> GraphTraversal<A, A> order(final Scope scope) {
+        return __.<A>start().order(scope);
+    }
+
+    public static <A, E2> GraphTraversal<A, ? extends Property<E2>> properties(final String... propertyKeys) {
+        return __.<A>start().properties(propertyKeys);
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> values(final String... propertyKeys) {
+        return __.<A>start().values(propertyKeys);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> propertyMap(final String... propertyKeys) {
+        return __.<A>start().propertyMap(propertyKeys);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final String... propertyKeys) {
+        return __.<A>start().valueMap(propertyKeys);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
+        return __.<A>start().valueMap(includeTokens, propertyKeys);
+    }
+
+    public static <A> GraphTraversal<A, String> key() {
+        return __.<A>start().key();
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> value() {
+        return __.<A>start().value();
+    }
+
+    public static <A> GraphTraversal<A, Path> path() {
+        return __.<A>start().path();
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> back(final String stepLabel) {
+        return __.<A>start().back(stepLabel);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
+        return __.<A>start().match(startLabel, traversals);
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> sack() {
+        return __.<A>start().sack();
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> select(final String stepLabel) {
+        return __.<A>start().select(stepLabel);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> select(final String... stepLabels) {
+        return __.<A>start().select(stepLabels);
+    }
+
+    public static <A> GraphTraversal<A, A> unfold() {
+        return __.<A>start().unfold();
+    }
+
+    public static <A> GraphTraversal<A, List<A>> fold() {
+        return __.<A>start().fold();
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> fold(final E2 seed, final BiFunction<E2, A, E2> foldFunction) {
+        return __.<A>start().fold(seed, foldFunction);
+    }
+
+    public static <A> GraphTraversal<A, Long> count() {
+        return __.<A>start().count();
+    }
+
+    public static <A> GraphTraversal<A, Long> count(final Scope scope) {
+        return __.<A>start().count(scope);
+    }
+
+    public static <A> GraphTraversal<A, Double> sum() {
+        return __.<A>start().sum();
+    }
+
+    public static <A> GraphTraversal<A, Double> sum(final Scope scope) {
+        return __.<A>start().sum(scope);
+    }
+
+
+    public static <A, E2 extends Number> GraphTraversal<A, E2> min() {
+        return __.<A>start().min();
+    }
+
+    public static <A, E2 extends Number> GraphTraversal<A, E2> min(final Scope scope) {
+        return __.<A>start().min(scope);
+    }
+
+    public static <A, E2 extends Number> GraphTraversal<A, E2> max() {
+        return __.<A>start().max();
+    }
+
+    public static <A, E2 extends Number> GraphTraversal<A, E2> max(final Scope scope) {
+        return __.<A>start().max(scope);
+    }
+
+    public static <A> GraphTraversal<A, Double> mean() {
+        return __.<A>start().mean();
+    }
+
+    public static <A> GraphTraversal<A, Double> mean(final Scope scope) {
+        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();
+    }
+
+    public static <A> GraphTraversal<A, Tree> tree() {
+        return __.<A>start().tree();
+    }
+
+    public static <A> GraphTraversal<A, Vertex> addV(final Object... propertyKeyValues) {
+        return __.<A>start().addV(propertyKeyValues);
+    }
+
+    public static <A> GraphTraversal<A, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+        return __.<A>start().addE(direction, edgeLabel, stepLabel, propertyKeyValues);
+    }
+
+    public static <A> GraphTraversal<A, Edge> addInE(final String edgeLabel, final String setLabel, final Object... propertyKeyValues) {
+        return __.<A>start().addInE(edgeLabel, setLabel, propertyKeyValues);
+    }
+
+    public static <A> GraphTraversal<A, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
+        return __.<A>start().addOutE(edgeLabel, stepLabel, propertyKeyValues);
+    }
+
+    public static <A> GraphTraversal<A, A> property(final String key, final Object value) {
+        return __.<A>start().property(key, value);
+    }
+
+    ///////////////////// FILTER STEPS /////////////////////
+
+    public static <A> GraphTraversal<A, A> filter(final Predicate<Traverser<A>> predicate) {
+        return __.<A>start().filter(predicate);
+    }
+
+    public static <A> GraphTraversal<A, A> and(final Traversal<?, ?>... andTraversals) {
+        return __.<A>start().and(andTraversals);
+    }
+
+    public static <A> GraphTraversal<A, A> or(final Traversal<?, ?>... orTraversals) {
+        return __.<A>start().or(orTraversals);
+    }
+
+    public static <A> GraphTraversal<A, A> inject(final Object... injections) {
+        return __.<A>start().inject((A[]) injections);
+    }
+
+    public static <A> GraphTraversal<A, A> dedup() {
+        return __.<A>start().dedup();
+    }
+
+    public static <A> GraphTraversal<A, A> dedup(final Scope scope) {
+        return __.<A>start().dedup(scope);
+    }
+
+    public static <A> GraphTraversal<A, A> except(final String sideEffectKeyOrPathLabel) {
+        return __.<A>start().except(sideEffectKeyOrPathLabel);
+    }
+
+    public static <A> GraphTraversal<A, A> except(final Object exceptObject) {
+        return __.<A>start().except((A) exceptObject);
+    }
+
+    public static <A> GraphTraversal<A, A> except(final Collection<A> exceptCollection) {
+        return __.<A>start().except(exceptCollection);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final Traversal<?, ?> hasNextTraversal) {
+        return __.<A>start().has(hasNextTraversal);
+    }
+
+    public static <A> GraphTraversal<A, A> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
+        return __.<A>start().hasNot(hasNotNextTraversal);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final String key) {
+        return __.<A>start().has(key);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
+        return __.<A>start().has(key, value);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final T accessor, final Object value) {
+        return __.<A>start().has(accessor, value);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final String key, final BiPredicate predicate, final Object value) {
+        return __.<A>start().has(key, predicate, value);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final T accessor, final BiPredicate predicate, final Object value) {
+        return __.<A>start().has(accessor, predicate, value);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final String label, final String key, final Object value) {
+        return __.<A>start().has(label, key, value);
+    }
+
+    public static <A> GraphTraversal<A, A> has(final String label, final String key, final BiPredicate predicate, final Object value) {
+        return __.<A>start().has(label, key, predicate, value);
+    }
+
+    public static <A> GraphTraversal<A, A> hasNot(final String key) {
+        return __.<A>start().hasNot(key);
+    }
+
+    public static <A> GraphTraversal<A, A> hasLabel(final String... labels) {
+        return __.<A>start().hasLabel(labels);
+    }
+
+    public static <A> GraphTraversal<A, A> hasId(final Object... ids) {
+        return __.<A>start().hasId(ids);
+    }
+
+    public static <A> GraphTraversal<A, A> hasKey(final String... keys) {
+        return __.<A>start().hasKey(keys);
+    }
+
+    public static <A> GraphTraversal<A, A> hasValue(final Object... values) {
+        return __.<A>start().hasValue(values);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
+        return __.<A>start().where(firstKey, secondKey, predicate);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
+        return __.<A>start().where(firstKey, predicate, secondKey);
+    }
+
+    public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final Traversal constraint) {
+        return __.<A>start().where(constraint);
+    }
+
+    public static <A> GraphTraversal<A, A> is(final Object value) {
+        return __.<A>start().is(value);
+    }
+
+    public static <A> GraphTraversal<A, A> is(final BiPredicate predicate, final Object value) {
+        return __.<A>start().is(predicate, value);
+    }
+
+    public static <A> GraphTraversal<A, A> coin(final double probability) {
+        return __.<A>start().coin(probability);
+    }
+
+    public static <A> GraphTraversal<A, A> range(final long low, final long high) {
+        return __.<A>start().range(low, high);
+    }
+
+    public static <A> GraphTraversal<A, A> range(final Scope scope, final long low, final long high) {
+        return __.<A>start().range(scope, low, high);
+    }
+
+    public static <A> GraphTraversal<A, A> limit(final long limit) {
+        return __.<A>start().limit(limit);
+    }
+
+    public static <A> GraphTraversal<A, A> limit(final Scope scope, final long limit) {
+        return __.<A>start().limit(scope, limit);
+    }
+
+    public static <A> GraphTraversal<A, A> retain(final String sideEffectKeyOrPathLabel) {
+        return __.<A>start().retain(sideEffectKeyOrPathLabel);
+    }
+
+    public static <A> GraphTraversal<A, A> retain(final Object retainObject) {
+        return __.<A>start().retain((A) retainObject);
+    }
+
+    public static <A> GraphTraversal<A, A> retain(final Collection<A> retainCollection) {
+        return __.<A>start().retain(retainCollection);
+    }
+
+    public static <A> GraphTraversal<A, A> simplePath() {
+        return __.<A>start().simplePath();
+    }
+
+    public static <A> GraphTraversal<A, A> cyclicPath() {
+        return __.<A>start().cyclicPath();
+    }
+
+    public static <A> GraphTraversal<A, A> sample(final int amountToSample) {
+        return __.<A>start().sample(amountToSample);
+    }
+
+    public static <A> GraphTraversal<A, A> sample(final Scope scope, final int amountToSample) {
+        return __.<A>start().sample(scope, amountToSample);
+    }
+
+    ///////////////////// SIDE-EFFECT STEPS /////////////////////
+
+    public static <A> GraphTraversal<A, A> sideEffect(final Consumer<Traverser<A>> consumer) {
+        return __.<A>start().sideEffect(consumer);
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> cap(final String... sideEffectKeys) {
+        return __.<A>start().cap(sideEffectKeys);
+    }
+
+    public static <A> GraphTraversal<A, Edge> subgraph(final String sideEffectKey) {
+        return __.<A>start().subgraph(sideEffectKey);
+    }
+
+    public static <A> GraphTraversal<A, A> aggregate(final String sideEffectKey) {
+        return __.<A>start().aggregate(sideEffectKey);
+    }
+
+    public static <A> GraphTraversal<A, A> group(final String sideEffectKey) {
+        return __.<A>start().group(sideEffectKey);
+    }
+
+    public static <A> GraphTraversal<A, A> groupCount(final String sideEffectKey) {
+        return __.<A>start().groupCount(sideEffectKey);
+    }
+
+    public static <A> GraphTraversal<A, A> timeLimit(final long timeLimit) {
+        return __.<A>start().timeLimit(timeLimit);
+    }
+
+    public static <A> GraphTraversal<A, A> tree(final String sideEffectKey) {
+        return __.<A>start().tree(sideEffectKey);
+    }
+
+    public static <A, V> GraphTraversal<A, A> sack(final BiFunction<V, A, V> sackFunction) {
+        return __.<A>start().sack(sackFunction);
+    }
+
+    public static <A, V> GraphTraversal<A, A> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
+        return __.<A>start().sack(sackOperator, elementPropertyKey);
+    }
+
+    public static <A> GraphTraversal<A, A> store(final String sideEffectKey) {
+        return __.<A>start().store(sideEffectKey);
+    }
+
+    ///////////////////// BRANCH STEPS /////////////////////
+
+    public static <A, M, E2> GraphTraversal<A, E2> branch(final Function<Traverser<A>, M> function) {
+        return __.<A>start().branch(function);
+    }
+
+    public static <A, M, E2> GraphTraversal<A, E2> branch(final Traversal<?, M> traversalFunction) {
+        return __.<A>start().branch(traversalFunction);
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> choose(final Predicate<A> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+        return __.<A>start().choose(choosePredicate, trueChoice, falseChoice);
+    }
+
+    public static <A, M, E2> GraphTraversal<A, E2> choose(final Function<A, M> choiceFunction) {
+        return __.<A>start().choose(choiceFunction);
+    }
+
+    public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalFunction) {
+        return __.<A>start().choose(traversalFunction);
+    }
+
+    public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
+        return __.<A>start().choose(traversalPredicate, trueChoice, falseChoice);
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> union(final Traversal<?, E2>... traversals) {
+        return __.<A>start().union(traversals);
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> coalesce(final Traversal<?, E2>... traversals) {
+        return __.<A>start().coalesce(traversals);
+    }
+
+    public static <A> GraphTraversal<A, A> repeat(final Traversal<?, A> traversal) {
+        return __.<A>start().repeat(traversal);
+    }
+
+    public static <A> GraphTraversal<A, A> emit(final Traversal<?, ?> emitTraversal) {
+        return __.<A>start().emit(emitTraversal);
+    }
+
+    public static <A> GraphTraversal<A, A> emit(final Predicate<Traverser<A>> emitPredicate) {
+        return __.<A>start().emit(emitPredicate);
+    }
+
+    public static <A> GraphTraversal<A, A> until(final Traversal<?, ?> untilTraversal) {
+        return __.<A>start().until(untilTraversal);
+    }
+
+    public static <A> GraphTraversal<A, A> until(final Predicate<Traverser<A>> untilPredicate) {
+        return __.<A>start().until(untilPredicate);
+    }
+
+    public static <A> GraphTraversal<A, A> times(final int maxLoops) {
+        return __.<A>start().times(maxLoops);
+    }
+
+    public static <A> GraphTraversal<A, A> emit() {
+        return __.<A>start().emit();
+    }
+
+    public static <A, E2> GraphTraversal<A, E2> local(final Traversal<?, E2> localTraversal) {
+        return __.<A>start().local(localTraversal);
+    }
+
+    ///////////////////// UTILITY STEPS /////////////////////
+
+    public static <A> GraphTraversal<A, A> as(final String label) {
+        return __.<A>start().as(label);
+    }
+
+    public static <A> GraphTraversal<A, A> profile() {
+        return __.<A>start().profile();
+    }
+
+    public static <A> GraphTraversal<A, A> withSideEffect(final String key, final Supplier supplier) {
+        return __.<A>start().withSideEffect(key, supplier);
+    }
+
+    public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue, final UnaryOperator<B> splitOperator) {
+        return __.<A>start().withSack(initialValue, splitOperator);
+    }
+
+    public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue) {
+        return __.<A>start().withSack(initialValue);
+    }
+
+    public static <A, B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
+        return __.<A>start().withSack(initialValue, splitOperator);
+    }
+
+    public static <A, B> GraphTraversal<A, A> withSack(B initialValue) {
+        return __.<A>start().withSack(initialValue);
+    }
+
+    public static <A> GraphTraversal<A, A> withPath() {
+        return __.<A>start().withPath();
+    }
+
+    public static <A> GraphTraversal<A, A> barrier() {
+        return __.<A>start().barrier();
+    }
+
+    ////
+
+    public static <A> GraphTraversal<A, A> iterate() {
+        return __.<A>start().iterate();
+    }
+
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
index 1116311..6ea0c48 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
@@ -18,15 +18,14 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.engine;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
-import java.io.Serializable;
 import java.util.Optional;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java
index 342bb60..7d66d9d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/StandardTraversalEngine.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.engine;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
index 2425d45..673b383 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java
@@ -18,19 +18,19 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
 import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.traverser.O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_TraverserGenerator;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.Collections;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
index 98f0fe0..c80898b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/ElementValueTraversal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.structure.Element;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
index 0ab2455..2b551a7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraversal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 
 import java.util.function.Predicate;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
index 3ac002b..d4c6d90 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/FilterTraverserTraversal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 
 import java.util.function.Predicate;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
index 7aeee74..7a02e53 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/HasNextTraversal.java
@@ -18,14 +18,14 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
index debe515..95cf7f0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/IdentityTraversal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java
new file mode 100644
index 0000000..c1fc06a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/LoopTraversal.java
@@ -0,0 +1,49 @@
+/*
+ * 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.lambda;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LoopTraversal<S, E> extends AbstractLambdaTraversal<S, E> {
+
+    private final long maxLoops;
+    private boolean allow = false;
+
+    public LoopTraversal(final long maxLoops) {
+        this.maxLoops = maxLoops;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return this.allow;
+    }
+
+    @Override
+    public void addStart(final Traverser<S> start) {
+        this.allow = start.loops() >= this.maxLoops;
+    }
+
+    @Override
+    public String toString() {
+        return "loops(" + this.maxLoops + ')';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
index b7baeee..7c97d2d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraversal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 
 import java.util.function.Function;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
index 9675b74..3893735 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/MapTraverserTraversal.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.lambda;
 
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 
 import java.util.function.Function;
 


[38/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 50f5abd..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversal.java
+++ /dev/null
@@ -1,847 +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;
-
-import org.apache.tinkerpop.gremlin.process.Path;
-import org.apache.tinkerpop.gremlin.process.Scope;
-import org.apache.tinkerpop.gremlin.process.Step;
-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.process.graph.traversal.lambda.LoopTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.ComparatorHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.TraversalOptionParent;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.BranchStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.ChooseStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.UnionStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTraversalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.LambdaFilterStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SampleGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.TimeLimitStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeByPathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CoalesceStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.DedupLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeOtherVertexStep;
-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;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaFlatMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.LambdaMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertyMapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertyValueStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.RangeLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SackStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SampleLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectOneStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumGlobalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumLocalStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.TreeStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.UnfoldStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.match.MatchStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AddPropertyStep;
-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.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;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackElementValueStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackObjectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SubgraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.TreeSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.PathIdentityStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.FilterTraverserTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.MapTraverserTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.TrueTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.ElementFunctionComparator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.ElementValueComparator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalComparator;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-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.Order;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.PropertyType;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Comparator;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-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)
- */
-public interface GraphTraversal<S, E> extends Traversal<S, E> {
-
-    public interface Admin<S, E> extends Traversal.Admin<S, E>, GraphTraversal<S, E> {
-
-        @Override
-        public default <E2> GraphTraversal.Admin<S, E2> addStep(final Step<?, E2> step) {
-            return (GraphTraversal.Admin<S, E2>) Traversal.Admin.super.addStep((Step) step);
-        }
-
-        @Override
-        public default GraphTraversal<S, E> iterate() {
-            return GraphTraversal.super.iterate();
-        }
-
-        @Override
-        public GraphTraversal.Admin<S, E> clone();
-    }
-
-    @Override
-    public default GraphTraversal.Admin<S, E> asAdmin() {
-        return (GraphTraversal.Admin<S, E>) this;
-    }
-
-    ///////////////////// MAP STEPS /////////////////////
-
-    public default <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, E2> function) {
-        return this.asAdmin().addStep(new LambdaMapStep<>(this.asAdmin(), function));
-    }
-
-    public default <E2> GraphTraversal<S, E2> flatMap(final Function<Traverser<E>, Iterator<E2>> function) {
-        return this.asAdmin().addStep(new LambdaFlatMapStep<>(this.asAdmin(), function));
-    }
-
-    public default GraphTraversal<S, Object> id() {
-        return this.asAdmin().addStep(new IdStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, String> label() {
-        return this.asAdmin().addStep(new LabelStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, E> identity() {
-        return this.asAdmin().addStep(new IdentityStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) {
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, direction, edgeLabels));
-    }
-
-    public default GraphTraversal<S, Vertex> out(final String... edgeLabels) {
-        return this.to(Direction.OUT, edgeLabels);
-    }
-
-    public default GraphTraversal<S, Vertex> in(final String... edgeLabels) {
-        return this.to(Direction.IN, edgeLabels);
-    }
-
-    public default GraphTraversal<S, Vertex> both(final String... edgeLabels) {
-        return this.to(Direction.BOTH, edgeLabels);
-    }
-
-    public default GraphTraversal<S, Edge> toE(final Direction direction, final String... edgeLabels) {
-        return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, direction, edgeLabels));
-    }
-
-    public default GraphTraversal<S, Edge> outE(final String... edgeLabels) {
-        return this.toE(Direction.OUT, edgeLabels);
-    }
-
-    public default GraphTraversal<S, Edge> inE(final String... edgeLabels) {
-        return this.toE(Direction.IN, edgeLabels);
-    }
-
-    public default GraphTraversal<S, Edge> bothE(final String... edgeLabels) {
-        return this.toE(Direction.BOTH, edgeLabels);
-    }
-
-    public default GraphTraversal<S, Vertex> toV(final Direction direction) {
-        return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), direction));
-    }
-
-    public default GraphTraversal<S, Vertex> inV() {
-        return this.toV(Direction.IN);
-    }
-
-    public default GraphTraversal<S, Vertex> outV() {
-        return this.toV(Direction.OUT);
-    }
-
-    public default GraphTraversal<S, Vertex> bothV() {
-        return this.toV(Direction.BOTH);
-    }
-
-    public default GraphTraversal<S, Vertex> otherV() {
-        return this.asAdmin().addStep(new EdgeOtherVertexStep(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, E> order() {
-        return this.order(Scope.global);
-    }
-
-    public default GraphTraversal<S, E> order(final Scope scope) {
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new OrderGlobalStep<>(this.asAdmin()) : new OrderLocalStep<>(this.asAdmin()));
-    }
-
-    public default <E2> GraphTraversal<S, ? extends Property<E2>> properties(final String... propertyKeys) {
-        return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.PROPERTY, propertyKeys));
-    }
-
-    public default <E2> GraphTraversal<S, E2> values(final String... propertyKeys) {
-        return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.VALUE, propertyKeys));
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final String... propertyKeys) {
-        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.PROPERTY, propertyKeys));
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final String... propertyKeys) {
-        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.VALUE, propertyKeys));
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
-        return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), includeTokens, PropertyType.VALUE, propertyKeys));
-    }
-
-    public default GraphTraversal<S, String> key() {
-        return this.asAdmin().addStep(new KeyStep(this.asAdmin()));
-    }
-
-    public default <E2> GraphTraversal<S, E2> value() {
-        return this.asAdmin().addStep(new PropertyValueStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, Path> path() {
-        return this.asAdmin().addStep(new PathStep<>(this.asAdmin()));
-    }
-
-    public default <E2> GraphTraversal<S, E2> back(final String stepLabel) {
-        return this.asAdmin().addStep(new BackStep<>(this.asAdmin(), stepLabel));
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
-        return (GraphTraversal) this.asAdmin().addStep(new MatchStep<E, Map<String, E2>>(this.asAdmin(), startLabel, traversals));
-    }
-
-    public default <E2> GraphTraversal<S, E2> sack() {
-        return this.asAdmin().addStep(new SackStep<>(this.asAdmin()));
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> select(final String... stepLabels) {
-        return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), stepLabels));
-    }
-
-    public default <E2> GraphTraversal<S, E2> select(final String stepLabel) {
-        return this.asAdmin().addStep(new SelectOneStep(this.asAdmin(), stepLabel));
-    }
-
-    public default <E2> GraphTraversal<S, E2> unfold() {
-        return this.asAdmin().addStep(new UnfoldStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, List<E>> fold() {
-        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin()));
-    }
-
-    public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) {
-        return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier?
-    }
-
-    public default GraphTraversal<S, Long> count() {
-        return this.count(Scope.global);
-    }
-
-    public default GraphTraversal<S, Long> count(final Scope scope) {
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new CountGlobalStep<>(this.asAdmin()) : new CountLocalStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, Double> sum() {
-        return this.sum(Scope.global);
-    }
-
-    public default GraphTraversal<S, Double> sum(final Scope scope) {
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new SumGlobalStep(this.asAdmin()) : new SumLocalStep<>(this.asAdmin()));
-    }
-
-    public default <E2 extends Number> GraphTraversal<S, E2> max() {
-        return this.max(Scope.global);
-    }
-
-    public default <E2 extends Number> GraphTraversal<S, E2> max(final Scope scope) {
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new MaxGlobalStep<E2>(this.asAdmin()) : new MaxLocalStep(this.asAdmin()));
-    }
-
-    public default <E2 extends Number> GraphTraversal<S, E2> min() {
-        return this.min(Scope.global);
-    }
-
-    public default <E2 extends Number> GraphTraversal<S, E2> min(final Scope scope) {
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new MinGlobalStep<E2>(this.asAdmin()) : new MinLocalStep(this.asAdmin()));
-    }
-
-
-    public default GraphTraversal<S, Double> mean() {
-        return this.mean(Scope.global);
-    }
-
-    public default GraphTraversal<S, Double> mean(final Scope scope) {
-        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()));
-    }
-
-    public default GraphTraversal<S, Tree> tree() {
-        return this.asAdmin().addStep(new TreeStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, Vertex> addV(final Object... keyValues) {
-        return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), keyValues));
-    }
-
-    public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
-        return this.asAdmin().addStep(new AddEdgeByPathStep(this.asAdmin(), direction, edgeLabel, stepLabel, propertyKeyValues));
-    }
-
-    public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
-        return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertex, propertyKeyValues));
-    }
-
-    public default GraphTraversal<S, Edge> addE(final Direction direction, final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
-        return this.asAdmin().addStep(new AddEdgeStep(this.asAdmin(), direction, edgeLabel, otherVertices, propertyKeyValues));
-    }
-
-    public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
-        return this.addE(Direction.IN, edgeLabel, stepLabel, propertyKeyValues);
-    }
-
-    public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
-        return this.addE(Direction.IN, edgeLabel, otherVertex, propertyKeyValues);
-    }
-
-    public default GraphTraversal<S, Edge> addInE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
-        return this.addE(Direction.IN, edgeLabel, otherVertices, propertyKeyValues);
-    }
-
-    public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
-        return this.addE(Direction.OUT, edgeLabel, stepLabel, propertyKeyValues);
-    }
-
-    public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Vertex otherVertex, final Object... propertyKeyValues) {
-        return this.addE(Direction.OUT, edgeLabel, otherVertex, propertyKeyValues);
-    }
-
-    public default GraphTraversal<S, Edge> addOutE(final String edgeLabel, final Iterator<Vertex> otherVertices, final Object... propertyKeyValues) {
-        return this.addE(Direction.OUT, edgeLabel, otherVertices, propertyKeyValues);
-    }
-
-    public default GraphTraversal<S, E> property(final String key, final Object value) {
-        return this.asAdmin().addStep(new AddPropertyStep(this.asAdmin(), key, value));
-    }
-
-    ///////////////////// FILTER STEPS /////////////////////
-
-    public default GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) {
-        return this.asAdmin().addStep(new LambdaFilterStep<>(this.asAdmin(), predicate));
-    }
-
-    public default GraphTraversal<S, E> or(final Traversal<?, ?>... orTraversals) {
-        return this.asAdmin().addStep(0 == orTraversals.length ?
-                new OrStep.OrMarker<>(this.asAdmin()) :
-                new OrStep(this.asAdmin(), Arrays.copyOf(orTraversals, orTraversals.length, Traversal.Admin[].class)));
-    }
-
-    public default GraphTraversal<S, E> and(final Traversal<?, ?>... andTraversals) {
-        return this.asAdmin().addStep(0 == andTraversals.length ?
-                new AndStep.AndMarker<>(this.asAdmin()) :
-                new AndStep(this.asAdmin(), Arrays.copyOf(andTraversals, andTraversals.length, Traversal.Admin[].class)));
-    }
-
-    public default GraphTraversal<S, E> inject(final E... injections) {
-        return this.asAdmin().addStep(new InjectStep<>(this.asAdmin(), injections));
-    }
-
-    public default GraphTraversal<S, E> dedup() {
-        return this.dedup(Scope.global);
-    }
-
-    public default GraphTraversal<S, E> dedup(final Scope scope) {
-        return this.asAdmin().addStep(scope.equals(Scope.global) ? new DedupGlobalStep<>(this.asAdmin()) : new DedupLocalStep(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, E> except(final String sideEffectKeyOrPathLabel) {
-        return this.asAdmin().addStep(new ExceptStep<E>(this.asAdmin(), sideEffectKeyOrPathLabel));
-    }
-
-    public default GraphTraversal<S, E> except(final E exceptObject) {
-        return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptObject));
-    }
-
-    public default GraphTraversal<S, E> except(final Collection<E> exceptCollection) {
-        return this.asAdmin().addStep(new ExceptStep<>(this.asAdmin(), exceptCollection));
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
-        return this.asAdmin().addStep(new WhereStep(this.asAdmin(), firstKey, secondKey, predicate));
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
-        return this.where(firstKey, secondKey, predicate);
-    }
-
-    public default <E2> GraphTraversal<S, Map<String, E2>> where(final Traversal constraint) {
-        return this.asAdmin().addStep(new WhereStep<>(this.asAdmin(), constraint.asAdmin()));
-    }
-
-    public default GraphTraversal<S, E> has(final Traversal<?, ?> hasNextTraversal) {
-        return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNextTraversal, false));
-    }
-
-    public default GraphTraversal<S, E> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
-        return this.asAdmin().addStep(new HasTraversalStep<>(this.asAdmin(), (Traversal.Admin<E, ?>) hasNotNextTraversal, true));
-    }
-
-    public default GraphTraversal<S, E> has(final String key) {
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.within)));
-    }
-
-    public default GraphTraversal<S, E> has(final String key, final Object value) {
-        return this.has(key, Compare.eq, value);
-    }
-
-    public default GraphTraversal<S, E> has(final T accessor, final Object value) {
-        return this.has(accessor.getAccessor(), value);
-    }
-
-    public default GraphTraversal<S, E> has(final String key, final BiPredicate predicate, final Object value) {
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, predicate, value)));
-    }
-
-    public default GraphTraversal<S, E> has(final T accessor, final BiPredicate predicate, final Object value) {
-        return this.has(accessor.getAccessor(), predicate, value);
-    }
-
-    public default GraphTraversal<S, E> has(final String label, final String key, final Object value) {
-        return this.has(label, key, Compare.eq, value);
-    }
-
-    public default GraphTraversal<S, E> has(final String label, final String key, final BiPredicate predicate, final Object value) {
-        return this.has(T.label, label).has(key, predicate, value);
-    }
-
-    public default GraphTraversal<S, E> hasNot(final String key) {
-        return this.asAdmin().addStep(new HasStep(this.asAdmin(), new HasContainer(key, Contains.without)));
-    }
-
-    public default GraphTraversal<S, E> hasLabel(final String... labels) {
-        return labels.length == 1 ? this.has(T.label, labels[0]) : this.has(T.label, Contains.within, Arrays.asList(labels));
-    }
-
-    public default GraphTraversal<S, E> hasId(final Object... ids) {
-        return ids.length == 1 ? this.has(T.id, ids[0]) : this.has(T.id, Contains.within, Arrays.asList(ids));
-    }
-
-    public default GraphTraversal<S, E> hasKey(final String... keys) {
-        return keys.length == 1 ? this.has(T.key, keys[0]) : this.has(T.key, Contains.within, Arrays.asList(keys));
-    }
-
-    public default GraphTraversal<S, E> hasValue(final Object... values) {
-        return values.length == 1 ? this.has(T.value, values[0]) : this.has(T.value, Contains.within, Arrays.asList(values));
-    }
-
-    public default GraphTraversal<S, E> is(final Object value) {
-        return this.is(Compare.eq, value);
-    }
-
-    public default GraphTraversal<S, E> is(final BiPredicate predicate, final Object value) {
-        return this.asAdmin().addStep(new IsStep(this.asAdmin(), predicate, value));
-    }
-
-    public default GraphTraversal<S, E> coin(final double probability) {
-        return this.asAdmin().addStep(new CoinStep<>(this.asAdmin(), probability));
-    }
-
-    public default GraphTraversal<S, E> range(final long low, final long high) {
-        return this.range(Scope.global, low, high);
-    }
-
-    public default GraphTraversal<S, E> range(final Scope scope, final long low, final long high) {
-        return this.asAdmin().addStep(scope.equals(Scope.global)
-                ? new RangeGlobalStep<>(this.asAdmin(), low, high)
-                : new RangeLocalStep<>(this.asAdmin(), low, high));
-    }
-
-    public default GraphTraversal<S, E> limit(final long limit) {
-        return this.range(Scope.global, 0, limit);
-    }
-
-    public default GraphTraversal<S, E> limit(final Scope scope, final long limit) {
-        return this.range(scope, 0, limit);
-    }
-
-    public default GraphTraversal<S, E> retain(final String sideEffectKeyOrPathLabel) {
-        return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), sideEffectKeyOrPathLabel));
-    }
-
-    public default GraphTraversal<S, E> retain(final E retainObject) {
-        return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainObject));
-    }
-
-    public default GraphTraversal<S, E> retain(final Collection<E> retainCollection) {
-        return this.asAdmin().addStep(new RetainStep<>(this.asAdmin(), retainCollection));
-    }
-
-    public default GraphTraversal<S, E> simplePath() {
-        return this.asAdmin().addStep(new SimplePathStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, E> cyclicPath() {
-        return this.asAdmin().addStep(new CyclicPathStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, E> sample(final int amountToSample) {
-        return this.sample(Scope.global, amountToSample);
-    }
-
-    public default GraphTraversal<S, E> sample(final Scope scope, final int amountToSample) {
-        return this.asAdmin().addStep(scope.equals(Scope.global)
-                ? new SampleGlobalStep<>(this.asAdmin(), amountToSample)
-                : new SampleLocalStep<>(this.asAdmin(), amountToSample));
-    }
-
-    ///////////////////// SIDE-EFFECT STEPS /////////////////////
-
-    public default GraphTraversal<S, E> sideEffect(final Consumer<Traverser<E>> consumer) {
-        return this.asAdmin().addStep(new LambdaSideEffectStep<>(this.asAdmin(), consumer));
-    }
-
-    public default <E2> GraphTraversal<S, E2> cap(final String... sideEffectKeys) {
-        return this.asAdmin().addStep(new SideEffectCapStep<>(this.asAdmin(), sideEffectKeys));
-    }
-
-    public default GraphTraversal<S, Edge> subgraph(final String sideEffectKey) {
-        return this.asAdmin().addStep(new SubgraphStep(this.asAdmin(), sideEffectKey));
-    }
-
-    public default GraphTraversal<S, E> aggregate(final String sideEffectKey) {
-        return this.asAdmin().addStep(new AggregateStep<>(this.asAdmin(), sideEffectKey));
-    }
-
-    public default GraphTraversal<S, E> group(final String sideEffectKey) {
-        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 GraphTraversal<S, E> timeLimit(final long timeLimit) {
-        return this.asAdmin().addStep(new TimeLimitStep<E>(this.asAdmin(), timeLimit));
-    }
-
-    public default GraphTraversal<S, E> tree(final String sideEffectKey) {
-        return this.asAdmin().addStep(new TreeSideEffectStep<>(this.asAdmin(), sideEffectKey));
-    }
-
-    public default <V> GraphTraversal<S, E> sack(final BiFunction<V, E, V> sackFunction) {
-        return this.asAdmin().addStep(new SackObjectStep<>(this.asAdmin(), sackFunction));
-    }
-
-    public default <V> GraphTraversal<S, E> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
-        return this.asAdmin().addStep(new SackElementValueStep(this.asAdmin(), sackOperator, elementPropertyKey));
-    }
-
-    public default GraphTraversal<S, E> store(final String sideEffectKey) {
-        return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), sideEffectKey));
-    }
-
-    public default GraphTraversal<S, E> profile() {
-        return this.asAdmin().addStep(new ProfileStep<>(this.asAdmin()));
-    }
-
-    ///////////////////// BRANCH STEPS /////////////////////
-
-    public default <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> branchTraversal) {
-        final BranchStep<E, E2, M> branchStep = new BranchStep<>(this.asAdmin());
-        branchStep.setBranchTraversal((Traversal.Admin<E, M>) branchTraversal);
-        return this.asAdmin().addStep(branchStep);
-    }
-
-    public default <M, E2> GraphTraversal<S, E2> branch(final Function<Traverser<E>, M> function) {
-        return this.branch(new MapTraverserTraversal<>(function));
-    }
-
-    public default <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) {
-        return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), (Traversal.Admin<E, M>) choiceTraversal));
-    }
-
-    public default <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
-        return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) traversalPredicate, (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice));
-    }
-
-    public default <M, E2> GraphTraversal<S, E2> choose(final Function<E, M> choiceFunction) {
-        return this.choose(new MapTraversal<>(choiceFunction));
-    }
-
-    public default <E2> GraphTraversal<S, E2> choose(final Predicate<E> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
-        return this.choose(new FilterTraversal<>(choosePredicate), trueChoice, falseChoice);
-    }
-
-    public default <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) {
-        return this.asAdmin().addStep(new UnionStep(this.asAdmin(), Arrays.copyOf(unionTraversals, unionTraversals.length, Traversal.Admin[].class)));
-    }
-
-    public default <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, E2>... coalesceTraversals) {
-        return this.asAdmin().addStep(new CoalesceStep(this.asAdmin(), Arrays.copyOf(coalesceTraversals, coalesceTraversals.length, Traversal.Admin[].class)));
-    }
-
-    public default GraphTraversal<S, E> repeat(final Traversal<?, E> repeatTraversal) {
-        return RepeatStep.addRepeatToTraversal(this, (Traversal.Admin<E, E>) repeatTraversal);
-    }
-
-    public default GraphTraversal<S, E> emit(final Traversal<?, ?> emitTraversal) {
-        return RepeatStep.addEmitToTraversal(this, (Traversal.Admin<E, ?>) emitTraversal);
-    }
-
-    public default GraphTraversal<S, E> emit(final Predicate<Traverser<E>> emitPredicate) {
-        return this.emit(new FilterTraverserTraversal<>(emitPredicate));
-    }
-
-    public default GraphTraversal<S, E> emit() {
-        return this.emit(TrueTraversal.instance());
-    }
-
-    public default GraphTraversal<S, E> until(final Traversal<?, ?> untilTraversal) {
-        return RepeatStep.addUntilToTraversal(this, (Traversal.Admin<E, ?>) untilTraversal);
-    }
-
-    public default GraphTraversal<S, E> until(final Predicate<Traverser<E>> untilPredicate) {
-        return this.until(new FilterTraverserTraversal<>(untilPredicate));
-    }
-
-    public default GraphTraversal<S, E> times(final int maxLoops) {
-        return this.until(new LoopTraversal(maxLoops));
-    }
-
-    public default <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) {
-        return this.asAdmin().addStep(new LocalStep<>(this.asAdmin(), localTraversal.asAdmin()));
-    }
-
-    ///////////////////// UTILITY STEPS /////////////////////
-
-    public default GraphTraversal<S, E> withSideEffect(final String key, final Supplier supplier) {
-        this.asAdmin().getSideEffects().registerSupplier(key, supplier);
-        return this;
-    }
-
-    public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) {
-        this.asAdmin().getSideEffects().setSack(initialValue, Optional.of(splitOperator));
-        return this;
-    }
-
-    public default <A> GraphTraversal<S, E> withSack(final Supplier<A> initialValue) {
-        this.asAdmin().getSideEffects().setSack(initialValue, Optional.empty());
-        return this;
-    }
-
-    public default <A> GraphTraversal<S, E> withSack(final A initialValue, final UnaryOperator<A> splitOperator) {
-        this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.of(splitOperator));
-        return this;
-    }
-
-    public default <A> GraphTraversal<S, E> withSack(A initialValue) {
-        this.asAdmin().getSideEffects().setSack(new ConstantSupplier<>(initialValue), Optional.empty());
-        return this;
-    }
-
-    public default GraphTraversal<S, E> withPath() {
-        return this.asAdmin().addStep(new PathIdentityStep<>(this.asAdmin()));
-    }
-
-    public default GraphTraversal<S, E> as(final String stepLabel) {
-        if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin()));
-        this.asAdmin().getEndStep().setLabel(stepLabel);
-        return this;
-    }
-
-    public default GraphTraversal<S, E> barrier() {
-        return this.asAdmin().addStep(new CollectingBarrierStep(asAdmin()) {
-            @Override
-            public void barrierConsumer(TraverserSet traverserSet) {
-
-            }
-        });
-    }
-
-    ////
-
-    public default GraphTraversal<S, E> by() {
-        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new IdentityTraversal<>());
-        return this;
-    }
-
-    public default <V> GraphTraversal<S, E> by(final Function<V, Object> functionProjection) {
-        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(functionProjection));
-        return this;
-    }
-
-    public default GraphTraversal<S, E> by(final T tokenProjection) {
-        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new MapTraversal<>(tokenProjection));
-        return this;
-    }
-
-    public default GraphTraversal<S, E> by(final String elementPropertyKey) {
-        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(new ElementValueTraversal<>(elementPropertyKey));
-        return this;
-    }
-
-    public default GraphTraversal<S, E> by(final Traversal<?, ?> byTraversal) {
-        ((TraversalParent) this.asAdmin().getEndStep()).addLocalChild(byTraversal.asAdmin());
-        return this;
-    }
-
-    ////
-
-    public default GraphTraversal<S, E> by(final Order order) {
-        ((ComparatorHolder) this.asAdmin().getEndStep()).addComparator(order);
-        return this;
-    }
-
-    public default GraphTraversal<S, E> by(final Comparator<E> comparator) {
-        ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(comparator);
-        return this;
-    }
-
-    public default <V> GraphTraversal<S, E> by(final Function<Element, V> elementFunctionProjection, final Comparator<V> elementFunctionValueComparator) {
-        ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementFunctionComparator<>(elementFunctionProjection, elementFunctionValueComparator));
-        return this;
-    }
-
-    public default <V> GraphTraversal<S, E> by(final String elementPropertyProjection, final Comparator<V> propertyValueComparator) {
-        ((ComparatorHolder<Element>) this.asAdmin().getEndStep()).addComparator(new ElementValueComparator<>(elementPropertyProjection, propertyValueComparator));
-        return this;
-    }
-
-    public default <V> GraphTraversal<S, E> by(final Traversal<?, ?> traversal, final Comparator<V> endComparator) {
-        ((ComparatorHolder<E>) this.asAdmin().getEndStep()).addComparator(new TraversalComparator(traversal.asAdmin(), endComparator));
-        return this;
-    }
-
-    ////
-
-    public default <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) {
-        ((TraversalOptionParent<M, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(pickToken, traversalOption.asAdmin());
-        return this;
-    }
-
-    public default <E2> GraphTraversal<S, E> option(final Traversal<E, E2> traversalOption) {
-        ((TraversalOptionParent<TraversalOptionParent.Pick, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(TraversalOptionParent.Pick.any, traversalOption.asAdmin());
-        return this;
-    }
-
-    ////
-
-    @Override
-    public default void remove() {
-        try {
-            this.asAdmin().applyStrategies();
-            final Step<?, E> endStep = this.asAdmin().getEndStep();
-            while (true) {
-                final Object object = endStep.next().get();
-                if (object instanceof Element)
-                    ((Element) object).remove();
-                else if (object instanceof Property)
-                    ((Property) object).remove();
-                else {
-                    throw new IllegalStateException("The following object does not have a remove() method: " + object);
-                }
-            }
-        } catch (final NoSuchElementException ignored) {
-
-        }
-    }
-
-    @Override
-    public default GraphTraversal<S, E> iterate() {
-        Traversal.super.iterate();
-        return this;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
deleted file mode 100644
index cf0de34..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/GraphTraversalSource.java
+++ /dev/null
@@ -1,138 +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;
-
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSource;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexStartStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Transaction;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class GraphTraversalSource implements TraversalSource {
-
-    public static final Builder standard = GraphTraversalSource.build().engine(StandardTraversalEngine.build());
-    public static final Builder computer = GraphTraversalSource.build().engine(ComputerTraversalEngine.build());
-
-    public static Builder computer(final Class<? extends GraphComputer> graphComputerClass) {
-        return GraphTraversalSource.build().engine(ComputerTraversalEngine.build().computer(graphComputerClass));
-    }
-
-    ////
-
-    private final transient Graph graph;
-    private final TraversalEngine.Builder engine;
-    private final TraversalStrategies strategies;
-
-    public GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engine, final TraversalStrategy... strategies) {
-        this.graph = graph;
-        this.engine = engine;
-        final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass());
-        this.strategies = strategies.length == 0 ? tempStrategies : tempStrategies.clone().addStrategies(strategies);
-    }
-
-    public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) {
-        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
-        traversal.setEngine(this.engine.create(this.graph));
-        traversal.setStrategies(this.strategies);
-        return traversal.addStep(new AddVertexStartStep(traversal, keyValues));
-    }
-
-    public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) {
-        final GraphTraversal.Admin<Vertex, Vertex> traversal = new DefaultGraphTraversal<>(this.graph);
-        traversal.setEngine(this.engine.create(this.graph));
-        traversal.setStrategies(this.strategies);
-        return traversal.addStep(new GraphStep<>(traversal, Vertex.class, vertexIds));
-    }
-
-    public GraphTraversal<Edge, Edge> E(final Object... edgesIds) {
-        final GraphTraversal.Admin<Edge, Edge> traversal = new DefaultGraphTraversal<>(this.graph);
-        traversal.setEngine(this.engine.create(this.graph));
-        traversal.setStrategies(this.strategies);
-        return traversal.addStep(new GraphStep<>(traversal, Edge.class, edgesIds));
-    }
-
-    public Transaction tx() {
-        return this.graph.tx();
-    }
-
-    public static Builder build() {
-        return new Builder();
-    }
-
-
-    @Override
-    public Optional<GraphComputer> getGraphComputer() {
-        return this.engine.create(this.graph).getGraphComputer();
-    }
-
-    @Override
-    public Optional<Graph> getGraph() {
-        return Optional.ofNullable(this.graph);
-    }
-
-    @Override
-    public GraphTraversalSource.Builder asBuilder() {
-        final GraphTraversalSource.Builder builder = GraphTraversalSource.build().engine(this.engine);
-        this.strategies.toList().forEach(builder::strategy);
-        return builder;
-    }
-
-    @Override
-    public String toString() {
-        return StringFactory.traversalSourceString(this);
-    }
-
-    //////
-
-    public static class Builder implements TraversalSource.Builder<GraphTraversalSource> {
-
-        private TraversalEngine.Builder engineBuilder = StandardTraversalEngine.build();
-        private List<TraversalStrategy> strategies = new ArrayList<>();
-
-        public Builder engine(final TraversalEngine.Builder engineBuilder) {
-            this.engineBuilder = engineBuilder;
-            return this;
-        }
-
-        public Builder strategy(final TraversalStrategy strategy) {
-            this.strategies.add(strategy);
-            return this;
-        }
-
-        public GraphTraversalSource create(final Graph graph) {
-            return new GraphTraversalSource(graph, this.engineBuilder, this.strategies.toArray(new TraversalStrategy[this.strategies.size()]));
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index b613596..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/__.java
+++ /dev/null
@@ -1,602 +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;
-
-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.process.graph.util.Tree;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
-
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-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)
- */
-public class __ {
-
-    protected __() {
-    }
-
-    //////////////////////////////////////////////////////////////////////
-
-    public static <A> GraphTraversal<A, A> start() {
-        return new DefaultGraphTraversal<>(EmptyGraph.instance());
-    }
-
-    public static <A> GraphTraversal<A, A> __(final Object... starts) {
-        return inject(starts);
-    }
-
-    ///////////////////// MAP STEPS /////////////////////
-
-    public static <A, E2> GraphTraversal<A, E2> map(final Function<Traverser<A>, E2> function) {
-        return __.<A>start().map(function);
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> flatMap(final Function<Traverser<A>, Iterator<E2>> function) {
-        return __.<A>start().flatMap(function);
-    }
-
-    public static <A> GraphTraversal<A, A> identity() {
-        return __.<A>start().identity();
-    }
-
-    public static <A> GraphTraversal<A, String> label() {
-        return __.<A>start().label();
-    }
-
-    public static <A> GraphTraversal<A, Object> id() {
-        return __.<A>start().id();
-    }
-
-    public static <A> GraphTraversal<A, Vertex> to(final Direction direction, final String... edgeLabels) {
-        return __.<A>start().to(direction, edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Vertex> out(final String... edgeLabels) {
-        return __.<A>start().out(edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Vertex> in(final String... edgeLabels) {
-        return __.<A>start().in(edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Vertex> both(final String... edgeLabels) {
-        return __.<A>start().both(edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Edge> toE(final Direction direction, final String... edgeLabels) {
-        return __.<A>start().toE(direction, edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Edge> outE(final String... edgeLabels) {
-        return __.<A>start().outE(edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Edge> inE(final String... edgeLabels) {
-        return __.<A>start().inE(edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Edge> bothE(final String... edgeLabels) {
-        return __.<A>start().bothE(edgeLabels);
-    }
-
-    public static <A> GraphTraversal<A, Vertex> toV(final Direction direction) {
-        return __.<A>start().toV(direction);
-    }
-
-    public static <A> GraphTraversal<A, Vertex> inV() {
-        return __.<A>start().inV();
-    }
-
-    public static <A> GraphTraversal<A, Vertex> outV() {
-        return __.<A>start().outV();
-    }
-
-    public static <A> GraphTraversal<A, Vertex> bothV() {
-        return __.<A>start().bothV();
-    }
-
-    public static <A> GraphTraversal<A, Vertex> otherV() {
-        return __.<A>start().otherV();
-    }
-
-    public static <A> GraphTraversal<A, A> order() {
-        return __.<A>start().order();
-    }
-
-    public static <A> GraphTraversal<A, A> order(final Scope scope) {
-        return __.<A>start().order(scope);
-    }
-
-    public static <A, E2> GraphTraversal<A, ? extends Property<E2>> properties(final String... propertyKeys) {
-        return __.<A>start().properties(propertyKeys);
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> values(final String... propertyKeys) {
-        return __.<A>start().values(propertyKeys);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> propertyMap(final String... propertyKeys) {
-        return __.<A>start().propertyMap(propertyKeys);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final String... propertyKeys) {
-        return __.<A>start().valueMap(propertyKeys);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) {
-        return __.<A>start().valueMap(includeTokens, propertyKeys);
-    }
-
-    public static <A> GraphTraversal<A, String> key() {
-        return __.<A>start().key();
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> value() {
-        return __.<A>start().value();
-    }
-
-    public static <A> GraphTraversal<A, Path> path() {
-        return __.<A>start().path();
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> back(final String stepLabel) {
-        return __.<A>start().back(stepLabel);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> match(final String startLabel, final Traversal... traversals) {
-        return __.<A>start().match(startLabel, traversals);
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> sack() {
-        return __.<A>start().sack();
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> select(final String stepLabel) {
-        return __.<A>start().select(stepLabel);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> select(final String... stepLabels) {
-        return __.<A>start().select(stepLabels);
-    }
-
-    public static <A> GraphTraversal<A, A> unfold() {
-        return __.<A>start().unfold();
-    }
-
-    public static <A> GraphTraversal<A, List<A>> fold() {
-        return __.<A>start().fold();
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> fold(final E2 seed, final BiFunction<E2, A, E2> foldFunction) {
-        return __.<A>start().fold(seed, foldFunction);
-    }
-
-    public static <A> GraphTraversal<A, Long> count() {
-        return __.<A>start().count();
-    }
-
-    public static <A> GraphTraversal<A, Long> count(final Scope scope) {
-        return __.<A>start().count(scope);
-    }
-
-    public static <A> GraphTraversal<A, Double> sum() {
-        return __.<A>start().sum();
-    }
-
-    public static <A> GraphTraversal<A, Double> sum(final Scope scope) {
-        return __.<A>start().sum(scope);
-    }
-
-
-    public static <A, E2 extends Number> GraphTraversal<A, E2> min() {
-        return __.<A>start().min();
-    }
-
-    public static <A, E2 extends Number> GraphTraversal<A, E2> min(final Scope scope) {
-        return __.<A>start().min(scope);
-    }
-
-    public static <A, E2 extends Number> GraphTraversal<A, E2> max() {
-        return __.<A>start().max();
-    }
-
-    public static <A, E2 extends Number> GraphTraversal<A, E2> max(final Scope scope) {
-        return __.<A>start().max(scope);
-    }
-
-    public static <A> GraphTraversal<A, Double> mean() {
-        return __.<A>start().mean();
-    }
-
-    public static <A> GraphTraversal<A, Double> mean(final Scope scope) {
-        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();
-    }
-
-    public static <A> GraphTraversal<A, Tree> tree() {
-        return __.<A>start().tree();
-    }
-
-    public static <A> GraphTraversal<A, Vertex> addV(final Object... propertyKeyValues) {
-        return __.<A>start().addV(propertyKeyValues);
-    }
-
-    public static <A> GraphTraversal<A, Edge> addE(final Direction direction, final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
-        return __.<A>start().addE(direction, edgeLabel, stepLabel, propertyKeyValues);
-    }
-
-    public static <A> GraphTraversal<A, Edge> addInE(final String edgeLabel, final String setLabel, final Object... propertyKeyValues) {
-        return __.<A>start().addInE(edgeLabel, setLabel, propertyKeyValues);
-    }
-
-    public static <A> GraphTraversal<A, Edge> addOutE(final String edgeLabel, final String stepLabel, final Object... propertyKeyValues) {
-        return __.<A>start().addOutE(edgeLabel, stepLabel, propertyKeyValues);
-    }
-
-    public static <A> GraphTraversal<A, A> property(final String key, final Object value) {
-        return __.<A>start().property(key, value);
-    }
-
-    ///////////////////// FILTER STEPS /////////////////////
-
-    public static <A> GraphTraversal<A, A> filter(final Predicate<Traverser<A>> predicate) {
-        return __.<A>start().filter(predicate);
-    }
-
-    public static <A> GraphTraversal<A, A> and(final Traversal<?, ?>... andTraversals) {
-        return __.<A>start().and(andTraversals);
-    }
-
-    public static <A> GraphTraversal<A, A> or(final Traversal<?, ?>... orTraversals) {
-        return __.<A>start().or(orTraversals);
-    }
-
-    public static <A> GraphTraversal<A, A> inject(final Object... injections) {
-        return __.<A>start().inject((A[]) injections);
-    }
-
-    public static <A> GraphTraversal<A, A> dedup() {
-        return __.<A>start().dedup();
-    }
-
-    public static <A> GraphTraversal<A, A> dedup(final Scope scope) {
-        return __.<A>start().dedup(scope);
-    }
-
-    public static <A> GraphTraversal<A, A> except(final String sideEffectKeyOrPathLabel) {
-        return __.<A>start().except(sideEffectKeyOrPathLabel);
-    }
-
-    public static <A> GraphTraversal<A, A> except(final Object exceptObject) {
-        return __.<A>start().except((A) exceptObject);
-    }
-
-    public static <A> GraphTraversal<A, A> except(final Collection<A> exceptCollection) {
-        return __.<A>start().except(exceptCollection);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final Traversal<?, ?> hasNextTraversal) {
-        return __.<A>start().has(hasNextTraversal);
-    }
-
-    public static <A> GraphTraversal<A, A> hasNot(final Traversal<?, ?> hasNotNextTraversal) {
-        return __.<A>start().hasNot(hasNotNextTraversal);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final String key) {
-        return __.<A>start().has(key);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final String key, final Object value) {
-        return __.<A>start().has(key, value);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final T accessor, final Object value) {
-        return __.<A>start().has(accessor, value);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final String key, final BiPredicate predicate, final Object value) {
-        return __.<A>start().has(key, predicate, value);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final T accessor, final BiPredicate predicate, final Object value) {
-        return __.<A>start().has(accessor, predicate, value);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final String label, final String key, final Object value) {
-        return __.<A>start().has(label, key, value);
-    }
-
-    public static <A> GraphTraversal<A, A> has(final String label, final String key, final BiPredicate predicate, final Object value) {
-        return __.<A>start().has(label, key, predicate, value);
-    }
-
-    public static <A> GraphTraversal<A, A> hasNot(final String key) {
-        return __.<A>start().hasNot(key);
-    }
-
-    public static <A> GraphTraversal<A, A> hasLabel(final String... labels) {
-        return __.<A>start().hasLabel(labels);
-    }
-
-    public static <A> GraphTraversal<A, A> hasId(final Object... ids) {
-        return __.<A>start().hasId(ids);
-    }
-
-    public static <A> GraphTraversal<A, A> hasKey(final String... keys) {
-        return __.<A>start().hasKey(keys);
-    }
-
-    public static <A> GraphTraversal<A, A> hasValue(final Object... values) {
-        return __.<A>start().hasValue(values);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final String secondKey, final BiPredicate predicate) {
-        return __.<A>start().where(firstKey, secondKey, predicate);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final String firstKey, final BiPredicate predicate, final String secondKey) {
-        return __.<A>start().where(firstKey, predicate, secondKey);
-    }
-
-    public static <A, E2> GraphTraversal<A, Map<String, E2>> where(final Traversal constraint) {
-        return __.<A>start().where(constraint);
-    }
-
-    public static <A> GraphTraversal<A, A> is(final Object value) {
-        return __.<A>start().is(value);
-    }
-
-    public static <A> GraphTraversal<A, A> is(final BiPredicate predicate, final Object value) {
-        return __.<A>start().is(predicate, value);
-    }
-
-    public static <A> GraphTraversal<A, A> coin(final double probability) {
-        return __.<A>start().coin(probability);
-    }
-
-    public static <A> GraphTraversal<A, A> range(final long low, final long high) {
-        return __.<A>start().range(low, high);
-    }
-
-    public static <A> GraphTraversal<A, A> range(final Scope scope, final long low, final long high) {
-        return __.<A>start().range(scope, low, high);
-    }
-
-    public static <A> GraphTraversal<A, A> limit(final long limit) {
-        return __.<A>start().limit(limit);
-    }
-
-    public static <A> GraphTraversal<A, A> limit(final Scope scope, final long limit) {
-        return __.<A>start().limit(scope, limit);
-    }
-
-    public static <A> GraphTraversal<A, A> retain(final String sideEffectKeyOrPathLabel) {
-        return __.<A>start().retain(sideEffectKeyOrPathLabel);
-    }
-
-    public static <A> GraphTraversal<A, A> retain(final Object retainObject) {
-        return __.<A>start().retain((A) retainObject);
-    }
-
-    public static <A> GraphTraversal<A, A> retain(final Collection<A> retainCollection) {
-        return __.<A>start().retain(retainCollection);
-    }
-
-    public static <A> GraphTraversal<A, A> simplePath() {
-        return __.<A>start().simplePath();
-    }
-
-    public static <A> GraphTraversal<A, A> cyclicPath() {
-        return __.<A>start().cyclicPath();
-    }
-
-    public static <A> GraphTraversal<A, A> sample(final int amountToSample) {
-        return __.<A>start().sample(amountToSample);
-    }
-
-    public static <A> GraphTraversal<A, A> sample(final Scope scope, final int amountToSample) {
-        return __.<A>start().sample(scope, amountToSample);
-    }
-
-    ///////////////////// SIDE-EFFECT STEPS /////////////////////
-
-    public static <A> GraphTraversal<A, A> sideEffect(final Consumer<Traverser<A>> consumer) {
-        return __.<A>start().sideEffect(consumer);
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> cap(final String... sideEffectKeys) {
-        return __.<A>start().cap(sideEffectKeys);
-    }
-
-    public static <A> GraphTraversal<A, Edge> subgraph(final String sideEffectKey) {
-        return __.<A>start().subgraph(sideEffectKey);
-    }
-
-    public static <A> GraphTraversal<A, A> aggregate(final String sideEffectKey) {
-        return __.<A>start().aggregate(sideEffectKey);
-    }
-
-    public static <A> GraphTraversal<A, A> group(final String sideEffectKey) {
-        return __.<A>start().group(sideEffectKey);
-    }
-
-    public static <A> GraphTraversal<A, A> groupCount(final String sideEffectKey) {
-        return __.<A>start().groupCount(sideEffectKey);
-    }
-
-    public static <A> GraphTraversal<A, A> timeLimit(final long timeLimit) {
-        return __.<A>start().timeLimit(timeLimit);
-    }
-
-    public static <A> GraphTraversal<A, A> tree(final String sideEffectKey) {
-        return __.<A>start().tree(sideEffectKey);
-    }
-
-    public static <A, V> GraphTraversal<A, A> sack(final BiFunction<V, A, V> sackFunction) {
-        return __.<A>start().sack(sackFunction);
-    }
-
-    public static <A, V> GraphTraversal<A, A> sack(final BinaryOperator<V> sackOperator, final String elementPropertyKey) {
-        return __.<A>start().sack(sackOperator, elementPropertyKey);
-    }
-
-    public static <A> GraphTraversal<A, A> store(final String sideEffectKey) {
-        return __.<A>start().store(sideEffectKey);
-    }
-
-    ///////////////////// BRANCH STEPS /////////////////////
-
-    public static <A, M, E2> GraphTraversal<A, E2> branch(final Function<Traverser<A>, M> function) {
-        return __.<A>start().branch(function);
-    }
-
-    public static <A, M, E2> GraphTraversal<A, E2> branch(final Traversal<?, M> traversalFunction) {
-        return __.<A>start().branch(traversalFunction);
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> choose(final Predicate<A> choosePredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
-        return __.<A>start().choose(choosePredicate, trueChoice, falseChoice);
-    }
-
-    public static <A, M, E2> GraphTraversal<A, E2> choose(final Function<A, M> choiceFunction) {
-        return __.<A>start().choose(choiceFunction);
-    }
-
-    public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalFunction) {
-        return __.<A>start().choose(traversalFunction);
-    }
-
-    public static <A, M, E2> GraphTraversal<A, E2> choose(final Traversal<?, M> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) {
-        return __.<A>start().choose(traversalPredicate, trueChoice, falseChoice);
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> union(final Traversal<?, E2>... traversals) {
-        return __.<A>start().union(traversals);
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> coalesce(final Traversal<?, E2>... traversals) {
-        return __.<A>start().coalesce(traversals);
-    }
-
-    public static <A> GraphTraversal<A, A> repeat(final Traversal<?, A> traversal) {
-        return __.<A>start().repeat(traversal);
-    }
-
-    public static <A> GraphTraversal<A, A> emit(final Traversal<?, ?> emitTraversal) {
-        return __.<A>start().emit(emitTraversal);
-    }
-
-    public static <A> GraphTraversal<A, A> emit(final Predicate<Traverser<A>> emitPredicate) {
-        return __.<A>start().emit(emitPredicate);
-    }
-
-    public static <A> GraphTraversal<A, A> until(final Traversal<?, ?> untilTraversal) {
-        return __.<A>start().until(untilTraversal);
-    }
-
-    public static <A> GraphTraversal<A, A> until(final Predicate<Traverser<A>> untilPredicate) {
-        return __.<A>start().until(untilPredicate);
-    }
-
-    public static <A> GraphTraversal<A, A> times(final int maxLoops) {
-        return __.<A>start().times(maxLoops);
-    }
-
-    public static <A> GraphTraversal<A, A> emit() {
-        return __.<A>start().emit();
-    }
-
-    public static <A, E2> GraphTraversal<A, E2> local(final Traversal<?, E2> localTraversal) {
-        return __.<A>start().local(localTraversal);
-    }
-
-    ///////////////////// UTILITY STEPS /////////////////////
-
-    public static <A> GraphTraversal<A, A> as(final String label) {
-        return __.<A>start().as(label);
-    }
-
-    public static <A> GraphTraversal<A, A> profile() {
-        return __.<A>start().profile();
-    }
-
-    public static <A> GraphTraversal<A, A> withSideEffect(final String key, final Supplier supplier) {
-        return __.<A>start().withSideEffect(key, supplier);
-    }
-
-    public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue, final UnaryOperator<B> splitOperator) {
-        return __.<A>start().withSack(initialValue, splitOperator);
-    }
-
-    public static <A, B> GraphTraversal<A, A> withSack(final Supplier<B> initialValue) {
-        return __.<A>start().withSack(initialValue);
-    }
-
-    public static <A, B> GraphTraversal<A, A> withSack(final B initialValue, final UnaryOperator<B> splitOperator) {
-        return __.<A>start().withSack(initialValue, splitOperator);
-    }
-
-    public static <A, B> GraphTraversal<A, A> withSack(B initialValue) {
-        return __.<A>start().withSack(initialValue);
-    }
-
-    public static <A> GraphTraversal<A, A> withPath() {
-        return __.<A>start().withPath();
-    }
-
-    public static <A> GraphTraversal<A, A> barrier() {
-        return __.<A>start().barrier();
-    }
-
-    ////
-
-    public static <A> GraphTraversal<A, A> iterate() {
-        return __.<A>start().iterate();
-    }
-
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java
deleted file mode 100644
index fdc03fa..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/lambda/LoopTraversal.java
+++ /dev/null
@@ -1,50 +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.lambda;
-
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.lambda.AbstractLambdaTraversal;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class LoopTraversal<S, E> extends AbstractLambdaTraversal<S, E> {
-
-    private final long maxLoops;
-    private boolean allow = false;
-
-    public LoopTraversal(final long maxLoops) {
-        this.maxLoops = maxLoops;
-    }
-
-    @Override
-    public boolean hasNext() {
-        return this.allow;
-    }
-
-    @Override
-    public void addStart(final Traverser<S> start) {
-        this.allow = start.loops() >= this.maxLoops;
-    }
-
-    @Override
-    public String toString() {
-        return "loops(" + this.maxLoops + ')';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java
deleted file mode 100644
index 474c994..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/ComparatorHolder.java
+++ /dev/null
@@ -1,33 +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;
-
-import java.util.Comparator;
-import java.util.List;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface ComparatorHolder<S> {
-
-    public void addComparator(final Comparator<S> comparator);
-
-    public List<Comparator<S>> getComparators();
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java
deleted file mode 100644
index 52db804..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/HasContainerHolder.java
+++ /dev/null
@@ -1,33 +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;
-
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-
-import java.util.List;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface HasContainerHolder {
-
-    public List<HasContainer> getHasContainers();
-
-    public void addHasContainer(final HasContainer hasContainer);
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java
deleted file mode 100644
index ad7761b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Mutating.java
+++ /dev/null
@@ -1,28 +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;
-
-/**
- * A marker interface for steps that modify the graph.
- *
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public interface Mutating {
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java
deleted file mode 100644
index 6263b96..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/Ranging.java
+++ /dev/null
@@ -1,30 +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;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Ranging {
-
-    public long getLowRange();
-
-    public long getHighRange();
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java
deleted file mode 100644
index 9ad7d87..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/SideEffectCapable.java
+++ /dev/null
@@ -1,28 +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;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface SideEffectCapable {
-
-    public String getSideEffectKey();
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java
deleted file mode 100644
index dbea36a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/TraversalOptionParent.java
+++ /dev/null
@@ -1,32 +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;
-
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalOptionParent<M, S, E> extends TraversalParent {
-
-    public static enum Pick {any, none}
-
-    public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption);
-}


[06/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java
new file mode 100644
index 0000000..628902f
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/IsTest.java
@@ -0,0 +1,125 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class IsTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X();
+
+    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X();
+
+    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
+
+    public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
+
+    public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_valuesXageX_isX32X() {
+        Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isX32X();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        assertEquals(Integer.valueOf(32), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_valuesXageX_isXlte_30X() {
+        Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXlte_30X();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList(27, 29), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+        Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList(29, 32), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+        Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        assertEquals("ripple", traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+        Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        assertEquals("lop", traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends IsTest {
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
+            return g.V().<Integer>values("age").is(32);
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
+            return g.V().<Integer>values("age").is(Compare.lte, 30);
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+            return g.V().<Integer>values("age").is(Compare.gte, 29).is(Compare.lt, 34);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+            return g.V().has(in("created").count().is(1l)).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+            return g.V().has(in("created").count().is(Compare.gte, 2l)).values("name");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java
new file mode 100644
index 0000000..c1f73eb
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/OrTest.java
@@ -0,0 +1,77 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class OrTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
+
+    public abstract Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+        final Traversal<Vertex, String> traversal = get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("marko", "ripple", "lop", "peter"), traversal);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends OrTest {
+        @Override
+        public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+            return g.V().or(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+            return g.V().or(outE("knows"), has(T.label, "software").or().has("age", Compare.gte, 35)).values("name");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
new file mode 100644
index 0000000..31c8be3
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeTest.java
@@ -0,0 +1,265 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Ignore;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class RangeTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X();
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_out_limitX2X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_limitX2X(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            traversal.next();
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_localXoutE_limitX1X_inVX_limitX3X();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            traversal.next();
+        }
+        assertEquals(3, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String name = traversal.next().value("name");
+            assertTrue(name.equals("lop") || name.equals("ripple"));
+        }
+        assertEquals(1, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String name = traversal.next().value("name");
+            assertTrue(name.equals("lop") || name.equals("ripple"));
+        }
+        assertEquals(1, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String name = traversal.next().value("name");
+            assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final String name = traversal.next().value("name");
+            assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            traversal.next();
+            counter++;
+        }
+        assertEquals(6, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @Ignore("This should not work cause fold kills the path history")
+    public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            final Map<String, Object> map = traversal.next();
+            final List<Double> weights = (List<Double>) map.get("w");
+            if (map.get("s").equals("lop")) {
+                assertEquals(1, weights.size());
+                assertTrue(Arrays.asList(0.4, 0.2).contains(weights.get(0)));
+            } else if (map.get("s").equals("ripple")) {
+                assertEquals(1, weights.size());
+                assertEquals(1.0, weights.get(0), 0.0);
+            } else {
+                assertTrue(false);
+            }
+            counter++;
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @Ignore("This should not work cause fold kills the path history")
+    public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            final Map<String, Object> map = traversal.next();
+            final List<Double> weights = (List<Double>) map.get("w");
+            if (map.get("s").equals("lop")) {
+                assertEquals(2, weights.size());
+                assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(0)));
+                assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(1)));
+                assertNotEquals(weights.get(0), weights.get(1));
+            } else if (map.get("s").equals("ripple")) {
+                assertEquals(0, weights.size());
+            } else {
+                assertTrue(false);
+            }
+            counter++;
+        }
+        assertEquals(2, counter);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends RangeTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
+            return g.V(v1Id).out().limit(2);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
+            return g.V().local(outE().limit(1)).inV().limit(3);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
+            return g.V(v1Id).out("knows").outE("created").range(0, 1).inV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
+            return g.V(v1Id).out("knows").out("created").range(0, 1);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
+            return g.V(v1Id).out("created").in("created").range(1, 3);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
+            return g.V(v1Id).out("created").inE("created").range(1, 3).outV();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+            return g.V().repeat(both()).times(3).range(5, 11);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+            return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().limit(Scope.local, 1)).as("w").select().by("name").by();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+            return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().range(Scope.local, 1, 3)).as("w").select().by("name").by();
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java
new file mode 100644
index 0000000..aecfb9d
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RetainTest.java
@@ -0,0 +1,93 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class RetainTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id);
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_VX1X_out_retainXg_v2X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_retainXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
+        printTraversalForm(traversal);
+        assertEquals("vadas", traversal.next().<String>value("name"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_out_aggregateXxX_out_retainXxX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_retainXxX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertEquals("lop", traversal.next().<String>value("name"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertEquals("marko", traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends RetainTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
+            return g.V(v1Id).out().retain(g.V(v2Id).next());
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
+            return g.V(v1Id).out().aggregate("x").out().retain("x");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
+            return g.V(v1Id).as("a").out("created").in("created").retain("a").values("name");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java
new file mode 100644
index 0000000..de80f32
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SampleTest.java
@@ -0,0 +1,147 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Collection;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SampleTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Edge, Edge> get_g_E_sampleX1X();
+
+    public abstract Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX();
+
+    public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX();
+
+    public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
+
+    public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_E_sampleX1X() {
+        final Traversal<Edge, Edge> traversal = get_g_E_sampleX1X();
+        assertTrue(traversal.hasNext());
+        traversal.next();
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_E_sampleX2X_byXweightX() {
+        final Traversal<Edge, Edge> traversal = get_g_E_sampleX2X_byXweightX();
+        assertTrue(traversal.hasNext());
+        traversal.next();
+        assertTrue(traversal.hasNext());
+        traversal.next();
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_localXoutE_sampleX1X_byXweightXX() {
+        final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_sampleX1X_byXweightXX();
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            traversal.next();
+        }
+        assertEquals(3, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
+        final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
+                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Collection<Double>> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertEquals(2, map.get("software").size());
+        assertEquals(2, map.get("person").size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
+        final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
+                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        final Map<String, Collection<Double>> map = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(2, map.size());
+        assertEquals(4, map.get("software").size());
+        assertEquals(5, map.get("person").size());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends SampleTest {
+        @Override
+        public Traversal<Edge, Edge> get_g_E_sampleX1X() {
+            return g.E().sample(1);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
+            return g.E().sample(2).by("weight");
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
+            return g.V().local(outE().sample(1).by("weight"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
+            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().<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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java
new file mode 100644
index 0000000..61a7734
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/SimplePathTest.java
@@ -0,0 +1,86 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SimplePathTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id);
+
+    public abstract Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outXcreatedX_inXcreatedX_simplePath() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Vertex vertex = traversal.next();
+            assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("peter"));
+        }
+        assertEquals(2, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_repeatXboth_simplePathX_timesX3X_path() {
+        final Traversal<Vertex, Path> traversal = get_g_V_repeatXboth_simplePathX_timesX3X_path();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertTrue(traversal.next().isSimple());
+        }
+        assertEquals(18, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends SimplePathTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
+            return g.V(v1Id).out("created").in("created").simplePath();
+        }
+
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
+            return g.V().repeat(both().simplePath()).times(3).path();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
new file mode 100644
index 0000000..da75411
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTest.java
@@ -0,0 +1,161 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class WhereTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
+
+    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Map<String, Object> map = traversal.next();
+            assertEquals(2, map.size());
+            assertTrue(map.containsKey("a"));
+            assertTrue(map.containsKey("b"));
+            assertEquals(map.get("a"), map.get("b"));
+        }
+        assertEquals(6, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_b_neqX() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Map<String, Object> map = traversal.next();
+            assertEquals(2, map.size());
+            assertTrue(map.containsKey("a"));
+            assertTrue(map.containsKey("b"));
+            assertNotEquals(map.get("a"), map.get("b"));
+            assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("marko")) ||
+                    ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")) ||
+                    ((Vertex) map.get("a")).id().equals(convertToVertexId("josh")));
+            assertTrue(((Vertex) map.get("b")).id().equals(convertToVertexId("marko")) ||
+                    ((Vertex) map.get("b")).id().equals(convertToVertexId("peter")) ||
+                    ((Vertex) map.get("b")).id().equals(convertToVertexId("josh")));
+        }
+        assertEquals(6, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        int markoCounter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Map<String, Object> map = traversal.next();
+            assertEquals(2, map.size());
+            assertTrue(map.containsKey("a"));
+            assertTrue(map.containsKey("b"));
+            assertEquals(convertToVertexId("marko"), ((Vertex) map.get("b")).id());
+            if (((Vertex) map.get("a")).id().equals(convertToVertexId("marko")))
+                markoCounter++;
+            else
+                assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("josh")) || ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")));
+        }
+        assertEquals(3, markoCounter);
+        assertEquals(5, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Map<String, Object> map = traversal.next();
+            assertEquals(2, map.size());
+            assertTrue(map.containsKey("a"));
+            assertTrue(map.containsKey("b"));
+            assertEquals(convertToVertexId("marko"), ((Vertex) map.get("a")).id());
+            assertEquals(convertToVertexId("josh"), ((Vertex) map.get("b")).id());
+        }
+        assertEquals(1, counter);
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends WhereTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+            return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.eq, "b");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
+            return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.neq, "b");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+            return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("b").has("name", "marko"));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+            return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("a").out("knows").as("b"));
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
new file mode 100644
index 0000000..3f790b8
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeTest.java
@@ -0,0 +1,130 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
+import org.apache.tinkerpop.gremlin.FeatureRequirement;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class AddEdgeTest extends AbstractGremlinTest {
+
+    public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+    public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int count = 0;
+        while (traversal.hasNext()) {
+            final Edge edge = traversal.next();
+            assertEquals("createdBy", edge.label());
+            assertEquals(0, IteratorUtils.count(edge.properties()));
+            count++;
+
+        }
+        assertEquals(1, count);
+        assertEquals(7, IteratorUtils.count(graph.edges()));
+        assertEquals(6, IteratorUtils.count(graph.vertices()));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+    public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int count = 0;
+        while (traversal.hasNext()) {
+            final Edge edge = traversal.next();
+            assertEquals("createdBy", edge.label());
+            assertEquals(2, edge.<Integer>value("weight").intValue());
+            assertEquals(1, IteratorUtils.count(edge.properties()));
+            count++;
+
+
+        }
+        assertEquals(1, count);
+        assertEquals(7, IteratorUtils.count(graph.edges()));
+        assertEquals(6, IteratorUtils.count(graph.vertices()));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
+    public void g_V_addOutEXexistsWith__g_V__time_nowX() {
+        final Traversal<Vertex, Edge> traversal = get_g_V_addOutEXexistsWith__g_V__time_nowX();
+        printTraversalForm(traversal);
+        int count = 0;
+        while (traversal.hasNext()) {
+            final Edge edge = traversal.next();
+            assertEquals("existsWith", edge.label());
+            assertEquals("now", edge.value("time"));
+            assertEquals(1, IteratorUtils.count(edge.properties()));
+            count++;
+        }
+        assertEquals(36, count);
+        assertEquals(42, IteratorUtils.count(graph.edges()));
+        for (final Vertex vertex : IteratorUtils.list(graph.vertices())) {
+            assertEquals(6, IteratorUtils.count(vertex.edges(Direction.OUT, "existsWith")));
+            assertEquals(6, IteratorUtils.count(vertex.edges(Direction.IN, "existsWith")));
+        }
+        assertEquals(6, IteratorUtils.count(graph.vertices()));
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class Traversals extends AddEdgeTest {
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
+            return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a");
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id) {
+            return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a", "weight", 2);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
+            return g.V().addOutE("existsWith", g.V(), "time", "now");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
new file mode 100644
index 0000000..284633b
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
@@ -0,0 +1,91 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
+import org.apache.tinkerpop.gremlin.FeatureRequirement;
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AddVertexTest extends AbstractGremlinTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X();
+
+    public abstract Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    public void g_V_addVXlabel_animal_age_0X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_addVXlabel_animal_age_0X();
+        printTraversalForm(traversal);
+        int count = 0;
+        while (traversal.hasNext()) {
+            final Vertex vertex = traversal.next();
+            assertEquals("animal", vertex.label());
+            assertEquals(0, vertex.<Integer>value("age").intValue());
+            count++;
+        }
+        assertEquals(12, IteratorUtils.count(graph.vertices()));
+        assertEquals(6, count);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    public void g_addVXlabel_person_name_stephenX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_addVXlabel_person_name_stephenX();
+        printTraversalForm(traversal);
+        final Vertex stephen = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals("person", stephen.label());
+        assertEquals("stephen", stephen.value("name"));
+        assertEquals(1, IteratorUtils.count(stephen.properties()));
+        assertEquals(7, IteratorUtils.count(graph.vertices()));
+    }
+
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class Traversals extends AddVertexTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
+            return g.V().addV(T.label, "animal", "age", 0);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
+            return g.addV(T.label, "person", "name", "stephen");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java
new file mode 100644
index 0000000..631d2dc
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/BackTest.java
@@ -0,0 +1,220 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
+import static org.junit.Assert.*;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class BackTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX();
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_asXhereX_out_backXhereX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXhereX_out_backXhereX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            assertEquals("marko", traversal.next().<String>value("name"));
+        }
+        assertEquals(3, counter);
+    }
+
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            final Vertex vertex = traversal.next();
+            assertEquals("java", vertex.<String>value("lang"));
+            assertTrue(vertex.value("name").equals("ripple") || vertex.value("name").equals("lop"));
+        }
+        assertEquals(2, counter);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX() {
+        final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        final Edge edge = traversal.next();
+        assertEquals("knows", edge.label());
+        assertEquals(convertToVertexId("vadas"), edge.inVertex().id());
+        assertEquals(convertToVertexId("marko"), edge.outVertex().id());
+        assertEquals(0.5d, edge.<Double>value("weight"), 0.0001d);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name() {
+        final Traversal<Vertex, String> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(convertToVertexId("josh"));
+        printTraversalForm(traversal);
+        int counter = 0;
+        final Set<String> names = new HashSet<>();
+        while (traversal.hasNext()) {
+            counter++;
+            names.add(traversal.next());
+        }
+        assertEquals(2, counter);
+        assertEquals(2, names.size());
+        assertTrue(names.contains("ripple"));
+        assertTrue(names.contains("lop"));
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX() {
+        final List<Traversal<Vertex, Edge>> traversals = Arrays.asList(
+                get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
+                get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
+                get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")));
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            assertTrue(traversal.hasNext());
+            assertTrue(traversal.hasNext());
+            final Edge edge = traversal.next();
+            assertEquals("knows", edge.label());
+            assertEquals(1.0d, edge.<Double>value("weight"), 0.00001d);
+            assertFalse(traversal.hasNext());
+            assertFalse(traversal.hasNext());
+        });
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXhereXout_name_backXhereX() {
+        Traversal<Vertex, Vertex> traversal = get_g_V_asXhereXout_name_backXhereX();
+        printTraversalForm(traversal);
+        super.checkResults(new HashMap<Vertex, Long>() {{
+            put(convertToVertex(graph, "marko"), 3l);
+            put(convertToVertex(graph, "josh"), 2l);
+            put(convertToVertex(graph, "peter"), 1l);
+        }}, traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+        List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX());
+        traversals.forEach(traversal -> {
+            printTraversalForm(traversal);
+            assertTrue(traversal.hasNext());
+            final Map<String, Long> map = traversal.next();
+            assertFalse(traversal.hasNext());
+            assertEquals(2, map.size());
+            assertEquals(1l, map.get("ripple").longValue());
+            assertEquals(6l, map.get("lop").longValue());
+        });
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends BackTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
+            return g.V(v1Id).as("here").out().back("here");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
+            return g.V(v4Id).out().as("here").has("lang", "java").back("here");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id) {
+            return g.V(v4Id).out().as("here").has("lang", "java").back("here").values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
+            return g.V(v1Id).outE().as("here").inV().has("name", "vadas").back("here");
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
+            return g.V(v1Id).outE("knows").has("weight", 1.0d).as("here").inV().has("name", "josh").back("here");
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id) {
+            return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).inV().has("name", "josh").<Edge>back("here");
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
+            return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).as("fake").inV().has("name", "josh").<Edge>back("here");
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
+            return g.V().as("here").out().values("name").back("here");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+            return (Traversal) g.V().out("created")
+                    .union(as("project").in("created").has("name", "marko").back("project"),
+                            as("project").in("created").in("knows").has("name", "marko").back("project")).groupCount().by("name");
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java
new file mode 100644
index 0000000..d8f4c04
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CoalesceTest.java
@@ -0,0 +1,158 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
+import static org.junit.Assert.*;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class CoalesceTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX();
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id);
+
+    public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id);
+
+    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
+
+    public abstract Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_coalesceXoutXfooX_outXbarXX() {
+        Traversal<Vertex, Vertex> traversal = get_g_V_coalesceXoutXfooX_outXbarXX();
+        printTraversalForm(traversal);
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX() {
+        Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        checkResults(Arrays.asList("josh", "vadas"), traversal);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX() {
+        Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(convertToVertexId("marko"));
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        assertEquals("lop", traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+        Traversal<Vertex, Map<String, Long>> traversal = get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
+        printTraversalForm(traversal);
+        assertTrue(traversal.hasNext());
+        Map<String, Long> result = traversal.next();
+        assertEquals(4, result.size());
+        assertTrue(result.containsKey("josh") && result.containsKey("lop") && result.containsKey("ripple") && result.containsKey("vadas"));
+        assertEquals(1L, (long) result.get("josh"));
+        assertEquals(2L, (long) result.get("lop"));
+        assertEquals(1L, (long) result.get("ripple"));
+        assertEquals(1L, (long) result.get("vadas"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @LoadGraphWith(MODERN)
+    public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+        Traversal<Vertex, Path> traversal = get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
+        printTraversalForm(traversal);
+        Map<String, Integer> first = new HashMap<>();
+        Map<String, Integer> last = new HashMap<>();
+        int counter = 0;
+        while (traversal.hasNext()) {
+            counter++;
+            Path path = traversal.next();
+            first.compute(path.<String>get(0), (k, v) -> v != null ? v + 1 : 1);
+            last.compute(path.<String>get(2), (k, v) -> v != null ? v + 1 : 1);
+            assertEquals(3, path.size());
+            assertTrue((path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("vadas"))
+                    || (path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("josh"))
+                    || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop"))
+                    || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("ripple"))
+                    || (path.<String>get(0).equals("peter") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop")));
+        }
+        assertEquals(5, counter);
+        assertEquals(2, (int) first.get("marko"));
+        assertEquals(2, (int) first.get("josh"));
+        assertEquals(1, (int) first.get("peter"));
+        assertEquals(1, (int) last.get("josh"));
+        assertEquals(1, (int) last.get("vadas"));
+        assertEquals(2, (int) last.get("lop"));
+        assertEquals(1, (int) last.get("ripple"));
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends CoalesceTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
+            return g.V().coalesce(out("foo"), out("bar"));
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
+            return g.V(v1Id).coalesce(out("knows"), out("created")).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
+            return g.V(v1Id).coalesce(out("created"), out("knows")).values("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+            return g.V().coalesce(out("likes"), out("knows"), out("created")).<String>groupCount().by("name");
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+            return g.V().coalesce(outE("knows"), outE("created")).otherV().path().by("name").by(T.label);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java
new file mode 100644
index 0000000..570ffbb
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CountTest.java
@@ -0,0 +1,168 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Scope;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class CountTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, Long> get_g_V_count();
+
+    public abstract Traversal<Vertex, Long> get_g_V_out_count();
+
+    public abstract Traversal<Vertex, Long> get_g_V_both_both_count();
+
+    public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count();
+
+    public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count();
+
+    public abstract Traversal<Vertex, Long> get_g_V_hasXnoX_count();
+
+    public abstract Traversal<Vertex, Long> get_g_V_fold_countXlocalX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_count();
+        printTraversalForm(traversal);
+        assertEquals(new Long(6), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_out_count();
+        printTraversalForm(traversal);
+        assertEquals(new Long(6), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_both_both_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_both_both_count();
+        printTraversalForm(traversal);
+        assertEquals(new Long(1406914), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_repeatXoutX_timesX3X_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX3X_count();
+        printTraversalForm(traversal);
+        assertEquals(new Long(14465066L), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_repeatXoutX_timesX8X_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX8X_count();
+        printTraversalForm(traversal);
+        assertEquals(new Long(2505037961767380L), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXnoX_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
+        printTraversalForm(traversal);
+        assertEquals(new Long(0), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_filterXfalseX_count() {
+        final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
+        printTraversalForm(traversal);
+        assertEquals(new Long(0), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_fold_countXlocalX() {
+        final Traversal<Vertex, Long> traversal = get_g_V_fold_countXlocalX();
+        printTraversalForm(traversal);
+        assertEquals(new Long(6), traversal.next());
+        assertFalse(traversal.hasNext());
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends CountTest {
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_count() {
+            return g.V().count();
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_out_count() {
+            return g.V().out().count();
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_both_both_count() {
+            return g.V().both().both().count();
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
+            return g.V().repeat(out()).times(3).count();
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
+            return g.V().repeat(out()).times(8).count();
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
+            return g.V().has("no").count();
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
+            return g.V().fold().count(Scope.local);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java
new file mode 100644
index 0000000..58d84a9
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FoldTest.java
@@ -0,0 +1,108 @@
+/*
+ * 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.map;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.UseEngine;
+import org.apache.tinkerpop.gremlin.structure.Operator;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.BinaryOperator;
+
+import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class FoldTest extends AbstractGremlinProcessTest {
+
+    public abstract Traversal<Vertex, List<Vertex>> get_g_V_fold();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_fold_unfold();
+
+    public abstract Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX();
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_fold() {
+        final Traversal<Vertex, List<Vertex>> traversal = get_g_V_fold();
+        printTraversalForm(traversal);
+        List<Vertex> list = traversal.next();
+        assertFalse(traversal.hasNext());
+        Set<Vertex> vertices = new HashSet<>(list);
+        assertEquals(6, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_fold_unfold() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_fold_unfold();
+        printTraversalForm(traversal);
+        int count = 0;
+        Set<Vertex> vertices = new HashSet<>();
+        while (traversal.hasNext()) {
+            vertices.add(traversal.next());
+            count++;
+        }
+        assertFalse(traversal.hasNext());
+        assertEquals(6, count);
+        assertEquals(6, vertices.size());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_age_foldX0_plusX() {
+        final Traversal<Vertex, Integer> traversal = get_g_V_age_foldX0_plusX();
+        printTraversalForm(traversal);
+        final Integer ageSum = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals(Integer.valueOf(123), ageSum);
+    }
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class Traversals extends FoldTest {
+
+        @Override
+        public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
+            return g.V().fold();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
+            return g.V().fold().unfold();
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
+            return g.V().<Integer>values("age").fold(0, (BinaryOperator) Operator.sum);
+        }
+    }
+}


[25/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java
new file mode 100644
index 0000000..e4f8bef
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SerialEnumerator.java
@@ -0,0 +1,119 @@
+/*
+ * 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.map.match;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.function.BiConsumer;
+import java.util.function.Function;
+
+/**
+ * An enumerator which consumes values from an iterator and maps each value to a secondary enumerator
+ * (for example, a join)
+ * Enumerated indices cover all solutions in the secondary enumerators,
+ * in ascending order according to the value iterator and the enumerators' own indices.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class SerialEnumerator<T> implements Enumerator<T> {
+    private final String name;
+    private Iterator<T> iterator;
+    private final Function<T, Enumerator<T>> constructor;
+    private final List<Enumerator<T>> memory = new ArrayList<>();
+    private final List<T> values = new ArrayList<>();
+
+    // TODO: this only assigned, not accessed until the efficient implementation of size() is restored
+    private int completedEnumsSize = 0;
+
+    public SerialEnumerator(final String name,
+                            final Iterator<T> iterator,
+                            final Function<T, Enumerator<T>> constructor) {
+        this.name = name;
+        this.iterator = iterator;
+        this.constructor = constructor;
+    }
+
+    public int size() {
+        // TODO: restore the more efficient implementation of size() while taking into account that
+        // traversal iterators such as DefaultTraversal may return hasNext=true after first returning hasNext=false
+        /*
+        int size = completedEnumsSize;
+        if (!sideEffects.isEmpty()) {
+            size += sideEffects.get(sideEffects.size() - 1).size();
+        }
+        return size;
+        */
+
+        //*
+        int size = 0;
+        for (Enumerator<T> e : memory) size += e.size();
+        return size;
+        //*/
+    }
+
+    // note: *not* intended for random access; use binary search if this is ever needed
+    public boolean visitSolution(final int index,
+                                 final BiConsumer<String, T> visitor) {
+        int totalSize = 0;
+        int memIndex = 0;
+        while (true) {
+            if (memIndex < memory.size()) {
+                Enumerator<T> e = memory.get(memIndex);
+
+                if (e.visitSolution(index - totalSize, visitor)) {
+                    // additionally, bind the value stored in this enumerator
+                    MatchStep.visit(name, values.get(memIndex), visitor);
+
+                    return true;
+                } else {
+                    totalSize += e.size();
+                    memIndex++;
+                }
+            } else {
+                if (null == iterator) {
+                    return false;
+                } else if (!iterator.hasNext()) {
+                    // free up memory as soon as possible
+                    iterator = null;
+                    return false;
+                }
+
+                if (!memory.isEmpty()) {
+                    int lastSize = memory.get(memIndex - 1).size();
+
+                    // first remove the head enumeration if it exists and is empty
+                    // (only the head will ever be empty, avoiding wasted space)
+                    if (0 == lastSize) {
+                        memIndex--;
+                        memory.remove(memIndex);
+                        values.remove(memIndex);
+                    } else {
+                        completedEnumsSize += lastSize;
+                    }
+                }
+
+                T value = iterator.next();
+                values.add(value);
+                Enumerator<T> e = constructor.apply(value);
+                memory.add(memory.size(), e);
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java
new file mode 100644
index 0000000..eb5da9c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/match/SimpleEnumerator.java
@@ -0,0 +1,66 @@
+/*
+ * 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.map.match;
+
+import java.util.Iterator;
+import java.util.function.BiConsumer;
+
+/**
+ * An enumerator of at most one element
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public class SimpleEnumerator<T> implements Enumerator<T> {
+
+    private final String name;
+    private Iterator<T> iterator;
+    private T element;
+
+    public SimpleEnumerator(final String name,
+                            final Iterator<T> iterator) {
+        this.name = name;
+        this.iterator = iterator;
+    }
+
+    @Override
+    public int size() {
+        return null == element ? 0 : 1;
+    }
+
+    @Override
+    public boolean visitSolution(int index, BiConsumer<String, T> visitor) {
+        if (0 != index) {
+            return false;
+        }
+
+        if (null != iterator) {
+            if (iterator.hasNext()) {
+                element = iterator.next();
+            }
+            iterator = null;
+        }
+
+        if (null != element) {
+            MatchStep.visit(name, element, visitor);
+            return true;
+        }
+
+        return false;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
new file mode 100644
index 0000000..f79ed92
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
@@ -0,0 +1,54 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.EnumSet;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AddPropertyStep<S extends Element> extends SideEffectStep<S> {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(TraverserRequirement.OBJECT);
+
+    private final String key;
+    private final Object value;
+
+    public AddPropertyStep(final Traversal.Admin traversal, final String key, final Object value) {
+        super(traversal);
+        this.key = key;
+        this.value = value;
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<S> traverser) {
+        traverser.get().property(this.key, this.value);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java
new file mode 100644
index 0000000..502037e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AggregateStep.java
@@ -0,0 +1,160 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.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.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
+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.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.BulkSetSupplier;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AggregateStep<S> extends CollectingBarrierStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+    private Traversal.Admin<S, Object> aggregateTraversal = null;
+    private String sideEffectKey;
+
+    public AggregateStep(final Traversal.Admin traversal, final String sideEffectKey) {
+        super(traversal);
+        this.sideEffectKey = sideEffectKey;
+        this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.aggregateTraversal);
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
+        return new AggregateMapReduce(this);
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> aggregateTraversal) {
+        this.aggregateTraversal = this.integrateChild(aggregateTraversal);
+    }
+
+    @Override
+    public List<Traversal.Admin<S, Object>> getLocalChildren() {
+        return null == this.aggregateTraversal ? Collections.emptyList() : Collections.singletonList(this.aggregateTraversal);
+    }
+
+    @Override
+    public void barrierConsumer(final TraverserSet<S> traverserSet) {
+        traverserSet.forEach(traverser ->
+                TraversalHelper.addToCollection(
+                        traverser.getSideEffects().get(this.sideEffectKey),
+                        TraversalUtil.applyNullable(traverser, this.aggregateTraversal),
+                        traverser.bulk()));
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
+    }
+
+    @Override
+    public AggregateStep<S> clone() {
+        final AggregateStep<S> clone = (AggregateStep<S>) super.clone();
+        if (null != this.aggregateTraversal)
+            clone.aggregateTraversal = clone.integrateChild(this.aggregateTraversal.clone());
+        return clone;
+    }
+
+    ////////
+
+    public static final class AggregateMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+        public static final String AGGREGATE_STEP_SIDE_EFFECT_KEY = "gremlin.aggregateStep.sideEffectKey";
+
+        private String sideEffectKey;
+        private Supplier<Collection> collectionSupplier;
+
+        private AggregateMapReduce() {
+
+        }
+
+        public AggregateMapReduce(final AggregateStep step) {
+            this.sideEffectKey = step.getSideEffectKey();
+            this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+        }
+
+        @Override
+        public void storeState(final Configuration configuration) {
+            super.storeState(configuration);
+            configuration.setProperty(AGGREGATE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+        }
+
+        @Override
+        public void loadState(final Configuration configuration) {
+            this.sideEffectKey = configuration.getString(AGGREGATE_STEP_SIDE_EFFECT_KEY);
+            this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return stage.equals(Stage.MAP);
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
+            VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
+        }
+
+        @Override
+        public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
+            final Collection collection = this.collectionSupplier.get();
+            keyValues.forEachRemaining(keyValue -> collection.add(keyValue.getValue()));
+            return collection;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return this.sideEffectKey;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java
new file mode 100644
index 0000000..1b6b514
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GraphStep.java
@@ -0,0 +1,99 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class GraphStep<S extends Element> extends StartStep<S> implements EngineDependent {
+
+    protected final Class<S> returnClass;
+    protected Object[] ids;
+    protected transient Supplier<Iterator<S>> iteratorSupplier;
+
+    public GraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
+        super(traversal);
+        this.returnClass = returnClass;
+        this.ids = ids;
+        for (int i = 0; i < this.ids.length; i++) {
+            if (this.ids[i] instanceof Element)
+                this.ids[i] = ((Element) this.ids[i]).id();
+        }
+        this.iteratorSupplier = () -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ?
+                this.getTraversal().getGraph().get().vertices(this.ids) :
+                this.getTraversal().getGraph().get().edges(this.ids));
+    }
+
+    public String toString() {
+        return TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.returnClass.getSimpleName().toLowerCase());
+    }
+
+    public boolean returnsVertices() {
+        return Vertex.class.isAssignableFrom(this.returnClass);
+    }
+
+    public boolean returnsEdges() {
+        return Edge.class.isAssignableFrom(this.returnClass);
+    }
+
+    public Class<S> getReturnClass() {
+        return this.returnClass;
+    }
+
+    public void setIteratorSupplier(final Supplier<Iterator<S>> iteratorSupplier) {
+        this.iteratorSupplier = iteratorSupplier;
+    }
+
+    public Object[] getIds() {
+        return this.ids;
+    }
+
+    public void clearIds() {
+        this.ids = new Object[0];
+    }
+
+    @Override
+    public void onEngine(final TraversalEngine traversalEngine) {
+        if (traversalEngine.isComputer()) {
+            this.iteratorSupplier = Collections::emptyIterator;
+        }
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() {
+        if (this.first)
+            this.start = null == this.iteratorSupplier ? EmptyIterator.instance() : this.iteratorSupplier.get();
+        return super.processNextStart();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
new file mode 100644
index 0000000..5a80c4f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
@@ -0,0 +1,171 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+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.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
+
+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 GroupCountSideEffectStep<S, E> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<E, Long, E, Long, Map<E, Long>> {
+
+    private Traversal.Admin<S, E> groupTraversal = null;
+    private String sideEffectKey;
+
+    public GroupCountSideEffectStep(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<Object, Long> groupCountMap = traverser.sideEffects(this.sideEffectKey);
+        MapHelper.incr(groupCountMap, TraversalUtil.applyNullable(traverser.asAdmin(), this.groupTraversal), traverser.bulk());
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    @Override
+    public MapReduce<E, Long, E, Long, Map<E, Long>> getMapReduce() {
+        return new GroupCountSideEffectMapReduce<>(this);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.groupTraversal);
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> groupTraversal) {
+        this.groupTraversal = this.integrateChild(groupTraversal);
+    }
+
+    @Override
+    public List<Traversal.Admin<S, E>> getLocalChildren() {
+        return null == this.groupTraversal ? Collections.emptyList() : Collections.singletonList(this.groupTraversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.BULK, TraverserRequirement.SIDE_EFFECTS);
+    }
+
+    @Override
+    public GroupCountSideEffectStep<S, E> clone() {
+        final GroupCountSideEffectStep<S, E> clone = (GroupCountSideEffectStep<S, E>) super.clone();
+        if (null != this.groupTraversal)
+            clone.groupTraversal = clone.integrateChild(this.groupTraversal.clone());
+        return clone;
+    }
+
+    ///////
+
+    public static final class GroupCountSideEffectMapReduce<E> extends StaticMapReduce<E, Long, E, Long, Map<E, Long>> {
+
+        public static final String GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupCountSideEffectStep.sideEffectKey";
+
+        private String sideEffectKey;
+        private Supplier<Map<E, Long>> mapSupplier;
+
+        private GroupCountSideEffectMapReduce() {
+
+        }
+
+        public GroupCountSideEffectMapReduce(final GroupCountSideEffectStep step) {
+            this.sideEffectKey = step.getSideEffectKey();
+            this.mapSupplier = step.getTraversal().asAdmin().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+        }
+
+        @Override
+        public void storeState(final Configuration configuration) {
+            super.storeState(configuration);
+            configuration.setProperty(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+        }
+
+        @Override
+        public void loadState(final Configuration configuration) {
+            this.sideEffectKey = configuration.getString(GROUP_COUNT_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+            this.mapSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Map<E, Long>>getRegisteredSupplier(this.sideEffectKey).orElse(HashMap::new);
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return true;
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<E, Long> emitter) {
+            VertexTraversalSideEffects.of(vertex).<Map<E, Number>>orElse(this.sideEffectKey, Collections.emptyMap()).forEach((k, v) -> emitter.emit(k, v.longValue()));
+        }
+
+        @Override
+        public void reduce(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+            long counter = 0;
+            while (values.hasNext()) {
+                counter = counter + values.next();
+            }
+            emitter.emit(key, counter);
+        }
+
+        @Override
+        public void combine(final E key, final Iterator<Long> values, final ReduceEmitter<E, Long> emitter) {
+            reduce(key, values, emitter);
+        }
+
+        @Override
+        public Map<E, Long> generateFinalResult(final Iterator<KeyValue<E, Long>> keyValues) {
+            final Map<E, Long> map = this.mapSupplier.get();
+            keyValues.forEachRemaining(keyValue -> map.put(keyValue.getKey(), keyValue.getValue()));
+            return map;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return this.sideEffectKey;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
new file mode 100644
index 0000000..d344953
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
@@ -0,0 +1,248 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.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.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMatrix;
+import org.apache.tinkerpop.gremlin.process.traversal.step.EngineDependent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MapReducer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.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.ArrayList;
+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, EngineDependent, MapReducer<K, Collection<V>, K, R, Map<K, R>> {
+
+    private char state = 'k';
+    private Traversal.Admin<S, K> keyTraversal = null;
+    private Traversal.Admin<S, V> valueTraversal = null;
+    private Traversal.Admin<Collection<V>, R> reduceTraversal = null;
+    private 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>> groupMap = null == this.tempGroupByMap ? traverser.sideEffects(this.sideEffectKey) : this.tempGroupByMap; // for nested traversals and not !starts.hasNext()
+        final K key = TraversalUtil.applyNullable(traverser, keyTraversal);
+        final V value = TraversalUtil.applyNullable(traverser, valueTraversal);
+        Collection<V> values = groupMap.get(key);
+        if (null == values) {
+            values = new BulkSet<>();
+            groupMap.put(key, values);
+        }
+        TraversalHelper.addToCollectionUnrollIterator(values, value, traverser.bulk());
+        //////// reducer for OLTP
+        if (!this.onGraphComputer && null != this.reduceTraversal && !this.starts.hasNext()) {
+            this.tempGroupByMap = groupMap;
+            final Map<K, R> reduceMap = new HashMap<>();
+            groupMap.forEach((k, vv) -> reduceMap.put(k, TraversalUtil.applyNullable(vv, this.reduceTraversal)));
+            traverser.sideEffects(this.sideEffectKey, reduceMap);
+        }
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    @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() {
+        final List<Traversal.Admin<A, B>> children = new ArrayList<>(3);
+        if (null != this.keyTraversal)
+            children.add((Traversal.Admin) this.keyTraversal);
+        if (null != this.valueTraversal)
+            children.add((Traversal.Admin) this.valueTraversal);
+        if (null != this.reduceTraversal)
+            children.add((Traversal.Admin) this.reduceTraversal);
+        return children;
+    }
+
+    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() {
+        final GroupSideEffectStep<S, K, V, R> clone = (GroupSideEffectStep<S, K, V, R>) super.clone();
+        if (null != this.keyTraversal)
+            clone.keyTraversal = clone.integrateChild(this.keyTraversal.clone());
+        if (null != this.valueTraversal)
+            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_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.groupSideEffectStep.sideEffectKey";
+        public static final String GROUP_SIDE_EFFECT_STEP_STEP_ID = "gremlin.groupSideEffectStep.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_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+            configuration.setProperty(GROUP_SIDE_EFFECT_STEP_STEP_ID, this.groupStepId);
+        }
+
+        @Override
+        public void loadState(final Configuration configuration) {
+            this.sideEffectKey = configuration.getString(GROUP_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+            this.groupStepId = configuration.getString(GROUP_SIDE_EFFECT_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, TraversalUtil.applyNullable(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() {
+            try {
+                final GroupSideEffectMapReduce<K, V, R> clone = (GroupSideEffectMapReduce<K, V, R>) super.clone();
+                if (null != clone.reduceTraversal)
+                    clone.reduceTraversal = this.reduceTraversal.clone();
+                return clone;
+            } catch (final CloneNotSupportedException e) {
+                throw new IllegalStateException(e.getMessage(), e);
+            }
+        }
+
+        @Override
+        public String toString() {
+            return StringFactory.mapReduceString(this, this.getMemoryKey());
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java
new file mode 100644
index 0000000..269f2c9
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/IdentityStep.java
@@ -0,0 +1,40 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class IdentityStep<S> extends AbstractStep<S, S> {
+
+    public IdentityStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() throws NoSuchElementException {
+        return this.starts.next();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java
new file mode 100644
index 0000000..34b5eab
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStep.java
@@ -0,0 +1,50 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.util.iterator.ArrayIterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class InjectStep<S> extends StartStep<S> {
+
+    private final S[] injections;
+
+    @SafeVarargs
+    public InjectStep(final Traversal.Admin traversal, final S... injections) {
+        super(traversal);
+        this.injections = injections;
+        this.start = new ArrayIterator<>(this.injections);
+    }
+
+    @Override
+    public InjectStep<S> clone() {
+        final InjectStep<S> clone = (InjectStep<S>) super.clone();
+        clone.start = new ArrayIterator<>(clone.injections);
+        return clone;
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.start = new ArrayIterator<>(this.injections);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java
new file mode 100644
index 0000000..2050489
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/LambdaSideEffectStep.java
@@ -0,0 +1,48 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.function.Consumer;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LambdaSideEffectStep<S> extends SideEffectStep<S> {
+
+    private final Consumer<Traverser<S>> consumer;
+
+    public LambdaSideEffectStep(final Traversal.Admin traversal, final Consumer<Traverser<S>> consumer) {
+        super(traversal);
+        this.consumer = consumer;
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<S> traverser) {
+        this.consumer.accept(traverser);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.consumer);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
new file mode 100644
index 0000000..4be3483
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
@@ -0,0 +1,219 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+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.DependantMutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileStep<S> extends AbstractStep<S, S> implements MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
+
+    // Stored in the Traversal sideEffects but kept here as a reference for convenience.
+    private StandardTraversalMetrics traversalMetrics;
+
+    public ProfileStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+
+    @Override
+    public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
+        return ProfileMapReduce.instance();
+    }
+
+    @Override
+    public Traverser<S> next() {
+        Traverser<S> ret = null;
+        initializeIfNeeded();
+        traversalMetrics.start(this.getId());
+        try {
+            ret = super.next();
+            return ret;
+        } finally {
+            if (ret != null) {
+                traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
+            } else {
+                traversalMetrics.stop(this.getId());
+            }
+        }
+    }
+
+    @Override
+    public boolean hasNext() {
+        initializeIfNeeded();
+        traversalMetrics.start(this.getId());
+        boolean ret = super.hasNext();
+        traversalMetrics.stop(this.getId());
+        return ret;
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() throws NoSuchElementException {
+        return this.starts.next();
+    }
+
+    private void initializeIfNeeded() {
+        if (traversalMetrics != null) {
+            return;
+        }
+
+        createTraversalMetricsSideEffectIfNecessary();
+
+        // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
+        // sideEffects after serialization.
+        if (traversalMetrics == null) {
+            // look up the TraversalMetrics in the root traversal's sideEffects
+            Traversal t = this.getTraversal();
+            while (!(t.asAdmin().getParent() instanceof EmptyStep)) {
+                t = t.asAdmin().getParent().asStep().getTraversal();
+            }
+            traversalMetrics = t.asAdmin().getSideEffects().get(TraversalMetrics.METRICS_KEY);
+        }
+    }
+
+    private void createTraversalMetricsSideEffectIfNecessary() {
+        if (this.getTraversal().getSideEffects().exists(TraversalMetrics.METRICS_KEY)) {
+            // Already initialized
+            return;
+        }
+
+        if (!(this.getTraversal().getParent() instanceof EmptyStep)) {
+            // Initialization is handled at the top-level of the traversal only.
+            return;
+        }
+
+        // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
+        // once per thread if using Computer.)
+
+        traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(TraversalMetrics.METRICS_KEY, StandardTraversalMetrics::new);
+        prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
+    }
+
+    // Walk the traversal steps and initialize the Metrics timers.
+    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, MutableMetrics parentMetrics) {
+
+        DependantMutableMetrics prevMetrics = null;
+        final List<Step> steps = traversal.getSteps();
+        for (int ii = 0; ii + 1 < steps.size(); ii = ii + 2) {
+            Step step = steps.get(ii);
+            ProfileStep profileStep = (ProfileStep) steps.get(ii + 1);
+
+            // Create metrics
+            MutableMetrics metrics;
+
+            // Computer metrics are "stand-alone" but Standard metrics handle double-counted upstream time.
+            if (traversal.getEngine().isComputer()) {
+                metrics = new MutableMetrics(step.getId(), step.toString());
+            } else {
+                metrics = new DependantMutableMetrics(step.getId(), step.toString(), prevMetrics);
+                prevMetrics = (DependantMutableMetrics) metrics;
+            }
+
+            // Initialize counters (necessary because some steps might end up being 0)
+            metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, 0);
+            metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 0);
+
+            // Add metrics to parent, if necessary
+            if (parentMetrics != null) {
+                parentMetrics.addNested(metrics);
+            }
+
+            // The TraversalMetrics sideEffect is shared across all the steps.
+            profileStep.traversalMetrics = this.traversalMetrics;
+
+            // Add root metrics to traversalMetrics
+            this.traversalMetrics.addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileStep.getId());
+
+            // Handle nested traversal
+            if (step instanceof TraversalParent) {
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+                    prepTraversalForProfiling(t, metrics);
+                }
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+                    prepTraversalForProfiling(t, metrics);
+                }
+            }
+        }
+    }
+
+    //////////////////
+
+    public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
+
+        private static ProfileMapReduce INSTANCE = new ProfileMapReduce();
+
+        private ProfileMapReduce() {
+
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return true;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return TraversalMetrics.METRICS_KEY;
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
+            VertexTraversalSideEffects.of(vertex).<StandardTraversalMetrics>ifPresent(TraversalMetrics.METRICS_KEY, emitter::emit);
+        }
+
+        @Override
+        public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+            reduce(key, values, emitter);
+        }
+
+        @Override
+        public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+            emitter.emit(StandardTraversalMetrics.merge(values));
+        }
+
+        @Override
+        public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
+            return keyValues.next().getValue();
+        }
+
+        public static ProfileMapReduce instance() {
+            return INSTANCE;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java
new file mode 100644
index 0000000..412164a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackElementValueStep.java
@@ -0,0 +1,66 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Element;
+
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.BinaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SackElementValueStep<S extends Element, V> extends SideEffectStep<S> {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.SACK,
+            TraverserRequirement.OBJECT
+    );
+
+    private BinaryOperator<V> operator;
+    private final String propertyKey;
+
+    public SackElementValueStep(final Traversal.Admin traversal, final BinaryOperator<V> operator, final String propertyKey) {
+        super(traversal);
+        this.operator = operator;
+        this.propertyKey = propertyKey;
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<S> traverser) {
+        traverser.get().values(this.propertyKey).forEachRemaining(value -> {
+            traverser.sack(this.operator.apply(traverser.sack(), (V) value));
+        });
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.operator, this.propertyKey);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java
new file mode 100644
index 0000000..cae570a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SackObjectStep.java
@@ -0,0 +1,55 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.EnumSet;
+import java.util.Set;
+import java.util.function.BiFunction;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SackObjectStep<S, V> extends SideEffectStep<S> {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.SACK,
+            TraverserRequirement.OBJECT
+    );
+
+    private final BiFunction<V, S, V> operator;
+
+    public SackObjectStep(final Traversal.Admin traversal, final BiFunction<V, S, V> operator) {
+        super(traversal);
+        this.operator = operator;
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<S> traverser) {
+        traverser.sack(this.operator.apply(traverser.sack(), traverser.get()));
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
new file mode 100644
index 0000000..28f1cf0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectCapStep.java
@@ -0,0 +1,80 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Arrays;
+import java.util.EnumSet;
+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 SideEffectCapStep<S, E> extends SupplyingBarrierStep<S, E> {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.SIDE_EFFECTS,
+            TraverserRequirement.OBJECT
+    );
+
+    private List<String> sideEffectKeys;
+
+    public SideEffectCapStep(final Traversal.Admin traversal, final String... sideEffectKeys) {
+        super(traversal);
+        if (0 == sideEffectKeys.length)
+            throw new IllegalArgumentException("At least one sideEffect key must be provided to " + this.getClass().getSimpleName());
+        this.sideEffectKeys = Arrays.asList(sideEffectKeys);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKeys);
+    }
+
+    public List<String> getSideEffectKeys() {
+        return this.sideEffectKeys;
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+
+    @Override
+    public E supply() {
+        return this.sideEffectKeys.size() == 1 ?
+                this.getTraversal().asAdmin().getSideEffects().get(this.sideEffectKeys.get(0)) :
+                (E) this.getMapOfSideEffects();
+    }
+
+    public Map<String, Object> getMapOfSideEffects() {
+        final Map<String, Object> sideEffects = new HashMap<>();
+        for (final String sideEffectKey : this.sideEffectKeys) {
+            sideEffects.put(sideEffectKey, this.getTraversal().asAdmin().getSideEffects().get(sideEffectKey));
+        }
+        return sideEffects;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java
new file mode 100644
index 0000000..2854e6e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectStep.java
@@ -0,0 +1,42 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SideEffectStep<S> extends AbstractStep<S, S> {
+
+    public SideEffectStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    protected abstract void sideEffect(final Traverser.Admin<S> traverser);
+
+    @Override
+    protected Traverser<S> processNextStart() {
+        final Traverser.Admin<S> traverser = this.starts.next();
+        this.sideEffect(traverser);
+        return traverser;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
new file mode 100644
index 0000000..5e762fe
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java
@@ -0,0 +1,79 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Iterator;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class StartStep<S> extends AbstractStep<S, S> {
+
+    protected Object start;
+    protected boolean first = true;
+
+    public StartStep(final Traversal.Admin traversal, final Object start) {
+        super(traversal);
+        this.start = start;
+    }
+
+    public StartStep(final Traversal.Admin traversal) {
+        this(traversal, null);
+    }
+
+    public <T> T getStart() {
+        return (T) this.start;
+    }
+
+    public boolean startAssignableTo(final Class... assignableClasses) {
+        return Stream.of(assignableClasses).filter(check -> check.isAssignableFrom(this.start.getClass())).findAny().isPresent();
+    }
+
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.start);
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() {
+        if (this.first) {
+            if (null != this.start) {
+                if (this.start instanceof Iterator)
+                    this.starts.add(this.getTraversal().getTraverserGenerator().generateIterator((Iterator<S>) this.start, this, 1l));
+                else
+                    this.starts.add(this.getTraversal().getTraverserGenerator().generate((S) this.start, this, 1l));
+            }
+            this.first = false;
+        }
+        return this.starts.next();
+    }
+
+    @Override
+    public StartStep<S> clone() {
+        final StartStep<S> clone = (StartStep<S>) super.clone();
+        clone.first = true;
+        clone.start = null;
+        return clone;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java
new file mode 100644
index 0000000..20c92d6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StoreStep.java
@@ -0,0 +1,159 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.commons.configuration.Configuration;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.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.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+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.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.BulkSetSupplier;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class StoreStep<S> extends SideEffectStep<S> implements SideEffectCapable, TraversalParent, MapReducer<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+    private Traversal.Admin<S, Object> storeTraversal = null;
+    private String sideEffectKey;
+
+    public StoreStep(final Traversal.Admin traversal, final String sideEffectKey) {
+        super(traversal);
+        this.sideEffectKey = sideEffectKey;
+        this.traversal.asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, BulkSetSupplier.instance());
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<S> traverser) {
+        TraversalHelper.addToCollection(
+                traverser.sideEffects(this.sideEffectKey),
+                TraversalUtil.applyNullable(traverser.asAdmin(), this.storeTraversal),
+                traverser.bulk());
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKey, this.storeTraversal);
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> getMapReduce() {
+        return new StoreMapReduce(this);
+    }
+
+    @Override
+    public List<Traversal.Admin<S, Object>> getLocalChildren() {
+        return null == this.storeTraversal ? Collections.emptyList() : Collections.singletonList(this.storeTraversal);
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> storeTraversal) {
+        this.storeTraversal = this.integrateChild(storeTraversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS, TraverserRequirement.BULK);
+    }
+
+    @Override
+    public StoreStep<S> clone() {
+        final StoreStep<S> clone = (StoreStep<S>) super.clone();
+        if (null != this.storeTraversal)
+            clone.storeTraversal = clone.integrateChild(this.storeTraversal.clone());
+        return clone;
+    }
+
+    ///////////////
+
+    public static final class StoreMapReduce extends StaticMapReduce<MapReduce.NullObject, Object, MapReduce.NullObject, Object, Collection> {
+
+        public static final String STORE_STEP_SIDE_EFFECT_KEY = "gremlin.storeStep.sideEffectKey";
+
+        private String sideEffectKey;
+        private Supplier<Collection> collectionSupplier;
+
+        private StoreMapReduce() {
+
+        }
+
+        public StoreMapReduce(final StoreStep step) {
+            this.sideEffectKey = step.getSideEffectKey();
+            this.collectionSupplier = step.getTraversal().asAdmin().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+        }
+
+        @Override
+        public void storeState(final Configuration configuration) {
+            super.storeState(configuration);
+            configuration.setProperty(STORE_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+        }
+
+        @Override
+        public void loadState(final Configuration configuration) {
+            this.sideEffectKey = configuration.getString(STORE_STEP_SIDE_EFFECT_KEY);
+            this.collectionSupplier = TraversalVertexProgram.getTraversalSupplier(configuration).get().getSideEffects().<Collection>getRegisteredSupplier(this.sideEffectKey).orElse(BulkSet::new);
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return stage.equals(Stage.MAP);
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<NullObject, Object> emitter) {
+            VertexTraversalSideEffects.of(vertex).<Collection<?>>orElse(this.sideEffectKey, Collections.emptyList()).forEach(emitter::emit);
+        }
+
+        @Override
+        public Collection generateFinalResult(final Iterator<KeyValue<NullObject, Object>> keyValues) {
+            final Collection collection = this.collectionSupplier.get();
+            keyValues.forEachRemaining(pair -> collection.add(pair.getValue()));
+            return collection;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return this.sideEffectKey;
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
new file mode 100644
index 0000000..0657585
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
@@ -0,0 +1,122 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.GraphFactory;
+
+import java.util.EnumSet;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * A side-effect step that produces an edge induced subgraph.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class SubgraphStep extends SideEffectStep<Edge> implements SideEffectCapable {
+
+    private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
+            TraverserRequirement.OBJECT,
+            TraverserRequirement.SIDE_EFFECTS
+    );
+
+    private Graph subgraph;
+    private String sideEffectKey;
+
+    private static final Map<String, Object> DEFAULT_CONFIGURATION = new HashMap<String, Object>() {{
+        put(Graph.GRAPH, "org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph"); // hard coded because TinkerGraph is not part of gremlin-core
+    }};
+
+    // TODO: add support for side-effecting out an edge list.
+
+    public SubgraphStep(final Traversal.Admin traversal, final String sideEffectKey) {
+        super(traversal);
+        this.sideEffectKey = sideEffectKey;
+        this.getTraversal().asAdmin().getSideEffects().registerSupplierIfAbsent(this.sideEffectKey, () -> GraphFactory.open(DEFAULT_CONFIGURATION));
+    }
+
+    @Override
+    protected void sideEffect(final Traverser.Admin<Edge> traverser) {
+        if (null == this.subgraph) {
+            this.subgraph = traverser.sideEffects(this.sideEffectKey);
+            if (!this.subgraph.features().vertex().supportsUserSuppliedIds() || !this.subgraph.features().edge().supportsUserSuppliedIds())
+                throw new IllegalArgumentException("The provided subgraph must support user supplied ids for vertices and edges: " + this.subgraph);
+        }
+        SubgraphStep.addEdgeToSubgraph(this.subgraph, traverser.get());
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKey);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return REQUIREMENTS;
+    }
+
+    @Override
+    public SubgraphStep clone() {
+        final SubgraphStep clone = (SubgraphStep) super.clone();
+        this.subgraph = null;
+        return clone;
+    }
+
+    ///
+
+    private static Vertex getOrCreate(final Graph subgraph, final Vertex vertex) {
+        final Iterator<Vertex> vertexIterator = subgraph.vertices(vertex.id());
+        if (vertexIterator.hasNext()) return vertexIterator.next();
+        final Vertex subgraphVertex = subgraph.addVertex(T.id, vertex.id(), T.label, vertex.label());
+        vertex.properties().forEachRemaining(vertexProperty -> {
+            final VertexProperty<?> subgraphVertexProperty = subgraphVertex.property(vertexProperty.key(), vertexProperty.value(), T.id, vertexProperty.id()); // TODO: demand vertex property id?
+            vertexProperty.properties().forEachRemaining(property -> subgraphVertexProperty.<Object>property(property.key(), property.value()));
+        });
+        return subgraphVertex;
+    }
+
+    private static void addEdgeToSubgraph(final Graph subgraph, final Edge edge) {
+        final Iterator<Edge> edgeIterator = subgraph.edges(edge.id());
+        if (edgeIterator.hasNext()) return;
+        final Iterator<Vertex> vertexIterator = edge.vertices(Direction.BOTH);
+        final Vertex subGraphOutVertex = getOrCreate(subgraph, vertexIterator.next());
+        final Vertex subGraphInVertex = getOrCreate(subgraph, vertexIterator.next());
+        final Edge subGraphEdge = subGraphOutVertex.addEdge(edge.label(), subGraphInVertex, T.id, edge.id());
+        edge.properties().forEachRemaining(property -> subGraphEdge.<Object>property(property.key(), property.value()));
+    }
+}


[40/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.


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

Branch: refs/heads/master
Commit: 4c97e964623ffd28b0b0e01820adfa6db501f79a
Parents: b563dc3
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Mar 19 12:26:09 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Mar 19 12:26:09 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |   2 +
 .../console/plugin/GephiRemoteAcceptor.groovy   |   2 +-
 .../groovy/plugin/SugarGremlinPluginTest.java   |   2 +-
 .../process/FastNoSuchElementException.java     |  46 -
 .../apache/tinkerpop/gremlin/process/Path.java  | 180 ----
 .../apache/tinkerpop/gremlin/process/Scope.java |  27 -
 .../apache/tinkerpop/gremlin/process/Step.java  | 158 ----
 .../org/apache/tinkerpop/gremlin/process/T.java | 114 ---
 .../tinkerpop/gremlin/process/Traversal.java    | 429 ---------
 .../gremlin/process/TraversalEngine.java        |  55 --
 .../gremlin/process/TraversalSideEffects.java   | 225 -----
 .../gremlin/process/TraversalSource.java        |  48 -
 .../gremlin/process/TraversalStrategies.java    | 195 ----
 .../gremlin/process/TraversalStrategy.java      |  50 -
 .../tinkerpop/gremlin/process/Traverser.java    | 280 ------
 .../gremlin/process/TraverserGenerator.java     |  48 -
 .../gremlin/process/computer/MessageScope.java  |   2 +-
 .../peerpressure/PeerPressureVertexProgram.java |   7 +-
 .../ranking/pagerank/PageRankVertexProgram.java |   4 +-
 .../traversal/TraversalClassSupplier.java       |   2 +-
 .../traversal/TraversalScriptSupplier.java      |   4 +-
 .../computer/traversal/TraversalSupplier.java   |   2 +-
 .../traversal/TraversalVertexProgram.java       |  20 +-
 .../TraversalVertexProgramMessageCombiner.java  |   2 +-
 .../computer/traversal/TraverserExecutor.java   |  10 +-
 .../traversal/VertexTraversalSideEffects.java   |   2 +-
 .../traversal/step/map/ComputerResultStep.java  |  14 +-
 .../mapreduce/TraverserMapReduce.java           |   8 +-
 .../computer/util/VertexProgramHelper.java      |   8 +-
 .../graph/traversal/DefaultGraphTraversal.java  |  47 -
 .../process/graph/traversal/GraphTraversal.java | 847 -----------------
 .../graph/traversal/GraphTraversalSource.java   | 138 ---
 .../gremlin/process/graph/traversal/__.java     | 602 ------------
 .../graph/traversal/lambda/LoopTraversal.java   |  50 -
 .../graph/traversal/step/ComparatorHolder.java  |  33 -
 .../traversal/step/HasContainerHolder.java      |  33 -
 .../process/graph/traversal/step/Mutating.java  |  28 -
 .../process/graph/traversal/step/Ranging.java   |  30 -
 .../graph/traversal/step/SideEffectCapable.java |  28 -
 .../traversal/step/TraversalOptionParent.java   |  32 -
 .../graph/traversal/step/branch/BranchStep.java | 166 ----
 .../graph/traversal/step/branch/ChooseStep.java |  51 -
 .../graph/traversal/step/branch/LocalStep.java  |  87 --
 .../graph/traversal/step/branch/RepeatStep.java | 263 ------
 .../graph/traversal/step/branch/UnionStep.java  |  52 --
 .../graph/traversal/step/filter/AndStep.java    |  39 -
 .../graph/traversal/step/filter/CoinStep.java   |  64 --
 .../traversal/step/filter/ConjunctionStep.java  | 193 ----
 .../traversal/step/filter/CyclicPathStep.java   |  46 -
 .../traversal/step/filter/DedupGlobalStep.java  |  86 --
 .../graph/traversal/step/filter/ExceptStep.java |  97 --
 .../graph/traversal/step/filter/FilterStep.java |  47 -
 .../graph/traversal/step/filter/HasStep.java    |  69 --
 .../traversal/step/filter/HasTraversalStep.java |  80 --
 .../graph/traversal/step/filter/IsStep.java     |  66 --
 .../traversal/step/filter/LambdaFilterStep.java |  52 --
 .../graph/traversal/step/filter/OrStep.java     |  39 -
 .../traversal/step/filter/RangeGlobalStep.java  | 113 ---
 .../graph/traversal/step/filter/RetainStep.java |  97 --
 .../traversal/step/filter/SampleGlobalStep.java | 117 ---
 .../traversal/step/filter/SimplePathStep.java   |  47 -
 .../traversal/step/filter/TimeLimitStep.java    |  80 --
 .../graph/traversal/step/filter/WhereStep.java  | 132 ---
 .../traversal/step/map/AddEdgeByPathStep.java   |  95 --
 .../graph/traversal/step/map/AddEdgeStep.java   |  86 --
 .../traversal/step/map/AddVertexStartStep.java  |  53 --
 .../graph/traversal/step/map/AddVertexStep.java |  49 -
 .../graph/traversal/step/map/BackStep.java      |  64 --
 .../graph/traversal/step/map/CoalesceStep.java  |  86 --
 .../traversal/step/map/CountGlobalStep.java     | 134 ---
 .../traversal/step/map/CountLocalStep.java      |  51 -
 .../traversal/step/map/DedupLocalStep.java      |  51 -
 .../traversal/step/map/EdgeOtherVertexStep.java |  58 --
 .../traversal/step/map/EdgeVertexStep.java      |  67 --
 .../graph/traversal/step/map/FlatMapStep.java   |  60 --
 .../graph/traversal/step/map/FoldStep.java      |  93 --
 .../traversal/step/map/GroupCountStep.java      | 170 ----
 .../graph/traversal/step/map/GroupStep.java     | 277 ------
 .../graph/traversal/step/map/IdStep.java        |  47 -
 .../graph/traversal/step/map/KeyStep.java       |  47 -
 .../graph/traversal/step/map/LabelStep.java     |  47 -
 .../traversal/step/map/LambdaFlatMapStep.java   |  49 -
 .../graph/traversal/step/map/LambdaMapStep.java |  48 -
 .../graph/traversal/step/map/MapStep.java       |  53 --
 .../graph/traversal/step/map/MaxGlobalStep.java | 133 ---
 .../graph/traversal/step/map/MaxLocalStep.java  |  59 --
 .../traversal/step/map/MeanGlobalStep.java      | 218 -----
 .../graph/traversal/step/map/MeanLocalStep.java |  59 --
 .../graph/traversal/step/map/MinGlobalStep.java | 133 ---
 .../graph/traversal/step/map/MinLocalStep.java  |  59 --
 .../traversal/step/map/OrderGlobalStep.java     |  95 --
 .../traversal/step/map/OrderLocalStep.java      | 100 --
 .../graph/traversal/step/map/PathStep.java      |  95 --
 .../traversal/step/map/PropertiesStep.java      |  71 --
 .../traversal/step/map/PropertyElementStep.java |  50 -
 .../traversal/step/map/PropertyMapStep.java     |  91 --
 .../traversal/step/map/PropertyValueStep.java   |  47 -
 .../traversal/step/map/RangeLocalStep.java      |  84 --
 .../graph/traversal/step/map/SackStep.java      |  46 -
 .../traversal/step/map/SampleLocalStep.java     | 112 ---
 .../graph/traversal/step/map/SelectOneStep.java | 103 --
 .../graph/traversal/step/map/SelectStep.java    | 130 ---
 .../graph/traversal/step/map/SumGlobalStep.java | 137 ---
 .../graph/traversal/step/map/SumLocalStep.java  |  58 --
 .../graph/traversal/step/map/TreeStep.java      | 178 ----
 .../graph/traversal/step/map/UnfoldStep.java    |  57 --
 .../graph/traversal/step/map/VertexStep.java    |  82 --
 .../traversal/step/map/match/Bindings.java      |  87 --
 .../step/map/match/CrossJoinEnumerator.java     |  96 --
 .../traversal/step/map/match/Enumerator.java    |  46 -
 .../step/map/match/InnerJoinEnumerator.java     | 129 ---
 .../step/map/match/IteratorEnumerator.java      |  67 --
 .../traversal/step/map/match/MatchStep.java     | 559 -----------
 .../step/map/match/SerialEnumerator.java        | 119 ---
 .../step/map/match/SimpleEnumerator.java        |  66 --
 .../step/sideEffect/AddPropertyStep.java        |  54 --
 .../step/sideEffect/AggregateStep.java          | 160 ----
 .../traversal/step/sideEffect/GraphStep.java    |  99 --
 .../sideEffect/GroupCountSideEffectStep.java    | 171 ----
 .../step/sideEffect/GroupSideEffectStep.java    | 248 -----
 .../traversal/step/sideEffect/IdentityStep.java |  40 -
 .../traversal/step/sideEffect/InjectStep.java   |  50 -
 .../step/sideEffect/LambdaSideEffectStep.java   |  48 -
 .../traversal/step/sideEffect/ProfileStep.java  | 219 -----
 .../step/sideEffect/SackElementValueStep.java   |  66 --
 .../step/sideEffect/SackObjectStep.java         |  55 --
 .../step/sideEffect/SideEffectCapStep.java      |  80 --
 .../step/sideEffect/SideEffectStep.java         |  42 -
 .../traversal/step/sideEffect/StartStep.java    |  79 --
 .../traversal/step/sideEffect/StoreStep.java    | 159 ----
 .../traversal/step/sideEffect/SubgraphStep.java | 122 ---
 .../step/sideEffect/TreeSideEffectStep.java     | 182 ----
 .../step/util/CollectingBarrierStep.java        |  68 --
 .../traversal/step/util/ComputerAwareStep.java  |  95 --
 .../traversal/step/util/MarkerIdentityStep.java |  40 -
 .../traversal/step/util/PathIdentityStep.java   |  49 -
 .../step/util/ReducingBarrierStep.java          | 180 ----
 .../step/util/SupplyingBarrierStep.java         |  64 --
 .../strategy/AbstractTraversalStrategy.java     |  43 -
 .../ComparatorHolderRemovalStrategy.java        |  54 --
 .../traversal/strategy/ConjunctionStrategy.java |  83 --
 .../strategy/DedupOptimizerStrategy.java        |  74 --
 .../strategy/EngineDependentStrategy.java       |  46 -
 .../strategy/IdentityRemovalStrategy.java       |  49 -
 .../strategy/LabeledEndStepStrategy.java        |  50 -
 .../traversal/strategy/MatchWhereStrategy.java  |  90 --
 .../traversal/strategy/ProfileStrategy.java     | 111 ---
 .../strategy/RangeByIsCountStrategy.java        |  90 --
 .../traversal/strategy/TimeLimitedStrategy.java |  48 -
 .../strategy/TraversalVerificationStrategy.java |  71 --
 .../traversal/util/EmptyGraphTraversal.java     |  66 --
 .../process/graph/util/HasContainer.java        | 113 ---
 .../gremlin/process/graph/util/Tree.java        | 134 ---
 .../process/traversal/DefaultTraversal.java     | 257 -----
 .../traversal/DefaultTraversalSideEffects.java  | 203 ----
 .../traversal/DefaultTraversalStrategies.java   | 105 ---
 .../traversal/FastNoSuchElementException.java   |  46 +
 .../gremlin/process/traversal/Path.java         | 180 ++++
 .../gremlin/process/traversal/Scope.java        |  27 +
 .../gremlin/process/traversal/Step.java         | 158 ++++
 .../gremlin/process/traversal/StepPosition.java |  57 --
 .../tinkerpop/gremlin/process/traversal/T.java  | 114 +++
 .../gremlin/process/traversal/Traversal.java    | 429 +++++++++
 .../process/traversal/TraversalEngine.java      |  53 ++
 .../process/traversal/TraversalMatrix.java      |  66 --
 .../process/traversal/TraversalSideEffects.java | 225 +++++
 .../process/traversal/TraversalSource.java      |  48 +
 .../process/traversal/TraversalStrategies.java  | 195 ++++
 .../process/traversal/TraversalStrategy.java    |  50 +
 .../gremlin/process/traversal/Traverser.java    | 280 ++++++
 .../process/traversal/TraverserGenerator.java   |  48 +
 .../dsl/graph/DefaultGraphTraversal.java        |  47 +
 .../dsl/graph/EmptyGraphTraversal.java          |  64 ++
 .../traversal/dsl/graph/GraphTraversal.java     | 847 +++++++++++++++++
 .../dsl/graph/GraphTraversalSource.java         | 138 +++
 .../gremlin/process/traversal/dsl/graph/__.java | 602 ++++++++++++
 .../engine/ComputerTraversalEngine.java         |   7 +-
 .../engine/StandardTraversalEngine.java         |   4 +-
 .../lambda/AbstractLambdaTraversal.java         |  18 +-
 .../traversal/lambda/ElementValueTraversal.java |   2 +-
 .../traversal/lambda/FilterTraversal.java       |   2 +-
 .../lambda/FilterTraverserTraversal.java        |   2 +-
 .../traversal/lambda/HasNextTraversal.java      |  14 +-
 .../traversal/lambda/IdentityTraversal.java     |   2 +-
 .../process/traversal/lambda/LoopTraversal.java |  49 +
 .../process/traversal/lambda/MapTraversal.java  |   2 +-
 .../traversal/lambda/MapTraverserTraversal.java |   2 +-
 .../process/traversal/step/AbstractStep.java    | 183 ----
 .../traversal/step/ComparatorHolder.java        |  33 +
 .../step/ElementFunctionComparator.java         |  57 --
 .../traversal/step/ElementValueComparator.java  |  56 --
 .../process/traversal/step/EmptyStep.java       | 142 ---
 .../process/traversal/step/EngineDependent.java |   2 +-
 .../traversal/step/ExpandableStepIterator.java  |  77 --
 .../traversal/step/HasContainerHolder.java      |  33 +
 .../process/traversal/step/Mutating.java        |  28 +
 .../gremlin/process/traversal/step/Ranging.java |  30 +
 .../traversal/step/SideEffectCapable.java       |  28 +
 .../traversal/step/TraversalComparator.java     |  57 --
 .../traversal/step/TraversalOptionParent.java   |  31 +
 .../process/traversal/step/TraversalParent.java |   6 +-
 .../traversal/step/branch/BranchStep.java       | 166 ++++
 .../traversal/step/branch/ChooseStep.java       |  51 +
 .../traversal/step/branch/LocalStep.java        |  87 ++
 .../traversal/step/branch/RepeatStep.java       | 263 ++++++
 .../traversal/step/branch/UnionStep.java        |  52 ++
 .../process/traversal/step/filter/AndStep.java  |  39 +
 .../process/traversal/step/filter/CoinStep.java |  64 ++
 .../traversal/step/filter/ConjunctionStep.java  | 193 ++++
 .../traversal/step/filter/CyclicPathStep.java   |  46 +
 .../traversal/step/filter/DedupGlobalStep.java  |  86 ++
 .../traversal/step/filter/ExceptStep.java       |  97 ++
 .../traversal/step/filter/FilterStep.java       |  45 +
 .../process/traversal/step/filter/HasStep.java  |  69 ++
 .../traversal/step/filter/HasTraversalStep.java |  80 ++
 .../process/traversal/step/filter/IsStep.java   |  66 ++
 .../traversal/step/filter/LambdaFilterStep.java |  52 ++
 .../process/traversal/step/filter/OrStep.java   |  39 +
 .../traversal/step/filter/RangeGlobalStep.java  | 113 +++
 .../traversal/step/filter/RetainStep.java       |  97 ++
 .../traversal/step/filter/SampleGlobalStep.java | 117 +++
 .../traversal/step/filter/SimplePathStep.java   |  47 +
 .../traversal/step/filter/TimeLimitStep.java    |  80 ++
 .../traversal/step/filter/WhereStep.java        | 132 +++
 .../traversal/step/map/AddEdgeByPathStep.java   |  95 ++
 .../process/traversal/step/map/AddEdgeStep.java |  86 ++
 .../traversal/step/map/AddVertexStartStep.java  |  53 ++
 .../traversal/step/map/AddVertexStep.java       |  49 +
 .../process/traversal/step/map/BackStep.java    |  64 ++
 .../traversal/step/map/CoalesceStep.java        |  86 ++
 .../traversal/step/map/CountGlobalStep.java     | 134 +++
 .../traversal/step/map/CountLocalStep.java      |  51 +
 .../traversal/step/map/DedupLocalStep.java      |  51 +
 .../traversal/step/map/EdgeOtherVertexStep.java |  58 ++
 .../traversal/step/map/EdgeVertexStep.java      |  67 ++
 .../process/traversal/step/map/FlatMapStep.java |  59 ++
 .../process/traversal/step/map/FoldStep.java    |  93 ++
 .../traversal/step/map/GroupCountStep.java      | 170 ++++
 .../process/traversal/step/map/GroupStep.java   | 277 ++++++
 .../process/traversal/step/map/IdStep.java      |  47 +
 .../process/traversal/step/map/KeyStep.java     |  47 +
 .../process/traversal/step/map/LabelStep.java   |  47 +
 .../traversal/step/map/LambdaFlatMapStep.java   |  49 +
 .../traversal/step/map/LambdaMapStep.java       |  48 +
 .../process/traversal/step/map/MapStep.java     |  53 ++
 .../traversal/step/map/MaxGlobalStep.java       | 133 +++
 .../traversal/step/map/MaxLocalStep.java        |  59 ++
 .../traversal/step/map/MeanGlobalStep.java      | 218 +++++
 .../traversal/step/map/MeanLocalStep.java       |  59 ++
 .../traversal/step/map/MinGlobalStep.java       | 133 +++
 .../traversal/step/map/MinLocalStep.java        |  59 ++
 .../traversal/step/map/OrderGlobalStep.java     |  95 ++
 .../traversal/step/map/OrderLocalStep.java      | 100 ++
 .../process/traversal/step/map/PathStep.java    |  95 ++
 .../traversal/step/map/PropertiesStep.java      |  71 ++
 .../traversal/step/map/PropertyElementStep.java |  50 +
 .../traversal/step/map/PropertyMapStep.java     |  91 ++
 .../traversal/step/map/PropertyValueStep.java   |  47 +
 .../traversal/step/map/RangeLocalStep.java      |  84 ++
 .../process/traversal/step/map/SackStep.java    |  46 +
 .../traversal/step/map/SampleLocalStep.java     | 112 +++
 .../traversal/step/map/SelectOneStep.java       | 103 ++
 .../process/traversal/step/map/SelectStep.java  | 130 +++
 .../traversal/step/map/SumGlobalStep.java       | 137 +++
 .../traversal/step/map/SumLocalStep.java        |  58 ++
 .../process/traversal/step/map/TreeStep.java    | 178 ++++
 .../process/traversal/step/map/UnfoldStep.java  |  57 ++
 .../process/traversal/step/map/VertexStep.java  |  82 ++
 .../traversal/step/map/match/Bindings.java      |  87 ++
 .../step/map/match/CrossJoinEnumerator.java     |  96 ++
 .../traversal/step/map/match/Enumerator.java    |  46 +
 .../step/map/match/InnerJoinEnumerator.java     | 129 +++
 .../step/map/match/IteratorEnumerator.java      |  67 ++
 .../traversal/step/map/match/MatchStep.java     | 559 +++++++++++
 .../step/map/match/SerialEnumerator.java        | 119 +++
 .../step/map/match/SimpleEnumerator.java        |  66 ++
 .../step/sideEffect/AddPropertyStep.java        |  54 ++
 .../step/sideEffect/AggregateStep.java          | 160 ++++
 .../traversal/step/sideEffect/GraphStep.java    |  99 ++
 .../sideEffect/GroupCountSideEffectStep.java    | 171 ++++
 .../step/sideEffect/GroupSideEffectStep.java    | 248 +++++
 .../traversal/step/sideEffect/IdentityStep.java |  40 +
 .../traversal/step/sideEffect/InjectStep.java   |  50 +
 .../step/sideEffect/LambdaSideEffectStep.java   |  48 +
 .../traversal/step/sideEffect/ProfileStep.java  | 219 +++++
 .../step/sideEffect/SackElementValueStep.java   |  66 ++
 .../step/sideEffect/SackObjectStep.java         |  55 ++
 .../step/sideEffect/SideEffectCapStep.java      |  80 ++
 .../step/sideEffect/SideEffectStep.java         |  42 +
 .../traversal/step/sideEffect/StartStep.java    |  79 ++
 .../traversal/step/sideEffect/StoreStep.java    | 159 ++++
 .../traversal/step/sideEffect/SubgraphStep.java | 122 +++
 .../step/sideEffect/TreeSideEffectStep.java     | 182 ++++
 .../traversal/step/util/AbstractStep.java       | 183 ++++
 .../process/traversal/step/util/BulkSet.java    | 186 ++++
 .../step/util/CollectingBarrierStep.java        |  67 ++
 .../traversal/step/util/ComputerAwareStep.java  |  94 ++
 .../step/util/ElementFunctionComparator.java    |  57 ++
 .../step/util/ElementValueComparator.java       |  56 ++
 .../process/traversal/step/util/EmptyPath.java  | 102 ++
 .../process/traversal/step/util/EmptyStep.java  | 143 +++
 .../step/util/ExpandableStepIterator.java       |  77 ++
 .../traversal/step/util/HasContainer.java       | 113 +++
 .../traversal/step/util/ImmutablePath.java      | 182 ++++
 .../process/traversal/step/util/MapHelper.java  |  48 +
 .../traversal/step/util/MarkerIdentityStep.java |  39 +
 .../traversal/step/util/MutablePath.java        | 107 +++
 .../traversal/step/util/PathIdentityStep.java   |  48 +
 .../step/util/ReducingBarrierStep.java          | 179 ++++
 .../process/traversal/step/util/SparsePath.java |  95 ++
 .../step/util/SupplyingBarrierStep.java         |  63 ++
 .../step/util/TraversalComparator.java          |  57 ++
 .../process/traversal/step/util/Tree.java       | 134 +++
 .../strategy/AbstractTraversalStrategy.java     |  43 +
 .../strategy/decoration/ElementIdStrategy.java  |  14 +-
 .../strategy/decoration/PartitionStrategy.java  |  26 +-
 .../strategy/decoration/ReadOnlyStrategy.java   |   6 +-
 .../strategy/decoration/SubgraphStrategy.java   |  26 +-
 .../ComparatorHolderRemovalStrategy.java        |  54 ++
 .../optimization/ConjunctionStrategy.java       |  83 ++
 .../optimization/DedupOptimizerStrategy.java    |  75 ++
 .../optimization/EngineDependentStrategy.java   |  46 +
 .../optimization/IdentityRemovalStrategy.java   |  49 +
 .../optimization/LabeledEndStepStrategy.java    |  50 +
 .../optimization/MatchWhereStrategy.java        |  90 ++
 .../strategy/optimization/ProfileStrategy.java  | 112 +++
 .../optimization/RangeByIsCountStrategy.java    |  91 ++
 .../optimization/TimeLimitedStrategy.java       |  49 +
 .../TraversalVerificationStrategy.java          |  72 ++
 .../traverser/B_O_PA_S_SE_SL_Traverser.java     |  86 ++
 .../B_O_PA_S_SE_SL_TraverserGenerator.java      |  62 ++
 .../traverser/B_O_P_PA_S_SE_SL_Traverser.java   |  58 ++
 .../B_O_P_PA_S_SE_SL_TraverserGenerator.java    |  61 ++
 .../traversal/traverser/B_O_Traverser.java      |  70 ++
 .../traverser/B_O_TraverserGenerator.java       |  55 ++
 .../traversal/traverser/O_Traverser.java        |  35 +
 .../traverser/O_TraverserGenerator.java         |  52 ++
 .../traverser/TraverserGeneratorFactory.java    |  33 +
 .../traverser/TraverserRequirement.java         |  39 +
 .../traverser/util/AbstractPathTraverser.java   | 213 +++++
 .../traverser/util/AbstractTraverser.java       | 187 ++++
 .../util/DefaultTraverserGeneratorFactory.java  |  64 ++
 .../traverser/util/EmptyTraverser.java          | 153 +++
 .../traversal/traverser/util/TraverserSet.java  | 143 +++
 .../traversal/util/DefaultTraversal.java        | 256 +++++
 .../util/DefaultTraversalSideEffects.java       | 202 ++++
 .../util/DefaultTraversalStrategies.java        | 105 +++
 .../traversal/util/DependantMutableMetrics.java |  59 ++
 .../process/traversal/util/EmptyTraversal.java  |  20 +-
 .../util/EmptyTraversalSideEffects.java         |   2 +-
 .../util/EmptyTraversalStrategies.java          |  11 +-
 .../traversal/util/ImmutableMetrics.java        | 103 ++
 .../gremlin/process/traversal/util/Metrics.java | 104 +++
 .../process/traversal/util/MutableMetrics.java  | 171 ++++
 .../traversal/util/SideEffectHelper.java        |   2 +-
 .../util/StandardTraversalMetrics.java          | 204 ++++
 .../process/traversal/util/StepPosition.java    |  57 ++
 .../process/traversal/util/TraversalHelper.java |  17 +-
 .../process/traversal/util/TraversalMatrix.java |  66 ++
 .../traversal/util/TraversalMetrics.java        |  77 ++
 .../process/traversal/util/TraversalRing.java   |   2 +-
 .../process/traversal/util/TraversalUtil.java   |   4 +-
 .../traverser/B_O_PA_S_SE_SL_Traverser.java     |  87 --
 .../B_O_PA_S_SE_SL_TraverserGenerator.java      |  62 --
 .../traverser/B_O_P_PA_S_SE_SL_Traverser.java   |  58 --
 .../B_O_P_PA_S_SE_SL_TraverserGenerator.java    |  61 --
 .../process/traverser/B_O_Traverser.java        |  70 --
 .../traverser/B_O_TraverserGenerator.java       |  55 --
 .../gremlin/process/traverser/O_Traverser.java  |  35 -
 .../process/traverser/O_TraverserGenerator.java |  52 --
 .../traverser/TraverserGeneratorFactory.java    |  33 -
 .../process/traverser/TraverserRequirement.java |  39 -
 .../traverser/util/AbstractPathTraverser.java   | 213 -----
 .../traverser/util/AbstractTraverser.java       | 187 ----
 .../util/DefaultTraverserGeneratorFactory.java  |  64 --
 .../process/traverser/util/EmptyTraverser.java  | 153 ---
 .../tinkerpop/gremlin/process/util/BulkSet.java | 186 ----
 .../gremlin/process/util/MapHelper.java         |  48 -
 .../gremlin/process/util/TraverserSet.java      | 143 ---
 .../util/metric/DependantMutableMetrics.java    |  59 --
 .../process/util/metric/ImmutableMetrics.java   | 103 --
 .../gremlin/process/util/metric/Metrics.java    | 104 ---
 .../process/util/metric/MutableMetrics.java     | 171 ----
 .../util/metric/StandardTraversalMetrics.java   | 204 ----
 .../process/util/metric/TraversalMetrics.java   |  78 --
 .../gremlin/process/util/path/EmptyPath.java    | 102 --
 .../process/util/path/ImmutablePath.java        | 182 ----
 .../gremlin/process/util/path/MutablePath.java  | 107 ---
 .../gremlin/process/util/path/SparsePath.java   |  95 --
 .../tinkerpop/gremlin/structure/Graph.java      |   8 +-
 .../gremlin/structure/io/GraphReader.java       |   2 +-
 .../gremlin/structure/io/GraphWriter.java       |   2 +-
 .../structure/io/graphml/GraphMLReader.java     |   2 +-
 .../structure/io/graphml/GraphMLWriter.java     |   2 +-
 .../structure/io/graphson/GraphSONModule.java   |   6 +-
 .../structure/io/graphson/GraphSONReader.java   |   2 +-
 .../structure/io/graphson/GraphSONWriter.java   |   2 +-
 .../io/graphson/LegacyGraphSONReader.java       |   2 +-
 .../structure/io/gryo/GraphSerializer.java      |   4 +-
 .../structure/io/gryo/GremlinClassResolver.java |   2 +-
 .../gremlin/structure/io/gryo/GryoMapper.java   |  24 +-
 .../gremlin/structure/io/gryo/GryoReader.java   |   2 +-
 .../io/gryo/VertexByteArrayInputStream.java     |   2 +-
 .../structure/strategy/GraphStrategy.java       |   2 +-
 .../gremlin/structure/strategy/IdStrategy.java  |   4 +-
 .../structure/strategy/PartitionStrategy.java   |  14 +-
 .../structure/strategy/SequenceStrategy.java    |   2 +-
 .../structure/strategy/StrategyGraph.java       |   1 -
 .../structure/strategy/SubgraphStrategy.java    |   2 +-
 .../step/sideEffect/StrategyGraphStep.java      |   6 +-
 .../gremlin/structure/util/ElementHelper.java   |  22 +-
 .../gremlin/structure/util/StringFactory.java   |  10 +-
 .../structure/util/batch/BatchGraph.java        |   4 +-
 .../structure/util/detached/DetachedEdge.java   |   2 +-
 .../util/detached/DetachedFactory.java          |   2 +-
 .../structure/util/detached/DetachedPath.java   |   4 +-
 .../structure/util/detached/DetachedVertex.java |   4 +-
 .../structure/util/empty/EmptyGraph.java        |   2 -
 .../gremlin/util/function/BulkSetSupplier.java  |   2 +-
 .../util/function/MeanNumberSupplier.java       |   2 +-
 .../util/function/TraversableLambda.java        |   2 +-
 .../gremlin/util/function/TreeSupplier.java     |   2 +-
 .../gremlin/util/iterator/ArrayIterator.java    |   2 +-
 .../gremlin/util/iterator/DoubleIterator.java   |   2 +-
 .../gremlin/util/iterator/EmptyIterator.java    |   2 +-
 .../gremlin/util/iterator/IteratorUtils.java    |   2 +-
 .../gremlin/util/iterator/MultiIterator.java    |   2 +-
 .../gremlin/util/iterator/SingleIterator.java   |   2 +-
 .../process/TraversalStrategiesTest.java        |   7 +-
 .../step/filter/ConjunctionStepTest.java        |   7 +-
 .../strategy/RangeByIsCountStrategyTest.java    |  15 +-
 .../strategy/TimeLimitedStrategyTest.java       |  11 +-
 .../gremlin/process/graph/util/TreeTest.java    |   1 +
 .../decoration/PartitionStrategyTest.java       |  20 +-
 .../decoration/ReadOnlyStrategyTest.java        |   4 +-
 .../decoration/SubgraphStrategyTest.java        |  25 +-
 .../gremlin/process/util/BulkSetTest.java       |   1 +
 .../process/util/TraversalHelperTest.java       |  19 +-
 .../structure/util/ElementHelperTest.java       |   2 +-
 .../util/iterator/ArrayIteratorTest.java        |   2 +-
 .../util/iterator/DoubleIteratorTest.java       |   2 +-
 .../util/iterator/EmptyIteratorTest.java        |   2 +-
 .../util/iterator/MultiIteratorTest.java        |   2 +-
 .../util/iterator/SingleIteratorTest.java       |   2 +-
 .../driver/message/ResponseStatusCode.java      |   2 +-
 .../ser/GryoMessageSerializerV1D0Test.java      |   2 +-
 .../JsonMessageSerializerGremlinV1d0Test.java   |   2 +-
 .../ser/JsonMessageSerializerV1d0Test.java      |   2 +-
 .../gremlin/process/ComputerTestHelper.groovy   |  45 -
 .../process/computer/ComputerTestHelper.groovy  |  46 +
 .../step/branch/GroovyBranchTest.groovy         |  80 --
 .../step/branch/GroovyChooseTest.groovy         |  51 -
 .../step/branch/GroovyLocalTest.groovy          | 146 ---
 .../step/branch/GroovyRepeatTest.groovy         | 134 ---
 .../step/branch/GroovyUnionTest.groovy          | 111 ---
 .../traversal/step/filter/GroovyAndTest.groovy  |  66 --
 .../traversal/step/filter/GroovyCoinTest.groovy |  60 --
 .../step/filter/GroovyCyclicPathTest.groovy     |  61 --
 .../step/filter/GroovyDedupTest.groovy          | 100 --
 .../step/filter/GroovyExceptTest.groovy         | 115 ---
 .../step/filter/GroovyFilterTest.groovy         | 179 ----
 .../step/filter/GroovyHasNotTest.groovy         |  68 --
 .../traversal/step/filter/GroovyHasTest.groovy  | 191 ----
 .../traversal/step/filter/GroovyIsTest.groovy   |  91 --
 .../traversal/step/filter/GroovyOrTest.groovy   |  66 --
 .../step/filter/GroovyRangeTest.groovy          | 198 ----
 .../step/filter/GroovyRetainTest.groovy         |  68 --
 .../step/filter/GroovySampleTest.groovy         | 115 ---
 .../step/filter/GroovySimplePathTest.groovy     |  62 --
 .../step/filter/GroovyWhereTest.groovy          |  98 --
 .../traversal/step/map/GroovyAddEdgeTest.groovy |  51 -
 .../step/map/GroovyAddVertexTest.groovy         |  46 -
 .../traversal/step/map/GroovyBackTest.groovy    | 147 ---
 .../step/map/GroovyCoalesceTest.groovy          | 104 ---
 .../traversal/step/map/GroovyCountTest.groovy   | 119 ---
 .../traversal/step/map/GroovyFoldTest.groovy    |  79 --
 .../traversal/step/map/GroovyMapTest.groovy     | 129 ---
 .../traversal/step/map/GroovyMatchTest.groovy   | 187 ----
 .../traversal/step/map/GroovyMaxTest.groovy     |  74 --
 .../traversal/step/map/GroovyMeanTest.groovy    |  63 --
 .../traversal/step/map/GroovyMinTest.groovy     |  74 --
 .../traversal/step/map/GroovyOrderTest.groovy   | 184 ----
 .../traversal/step/map/GroovyPathTest.groovy    | 115 ---
 .../step/map/GroovyPropertiesTest.groovy        |  61 --
 .../traversal/step/map/GroovySelectTest.groovy  | 208 -----
 .../traversal/step/map/GroovySumTest.groovy     |  63 --
 .../traversal/step/map/GroovyUnfoldTest.groovy  |  63 --
 .../step/map/GroovyValueMapTest.groovy          |  68 --
 .../traversal/step/map/GroovyVertexTest.groovy  | 294 ------
 .../step/sideEffect/GroovyAggregateTest.groovy  |  71 --
 .../step/sideEffect/GroovyGroupCountTest.groovy | 126 ---
 .../step/sideEffect/GroovyGroupTest.groovy      |  97 --
 .../step/sideEffect/GroovyInjectTest.groovy     |  74 --
 .../step/sideEffect/GroovyProfileTest.groovy    |  95 --
 .../step/sideEffect/GroovySackTest.groovy       |  72 --
 .../sideEffect/GroovySideEffectCapTest.groovy   |  65 --
 .../step/sideEffect/GroovySideEffectTest.groovy |  57 --
 .../step/sideEffect/GroovyStoreTest.groovy      |  84 --
 .../step/sideEffect/GroovySubgraphTest.groovy   |  49 -
 .../step/sideEffect/GroovyTreeTest.groovy       | 105 ---
 .../step/branch/GroovyBranchTest.groovy         |  80 ++
 .../step/branch/GroovyChooseTest.groovy         |  51 +
 .../step/branch/GroovyLocalTest.groovy          | 145 +++
 .../step/branch/GroovyRepeatTest.groovy         | 134 +++
 .../step/branch/GroovyUnionTest.groovy          | 111 +++
 .../traversal/step/filter/GroovyAndTest.groovy  |  65 ++
 .../traversal/step/filter/GroovyCoinTest.groovy |  59 ++
 .../step/filter/GroovyCyclicPathTest.groovy     |  60 ++
 .../step/filter/GroovyDedupTest.groovy          | 105 +++
 .../step/filter/GroovyExceptTest.groovy         | 114 +++
 .../step/filter/GroovyFilterTest.groovy         | 179 ++++
 .../step/filter/GroovyHasNotTest.groovy         |  68 ++
 .../traversal/step/filter/GroovyHasTest.groovy  | 191 ++++
 .../traversal/step/filter/GroovyIsTest.groovy   |  90 ++
 .../traversal/step/filter/GroovyOrTest.groovy   |  65 ++
 .../step/filter/GroovyRangeTest.groovy          | 196 ++++
 .../step/filter/GroovyRetainTest.groovy         |  67 ++
 .../step/filter/GroovySampleTest.groovy         | 113 +++
 .../step/filter/GroovySimplePathTest.groovy     |  61 ++
 .../step/filter/GroovyWhereTest.groovy          |  95 ++
 .../traversal/step/map/GroovyAddEdgeTest.groovy |  51 +
 .../step/map/GroovyAddVertexTest.groovy         |  46 +
 .../traversal/step/map/GroovyBackTest.groovy    | 146 +++
 .../step/map/GroovyCoalesceTest.groovy          | 103 ++
 .../traversal/step/map/GroovyCountTest.groovy   | 117 +++
 .../traversal/step/map/GroovyFoldTest.groovy    |  76 ++
 .../traversal/step/map/GroovyMapTest.groovy     | 129 +++
 .../traversal/step/map/GroovyMatchTest.groovy   | 186 ++++
 .../traversal/step/map/GroovyMaxTest.groovy     |  74 ++
 .../traversal/step/map/GroovyMeanTest.groovy    |  63 ++
 .../traversal/step/map/GroovyMinTest.groovy     |  74 ++
 .../traversal/step/map/GroovyOrderTest.groovy   | 188 ++++
 .../traversal/step/map/GroovyPathTest.groovy    | 113 +++
 .../step/map/GroovyPropertiesTest.groovy        |  60 ++
 .../traversal/step/map/GroovySelectTest.groovy  | 206 ++++
 .../traversal/step/map/GroovySumTest.groovy     |  63 ++
 .../traversal/step/map/GroovyUnfoldTest.groovy  |  63 ++
 .../step/map/GroovyValueMapTest.groovy          |  67 ++
 .../traversal/step/map/GroovyVertexTest.groovy  | 293 ++++++
 .../step/sideEffect/GroovyAggregateTest.groovy  |  70 ++
 .../step/sideEffect/GroovyGroupCountTest.groovy | 126 +++
 .../step/sideEffect/GroovyGroupTest.groovy      | 101 ++
 .../step/sideEffect/GroovyInjectTest.groovy     |  74 ++
 .../step/sideEffect/GroovyProfileTest.groovy    |  93 ++
 .../step/sideEffect/GroovySackTest.groovy       |  72 ++
 .../sideEffect/GroovySideEffectCapTest.groovy   |  64 ++
 .../step/sideEffect/GroovySideEffectTest.groovy |  56 ++
 .../step/sideEffect/GroovyStoreTest.groovy      |  83 ++
 .../step/sideEffect/GroovySubgraphTest.groovy   |  48 +
 .../step/sideEffect/GroovyTreeTest.groovy       | 109 +++
 .../engine/GremlinExecutorPerformanceTest.java  |   2 +-
 .../GremlinGroovyScriptEngineOverGraphTest.java |   4 +-
 .../process/GroovyProcessComputerSuite.java     |  86 +-
 .../process/GroovyProcessStandardSuite.java     | 100 +-
 .../gremlin/groovy/loaders/StepLoader.groovy    |   2 +-
 .../gremlin/groovy/loaders/SugarLoader.groovy   |  10 +-
 .../AbstractImportCustomizerProvider.java       |  16 +-
 .../server/op/AbstractEvalOpProcessor.java      |   2 +-
 .../server/GremlinServerIntegrateTest.java      |   3 +-
 .../tinkerpop/gremlin/AbstractGremlinSuite.java |   2 +-
 .../tinkerpop/gremlin/AbstractGremlinTest.java  |   4 +-
 .../apache/tinkerpop/gremlin/GraphManager.java  |   2 +-
 .../apache/tinkerpop/gremlin/GraphProvider.java |  36 +-
 .../process/AbstractGremlinProcessTest.java     |   4 +-
 .../tinkerpop/gremlin/process/IgnoreEngine.java |   2 +
 .../gremlin/process/ProcessComputerSuite.java   |  91 +-
 .../gremlin/process/ProcessStandardSuite.java   | 108 +--
 .../process/TraversalPerformanceTest.java       |   4 +-
 .../tinkerpop/gremlin/process/UseEngine.java    |   2 +
 .../process/computer/GraphComputerTest.java     |   4 +-
 .../ranking/PageRankVertexProgramTest.java      |   2 +-
 .../computer/util/ComputerGraphTest.java        |   2 +-
 .../graph/traversal/step/branch/BranchTest.java |  82 --
 .../graph/traversal/step/branch/ChooseTest.java |  75 --
 .../graph/traversal/step/branch/LocalTest.java  | 255 -----
 .../graph/traversal/step/branch/RepeatTest.java | 272 ------
 .../graph/traversal/step/branch/UnionTest.java  | 195 ----
 .../graph/traversal/step/filter/AndTest.java    |  79 --
 .../graph/traversal/step/filter/CoinTest.java   |  84 --
 .../traversal/step/filter/CyclicPathTest.java   |  86 --
 .../graph/traversal/step/filter/DedupTest.java  | 146 ---
 .../graph/traversal/step/filter/ExceptTest.java | 187 ----
 .../graph/traversal/step/filter/FilterTest.java | 222 -----
 .../graph/traversal/step/filter/HasNotTest.java |  98 --
 .../graph/traversal/step/filter/HasTest.java    | 325 -------
 .../graph/traversal/step/filter/IsTest.java     | 125 ---
 .../graph/traversal/step/filter/OrTest.java     |  77 --
 .../graph/traversal/step/filter/RangeTest.java  | 265 ------
 .../graph/traversal/step/filter/RetainTest.java |  94 --
 .../graph/traversal/step/filter/SampleTest.java | 148 ---
 .../traversal/step/filter/SimplePathTest.java   |  86 --
 .../graph/traversal/step/filter/WhereTest.java  | 162 ----
 .../graph/traversal/step/map/AddEdgeTest.java   | 130 ---
 .../graph/traversal/step/map/AddVertexTest.java |  91 --
 .../graph/traversal/step/map/BackTest.java      | 221 -----
 .../graph/traversal/step/map/CoalesceTest.java  | 158 ----
 .../graph/traversal/step/map/CountTest.java     | 168 ----
 .../graph/traversal/step/map/FoldTest.java      | 109 ---
 .../graph/traversal/step/map/MapTest.java       | 153 ---
 .../graph/traversal/step/map/MatchTest.java     | 931 -------------------
 .../graph/traversal/step/map/MaxTest.java       |  93 --
 .../graph/traversal/step/map/MeanTest.java      |  88 --
 .../graph/traversal/step/map/MinTest.java       |  93 --
 .../graph/traversal/step/map/OrderTest.java     | 288 ------
 .../graph/traversal/step/map/PathTest.java      | 165 ----
 .../traversal/step/map/PropertiesTest.java      |  65 --
 .../graph/traversal/step/map/SelectTest.java    | 310 ------
 .../graph/traversal/step/map/SumTest.java       |  83 --
 .../graph/traversal/step/map/UnfoldTest.java    | 109 ---
 .../graph/traversal/step/map/ValueMapTest.java  | 145 ---
 .../graph/traversal/step/map/VertexTest.java    | 617 ------------
 .../step/sideEffect/AggregateTest.java          | 149 ---
 .../step/sideEffect/GroupCountTest.java         | 177 ----
 .../traversal/step/sideEffect/GroupTest.java    | 171 ----
 .../traversal/step/sideEffect/InjectTest.java   | 100 --
 .../traversal/step/sideEffect/ProfileTest.java  | 271 ------
 .../traversal/step/sideEffect/SackTest.java     | 105 ---
 .../step/sideEffect/SideEffectCapTest.java      |  95 --
 .../step/sideEffect/SideEffectTest.java         | 116 ---
 .../traversal/step/sideEffect/StoreTest.java    | 137 ---
 .../traversal/step/sideEffect/SubgraphTest.java | 116 ---
 .../traversal/step/sideEffect/TreeTest.java     | 139 ---
 .../step/util/TraversalSideEffectsTest.java     |  58 --
 .../TraversalVerificationStrategyTest.java      | 131 ---
 .../process/traversal/CoreTraversalTest.java    |   8 +-
 .../process/traversal/DefaultTraversalTest.java |  50 -
 .../traversal/TraversalSideEffectsTest.java     |  56 ++
 .../traversal/step/branch/BranchTest.java       |  82 ++
 .../traversal/step/branch/ChooseTest.java       |  75 ++
 .../traversal/step/branch/LocalTest.java        | 255 +++++
 .../traversal/step/branch/RepeatTest.java       | 272 ++++++
 .../traversal/step/branch/UnionTest.java        | 194 ++++
 .../process/traversal/step/filter/AndTest.java  |  79 ++
 .../process/traversal/step/filter/CoinTest.java |  84 ++
 .../traversal/step/filter/CyclicPathTest.java   |  86 ++
 .../traversal/step/filter/DedupTest.java        | 146 +++
 .../traversal/step/filter/ExceptTest.java       | 186 ++++
 .../traversal/step/filter/FilterTest.java       | 221 +++++
 .../traversal/step/filter/HasNotTest.java       |  98 ++
 .../process/traversal/step/filter/HasTest.java  | 325 +++++++
 .../process/traversal/step/filter/IsTest.java   | 125 +++
 .../process/traversal/step/filter/OrTest.java   |  77 ++
 .../traversal/step/filter/RangeTest.java        | 265 ++++++
 .../traversal/step/filter/RetainTest.java       |  93 ++
 .../traversal/step/filter/SampleTest.java       | 147 +++
 .../traversal/step/filter/SimplePathTest.java   |  86 ++
 .../traversal/step/filter/WhereTest.java        | 161 ++++
 .../process/traversal/step/map/AddEdgeTest.java | 130 +++
 .../traversal/step/map/AddVertexTest.java       |  91 ++
 .../process/traversal/step/map/BackTest.java    | 220 +++++
 .../traversal/step/map/CoalesceTest.java        | 158 ++++
 .../process/traversal/step/map/CountTest.java   | 168 ++++
 .../process/traversal/step/map/FoldTest.java    | 108 +++
 .../process/traversal/step/map/MapTest.java     | 152 +++
 .../process/traversal/step/map/MatchTest.java   | 931 +++++++++++++++++++
 .../process/traversal/step/map/MaxTest.java     |  93 ++
 .../process/traversal/step/map/MeanTest.java    |  88 ++
 .../process/traversal/step/map/MinTest.java     |  93 ++
 .../process/traversal/step/map/OrderTest.java   | 288 ++++++
 .../process/traversal/step/map/PathTest.java    | 165 ++++
 .../traversal/step/map/PropertiesTest.java      |  65 ++
 .../process/traversal/step/map/SelectTest.java  | 310 ++++++
 .../process/traversal/step/map/SumTest.java     |  83 ++
 .../process/traversal/step/map/UnfoldTest.java  | 109 +++
 .../traversal/step/map/ValueMapTest.java        | 144 +++
 .../process/traversal/step/map/VertexTest.java  | 617 ++++++++++++
 .../step/sideEffect/AggregateTest.java          | 149 +++
 .../step/sideEffect/GroupCountTest.java         | 177 ++++
 .../traversal/step/sideEffect/GroupTest.java    | 174 ++++
 .../traversal/step/sideEffect/InjectTest.java   | 100 ++
 .../traversal/step/sideEffect/ProfileTest.java  | 274 ++++++
 .../traversal/step/sideEffect/SackTest.java     | 103 ++
 .../step/sideEffect/SideEffectCapTest.java      |  95 ++
 .../step/sideEffect/SideEffectTest.java         | 116 +++
 .../traversal/step/sideEffect/StoreTest.java    | 137 +++
 .../traversal/step/sideEffect/SubgraphTest.java | 116 +++
 .../traversal/step/sideEffect/TreeTest.java     | 142 +++
 .../process/traversal/step/util/PathTest.java   | 122 +++
 .../PartitionStrategyProcessTest.java           |   4 +-
 .../decoration/ReadOnlyStrategyProcessTest.java |   6 +-
 .../decoration/SubgraphStrategyProcessTest.java |  10 +-
 .../TraversalVerificationStrategyTest.java      | 129 +++
 .../traversal/util/DefaultTraversalTest.java    |  48 +
 .../gremlin/process/util/PathTest.java          | 124 ---
 .../tinkerpop/gremlin/structure/BatchTest.java  |   2 +-
 .../gremlin/structure/FeatureSupportTest.java   |   2 +-
 .../tinkerpop/gremlin/structure/GraphTest.java  |   2 +-
 .../tinkerpop/gremlin/structure/IoTest.java     |   2 +-
 .../gremlin/structure/SerializationTest.java    |   4 +-
 .../gremlin/structure/VertexPropertyTest.java   |   2 +-
 .../tinkerpop/gremlin/structure/VertexTest.java |   2 +-
 .../structure/strategy/IdStrategyTest.java      |   2 +-
 .../strategy/SequenceStrategyTest.java          |   2 +-
 .../structure/strategy/StrategyGraphTest.java   |   2 +-
 .../strategy/SubgraphStrategyTest.java          |   4 +-
 .../groovy/plugin/HadoopRemoteAcceptor.java     |   6 +-
 .../computer/example/TraversalSupplier1.java    |   2 +-
 .../computer/example/TraversalSupplier2.java    |   2 +-
 .../computer/example/TraversalSupplier3.java    |   2 +-
 .../computer/giraph/GiraphMessenger.java        |   6 +-
 .../computer/spark/SparkVertexPayload.java      |   6 +-
 .../gremlin/hadoop/structure/HadoopGraph.java   |  28 +-
 .../structure/hdfs/HadoopEdgeIterator.java      |   2 +-
 .../structure/hdfs/HadoopVertexIterator.java    |   2 +-
 .../hadoop/structure/hdfs/TextIterator.java     |   2 +-
 .../structure/io/ObjectWritableIterator.java    |   2 +-
 .../structure/io/script/ScriptRecordReader.java |   2 +-
 .../giraph/HadoopGiraphGraphProvider.java       |   2 +-
 .../spark/HadoopSparkGraphProvider.java         |   2 +-
 .../step/sideEffect/Neo4jGraphStep.java         | 238 -----
 .../step/util/Neo4jCypherIterator.java          |  66 --
 .../strategy/Neo4jGraphStepStrategy.java        |  69 --
 .../step/sideEffect/Neo4jGraphStep.java         | 238 +++++
 .../step/util/Neo4jCypherIterator.java          |  66 ++
 .../optimization/Neo4jGraphStepStrategy.java    |  68 ++
 .../gremlin/neo4j/structure/Neo4jGraph.java     |  16 +-
 .../gremlin/neo4j/structure/Neo4jVertex.java    |   2 +-
 .../neo4j/structure/Neo4jVertexProperty.java    |   2 +-
 .../gremlin/neo4j/BaseNeo4jGraphTest.java       |   2 +-
 .../neo4j/process/Neo4jCypherStartTest.java     |   2 +-
 .../gremlin/neo4j/structure/Neo4jGraphTest.java |   6 +-
 .../process/computer/TinkerGraphComputer.java   |   2 +-
 .../process/computer/TinkerMessenger.java       |   6 +-
 .../traversal/sideEffect/TinkerGraphStep.java   | 117 ---
 .../strategy/TinkerGraphStepStrategy.java       |  74 --
 .../step/sideEffect/TinkerGraphStep.java        | 117 +++
 .../optimization/TinkerGraphStepStrategy.java   |  74 ++
 .../tinkergraph/structure/TinkerEdge.java       |   2 +-
 .../tinkergraph/structure/TinkerFactory.java    |  12 +-
 .../tinkergraph/structure/TinkerGraph.java      |   4 +-
 .../process/TinkerGraphComputerProvider.java    |   4 +-
 .../tinkergraph/structure/TinkerGraphTest.java  |   8 +-
 732 files changed, 33648 insertions(+), 33704 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 3910e7f..e9ebd66 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,8 @@ image::http://www.tinkerpop.com/docs/current/images/gremlin-hindu.png[width=225]
 TinkerPop 3.0.0.M8 (Release Date: NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Refactored step API -- the TinkerPop3 steps are the foundation for any domain specific language (including graph).
+* `MapReduce` now has `workerStart(Stage)` and `workerEnd(Stage)` methods with analagous semantics to `VertexProgram`.
 * Hadoop-Gremlin `ObjectWritable` now leverages Kryo for data serialization.
 * `GiraphGraphComputer` supports arbitrary objects as the vertex id -- previously, only long ids were supported.
 * Added `VertexProgramPool` to support thread safe pooling of vertex programs for graph computers that provide threaded workers.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
----------------------------------------------------------------------
diff --git a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
index 255a429..f065345 100644
--- a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
+++ b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiRemoteAcceptor.groovy
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.console.plugin
 
 import org.apache.tinkerpop.gremlin.groovy.plugin.RemoteAcceptor
 import org.apache.tinkerpop.gremlin.groovy.plugin.RemoteException
-import org.apache.tinkerpop.gremlin.process.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
 import org.apache.tinkerpop.gremlin.structure.Edge
 import org.apache.tinkerpop.gremlin.structure.Graph
 import org.apache.tinkerpop.gremlin.structure.Vertex

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
----------------------------------------------------------------------
diff --git a/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java b/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
index 68d9a15..4b18cea 100644
--- a/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
+++ b/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/groovy/plugin/SugarGremlinPluginTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.console.groovy.plugin;
 
 import org.apache.tinkerpop.gremlin.groovy.plugin.SugarGremlinPlugin;
 import org.apache.tinkerpop.gremlin.groovy.util.MetaRegistryUtil;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
 import org.codehaus.groovy.tools.shell.Groovysh;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java
deleted file mode 100644
index 180252e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/FastNoSuchElementException.java
+++ /dev/null
@@ -1,46 +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;
-
-import java.util.NoSuchElementException;
-
-/**
- * Retrieve a singleton, fast {@link java.util.NoSuchElementException} without a stack trace.
- */
-public final class FastNoSuchElementException extends NoSuchElementException {
-
-    private static final long serialVersionUID = 2303108654138257697L;
-    private static final FastNoSuchElementException INSTANCE = new FastNoSuchElementException();
-
-    private FastNoSuchElementException() {
-    }
-
-    /**
-     * Retrieve a singleton, fast {@link NoSuchElementException} without a stack trace.
-     */
-    public static NoSuchElementException instance() {
-        return INSTANCE;
-    }
-
-    @Override
-    public synchronized Throwable fillInStackTrace() {
-        return this;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java
deleted file mode 100644
index d109286..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Path.java
+++ /dev/null
@@ -1,180 +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;
-
-import org.javatuples.Pair;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BiConsumer;
-import java.util.function.Consumer;
-import java.util.stream.IntStream;
-import java.util.stream.Stream;
-
-/**
- * A Path denotes a particular walk through a {@link org.apache.tinkerpop.gremlin.structure.Graph} as defined by a {@link Traverser}.
- * In abstraction, any Path implementation maintains two lists: a list of sets of labels and a list of objects.
- * The list of labels are the labels of the steps traversed.
- * The list of objects are the objects traversed.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Path extends Cloneable {
-
-    /**
-     * Get the number of step in the path.
-     *
-     * @return the size of the path
-     */
-    public default int size() {
-        return this.objects().size();
-    }
-
-    /**
-     * Add a new step to the path with an object and any number of associated labels.
-     *
-     * @param object the new head of the path
-     * @param labels the labels at the head of the path
-     * @return the extended path
-     */
-    public Path extend(final Object object, final String... labels);
-
-    /**
-     * Get the object associated with the particular label of the path.
-     * If the path as multiple labels of the type, then return a {@link List} of those objects.
-     *
-     * @param label the label of the path
-     * @param <A>   the type of the object associated with the label
-     * @return the object associated with the label of the path
-     * @throws IllegalArgumentException if the path does not contain the label
-     */
-    public default <A> A get(final String label) throws IllegalArgumentException {
-        final List<Object> objects = this.objects();
-        final List<Set<String>> labels = this.labels();
-        Object object = null;
-        for (int i = 0; i < labels.size(); i++) {
-            if (labels.get(i).contains(label)) {
-                if (null == object) {
-                    object = objects.get(i);
-                } else if (object instanceof List) {
-                    ((List) object).add(objects.get(i));
-                } else {
-                    final List list = new ArrayList(2);
-                    list.add(object);
-                    list.add(objects.get(i));
-                    object = list;
-                }
-            }
-        }
-        if (null == object)
-            throw Path.Exceptions.stepWithProvidedLabelDoesNotExist(label);
-        return (A) object;
-    }
-
-    /**
-     * Get the object associated with the specified index into the path.
-     *
-     * @param index the index of the path
-     * @param <A>   the type of the object associated with the index
-     * @return the object associated with the index of the path
-     */
-    public default <A> A get(final int index) {
-        return (A) this.objects().get(index);
-    }
-
-    /**
-     * Return true if the path has the specified label, else return false.
-     *
-     * @param label the label to search for
-     * @return true if the label exists in the path
-     */
-    public default boolean hasLabel(final String label) {
-        return this.labels().stream().filter(labels -> labels.contains(label)).findAny().isPresent();
-    }
-
-    /**
-     * Add label to the current head of the path.
-     *
-     * @param label the label to add to the head of the path
-     */
-    public void addLabel(final String label);
-
-    /**
-     * An ordered list of the objects in the path.
-     *
-     * @return the objects of the path
-     */
-    public List<Object> objects();
-
-    /**
-     * An ordered list of the labels associated with the path
-     *
-     * @return the labels of the path
-     */
-    public List<Set<String>> labels();
-
-    /**
-     * {@inheritDoc}
-     */
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public Path clone();
-
-    /**
-     * Determines whether the path is a simple or not.
-     * A simple path has no cycles and thus, no repeated objects.
-     *
-     * @return Whether the path is simple or not
-     */
-    public default boolean isSimple() {
-        final List<Object> objects = this.objects();
-        for (int i = 0; i < objects.size() - 1; i++) {
-            for (int j = i + 1; j < objects.size(); j++) {
-                if (objects.get(i).equals(objects.get(j)))
-                    return false;
-            }
-        }
-        return true;
-    }
-
-    public default void forEach(final Consumer<Object> consumer) {
-        this.objects().forEach(consumer);
-    }
-
-    public default void forEach(final BiConsumer<Object, Set<String>> consumer) {
-        final List<Object> objects = this.objects();
-        final List<Set<String>> labels = this.labels();
-        for (int i = 0; i < objects.size(); i++) {
-            consumer.accept(objects.get(i), labels.get(i));
-        }
-    }
-
-    public default Stream<Pair<Object, Set<String>>> stream() {
-        final List<Set<String>> labels = this.labels();
-        final List<Object> objects = this.objects();
-        return IntStream.range(0, this.size()).mapToObj(i -> Pair.with(objects.get(i), labels.get(i)));
-    }
-
-    public static class Exceptions {
-
-        public static IllegalArgumentException stepWithProvidedLabelDoesNotExist(final String label) {
-            return new IllegalArgumentException("The step with label " + label + "  does not exist");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java
deleted file mode 100644
index 0603879..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Scope.java
+++ /dev/null
@@ -1,27 +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;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public enum Scope {
-
-    global, local
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java
deleted file mode 100644
index fb7fb07..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Step.java
+++ /dev/null
@@ -1,158 +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;
-
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.io.Serializable;
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * A {@link Step} denotes a unit of computation within a {@link Traversal}.
- * A step takes an incoming object and yields an outgoing object.
- * Steps are chained together in a {@link Traversal} to yield a lazy function chain of computation.
- * <p/>
- * In the constructor of a Step, never store explicit sideEffect objects in {@link TraversalSideEffects}.
- * If a sideEffect needs to be registered with the {@link Traversal}, use SideEffects.registerSupplier().
- *
- * @param <S> The incoming object type of the step
- * @param <E> The outgoing object type of the step
- */
-public interface Step<S, E> extends Iterator<Traverser<E>>, Serializable, Cloneable {
-
-    /**
-     * Add a iterator of {@link Traverser} objects of type S to the step.
-     *
-     * @param starts The iterator of objects to add
-     */
-    public void addStarts(final Iterator<Traverser<S>> starts);
-
-    /**
-     * Add a single {@link Traverser} to the step.
-     *
-     * @param start The traverser to add
-     */
-    public void addStart(final Traverser<S> start);
-
-    /**
-     * Set the step that is previous to the current step.
-     * Used for linking steps together to form a function chain.
-     *
-     * @param step the previous step of this step
-     */
-    public void setPreviousStep(final Step<?, S> step);
-
-    /**
-     * Get the step prior to the current step.
-     *
-     * @return The previous step
-     */
-    public Step<?, S> getPreviousStep();
-
-    /**
-     * Set the step that is next to the current step.
-     * Used for linking steps together to form a function chain.
-     *
-     * @param step the next step of this step
-     */
-    public void setNextStep(final Step<E, ?> step);
-
-    /**
-     * Get the next step to the current step.
-     *
-     * @return The next step
-     */
-    public Step<E, ?> getNextStep();
-
-    /**
-     * Get the {@link Traversal.Admin} that this step is contained within.
-     *
-     * @param <A> The incoming object type of the traversal
-     * @param <B> The outgoing object type of the traversal
-     * @return The traversal of this step
-     */
-    public <A, B> Traversal.Admin<A, B> getTraversal();
-
-    /**
-     * Set the {@link Traversal} that this step is contained within.
-     *
-     * @param traversal the new traversal for this step
-     */
-    public void setTraversal(final Traversal.Admin<?, ?> traversal);
-
-    /**
-     * Reset the state of the step such that it has no incoming starts.
-     * Internal states are to be reset, but any sideEffect data structures are not to be recreated.
-     */
-    public void reset();
-
-    /**
-     * Cloning is used to duplicate steps for the purpose of traversal optimization and OLTP replication.
-     * When cloning a step, it is important that the steps, the cloned step is equivalent to the state of the step when reset() is called.
-     * Moreover, the previous and next steps should be set to {@link org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep}.
-     *
-     * @return The cloned step
-     */
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public Step<S, E> clone();
-
-    /**
-     * Get the label of this step.
-     * If the step is  not labeled, then an {@link Optional#empty} is returned.
-     *
-     * @return the optional label of the step
-     */
-    public Optional<String> getLabel();
-
-    /**
-     * Set the label of this step.
-     *
-     * @param label the label for this step
-     */
-    public void setLabel(final String label);
-
-    /**
-     * Get the unique id of the step.
-     * These ids can change when strategies are applied and anonymous traversals are embedded in the parent traversal.
-     * A developer should typically not need to call this method.
-     *
-     * @param id the unique id of the step
-     */
-    public void setId(final String id);
-
-    /**
-     * Get the unique id of this step.
-     *
-     * @return the unique id of the step
-     */
-    public String getId();
-
-    /**
-     * Provide the necessary {@link org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement} that must be met by the traverser in order for the step to function properly.
-     * The provided default implements returns an empty set.
-     *
-     * @return the set of requirements
-     */
-    public default Set<TraverserRequirement> getRequirements() {
-        return Collections.emptySet();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java
deleted file mode 100644
index 20d4f92..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/T.java
+++ /dev/null
@@ -1,114 +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;
-
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
-
-import java.util.function.Function;
-
-/**
- * A collection of (T)okens which allows for more concise Traversal definitions.
- * T implements {@link Function} can be used to map an element to its token value.
- * For example, <code>T.id.apply(element)</code>.
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public enum T implements Function<Element, Object> {
-    /**
-     * Label (representing Element.label())
-     */
-    label {
-        @Override
-        public String getAccessor() {
-            return LABEL;
-        }
-
-        @Override
-        public String apply(final Element element) {
-            return element.label();
-        }
-    },
-    /**
-     * Id (representing Element.id())
-     */
-    id {
-        @Override
-        public String getAccessor() {
-            return ID;
-        }
-
-        @Override
-        public Object apply(final Element element) {
-            return element.id();
-        }
-    },
-    /**
-     * Key (representing Property.key())
-     */
-    key {
-        @Override
-        public String getAccessor() {
-            return KEY;
-        }
-
-        @Override
-        public String apply(final Element element) {
-            return ((VertexProperty) element).key();
-        }
-    },
-    /**
-     * Value (representing Property.value())
-     */
-    value {
-        @Override
-        public String getAccessor() {
-            return VALUE;
-        }
-
-        @Override
-        public Object apply(final Element element) {
-            return ((VertexProperty) element).value();
-        }
-    };
-
-    private static final String LABEL = Graph.Hidden.hide("label");
-    private static final String ID = Graph.Hidden.hide("id");
-    private static final String KEY = Graph.Hidden.hide("key");
-    private static final String VALUE = Graph.Hidden.hide("value");
-
-    public abstract String getAccessor();
-
-    @Override
-    public abstract Object apply(final Element element);
-
-    public static T fromString(final String accessor) {
-        if (accessor.equals(LABEL))
-            return label;
-        else if (accessor.equals(ID))
-            return id;
-        else if (accessor.equals(KEY))
-            return key;
-        else if (accessor.equals(VALUE))
-            return value;
-        else
-            throw new IllegalArgumentException("The following token string is unknown: " + accessor);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
deleted file mode 100644
index cfaeb61..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/Traversal.java
+++ /dev/null
@@ -1,429 +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;
-
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
-import java.util.function.Consumer;
-import java.util.stream.Collectors;
-
-/**
- * A {@link Traversal} represents a directed walk over a {@link Graph}.
- * This is the base interface for all traversal's, where each extending interface is seen as a domain specific language.
- * For example, {@link GraphTraversal} is a domain specific language for traversing a graph using "graph concepts" (e.g. vertices, edges).
- * Another example may represent the graph using "social concepts" (e.g. people, cities, artifacts).
- * A {@link Traversal} is evaluated in one of two ways: {@link StandardTraversalEngine} (OLTP) and {@link ComputerTraversalEngine} (OLAP).
- * OLTP traversals leverage an iterator and are executed within a single JVM (with data access allowed to be remote).
- * OLAP traversals leverage {@link GraphComputer} and are executed between multiple JVMs (and/or cores).
- *
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
-
-    /**
-     * Used for reflection based access to the static "of" method of a Traversal.
-     */
-    public static final String OF = "of";
-
-    /**
-     * Get access to administrative methods of the traversal via its accompanying {@link Traversal.Admin}.
-     *
-     * @return the admin of this traversal
-     */
-    public default Traversal.Admin<S, E> asAdmin() {
-        return (Traversal.Admin<S, E>) this;
-    }
-
-    /**
-     * Return an {@link Optional} of the next E object in the traversal.
-     * If the traversal is empty, then an {@link Optional#empty()} is returned.
-     *
-     * @return an optional of the next object in the traversal
-     */
-    public default Optional<E> tryNext() {
-        return this.hasNext() ? Optional.of(this.next()) : Optional.empty();
-    }
-
-    /**
-     * Get the next n-number of results from the traversal.
-     * If the traversal has less than n-results, then only that number of results are returned.
-     *
-     * @param amount the number of results to get
-     * @return the n-results in a {@link List}
-     */
-    public default List<E> next(final int amount) {
-        final List<E> result = new ArrayList<>();
-        int counter = 0;
-        while (counter++ < amount && this.hasNext()) {
-            result.add(this.next());
-        }
-        return result;
-    }
-
-    /**
-     * Put all the results into an {@link ArrayList}.
-     *
-     * @return the results in a list
-     */
-    public default List<E> toList() {
-        return this.fill(new ArrayList<>());
-    }
-
-    /**
-     * Put all the results into a {@link HashSet}.
-     *
-     * @return the results in a set
-     */
-    public default Set<E> toSet() {
-        return this.fill(new HashSet<>());
-    }
-
-    /**
-     * Put all the results into a {@link BulkSet}.
-     * This can reduce both time and space when aggregating results by ensuring a weighted set.
-     *
-     * @return the results in a bulk set
-     */
-    public default BulkSet<E> toBulkSet() {
-        return this.fill(new BulkSet<>());
-    }
-
-    /**
-     * Add all the results of the traversal to the provided collection.
-     *
-     * @param collection the collection to fill
-     * @return the collection now filled
-     */
-    public default <C extends Collection<E>> C fill(final C collection) {
-        try {
-            if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
-            // use the end step so the results are bulked
-            final Step<?, E> endStep = this.asAdmin().getEndStep();
-            while (true) {
-                final Traverser<E> traverser = endStep.next();
-                TraversalHelper.addToCollection(collection, traverser.get(), traverser.bulk());
-            }
-        } catch (final NoSuchElementException ignored) {
-        }
-        return collection;
-    }
-
-    /**
-     * Iterate all the {@link Traverser} instances in the traversal.
-     * What is returned is the empty traversal.
-     * It is assumed that what is desired from the computation is are the sideEffects yielded by the traversal.
-     *
-     * @return the fully drained traversal
-     */
-    public default <A, B> Traversal<A, B> iterate() {
-        try {
-            if (!this.asAdmin().isLocked()) this.asAdmin().applyStrategies();
-            // use the end step so the results are bulked
-            final Step<?, E> endStep = this.asAdmin().getEndStep();
-            while (true) {
-                endStep.next();
-            }
-        } catch (final NoSuchElementException ignored) {
-        }
-        return (Traversal<A, B>) this;
-    }
-
-    /**
-     * A traversal can be rewritten such that its defined end type E may yield objects of a different type.
-     * This helper method allows for the casting of the output to the known the type.
-     *
-     * @param endType  the true output type of the traversal
-     * @param consumer a {@link Consumer} to process each output
-     * @param <E2>     the known output type of the traversal
-     */
-    public default <E2> void forEachRemaining(final Class<E2> endType, final Consumer<E2> consumer) {
-        try {
-            while (true) {
-                consumer.accept((E2) next());
-            }
-        } catch (final NoSuchElementException ignore) {
-
-        }
-    }
-
-    @Override
-    public default void forEachRemaining(final Consumer<? super E> action) {
-        try {
-            while (true) {
-                action.accept(next());
-            }
-        } catch (final NoSuchElementException ignore) {
-
-        }
-    }
-
-    /**
-     * A collection of {@link Exception} types associated with Traversal execution.
-     */
-    public static class Exceptions {
-
-        public static IllegalStateException traversalIsLocked() {
-            return new IllegalStateException("The traversal strategies are complete and the traversal can no longer be modulated");
-        }
-
-        public static IllegalStateException traversalIsNotReversible() {
-            return new IllegalStateException("The traversal is not reversible as it contains steps that are not reversible");
-        }
-    }
-
-    public interface Admin<S, E> extends Traversal<S, E> {
-
-        /**
-         * Add an iterator of {@link Traverser} objects to the head/start of the traversal.
-         * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectStep}.
-         *
-         * @param starts an iterators of traversers
-         */
-        public default void addStarts(final Iterator<Traverser<S>> starts) {
-            if (!this.isLocked()) this.applyStrategies();
-            this.getStartStep().addStarts(starts);
-        }
-
-        /**
-         * Add a single {@link Traverser} object to the head of the traversal.
-         * Users should typically not need to call this method. For dynamic inject of data, they should use {@link org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectStep}.
-         *
-         * @param start a traverser to add to the traversal
-         */
-        public default void addStart(final Traverser<S> start) {
-            if (!this.isLocked()) this.applyStrategies();
-            this.getStartStep().addStart(start);
-        }
-
-        /**
-         * Get the {@link Step} instances associated with this traversal.
-         * The steps are ordered according to their linked list structure as defined by {@link Step#getPreviousStep()} and {@link Step#getNextStep()}.
-         *
-         * @return the ordered steps of the traversal
-         */
-        public List<Step> getSteps();
-
-        /**
-         * Add a {@link Step} to the end of the traversal. This method should link the step to its next and previous step accordingly.
-         *
-         * @param step the step to add
-         * @param <E2> the output of the step
-         * @return the updated traversal
-         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
-         */
-        public default <E2> Traversal.Admin<S, E2> addStep(final Step<?, E2> step) throws IllegalStateException {
-            return this.addStep(this.getSteps().size(), step);
-        }
-
-        /**
-         * Add a {@link Step} to an arbitrary point in the traversal.
-         *
-         * @param index the location in the traversal to insert the step
-         * @param step  the step to add
-         * @param <S2>  the new start type of the traversal (if the added step was a start step)
-         * @param <E2>  the new end type of the traversal (if the added step was an end step)
-         * @return the newly modulated traversal
-         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
-         */
-        public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException;
-
-        /**
-         * Remove a {@link Step} from the traversal.
-         *
-         * @param step the step to remove
-         * @param <S2> the new start type of the traversal (if the removed step was a start step)
-         * @param <E2> the new end type of the traversal (if the removed step was an end step)
-         * @return the newly modulated traversal
-         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
-         */
-        public default <S2, E2> Traversal.Admin<S2, E2> removeStep(final Step<?, ?> step) throws IllegalStateException {
-            return this.removeStep(this.getSteps().indexOf(step));
-        }
-
-        /**
-         * Remove a {@link Step} from the traversal.
-         *
-         * @param index the location in the traversal of the step to be evicted
-         * @param <S2>  the new start type of the traversal (if the removed step was a start step)
-         * @param <E2>  the new end type of the traversal (if the removed step was an end step)
-         * @return the newly modulated traversal
-         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
-         */
-        public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException;
-
-        /**
-         * Get the start/head of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
-         *
-         * @return the start step of the traversal
-         */
-        public default Step<S, ?> getStartStep() {
-            final List<Step> steps = this.getSteps();
-            return steps.isEmpty() ? EmptyStep.instance() : steps.get(0);
-        }
-
-        /**
-         * Get the end/tail of the traversal. If the traversal is empty, then an {@link EmptyStep} instance is returned.
-         *
-         * @return the end step of the traversal
-         */
-        public default Step<?, E> getEndStep() {
-            final List<Step> steps = this.getSteps();
-            return steps.isEmpty() ? EmptyStep.instance() : steps.get(steps.size() - 1);
-        }
-
-        /**
-         * Apply the registered {@link TraversalStrategies} to the traversal.
-         * Once the strategies are applied, the traversal is "locked" and can no longer have steps added to it.
-         * The order of operations for strategy applications should be: globally id steps, apply strategies to root traversal, then to nested traversals.
-         *
-         * @throws IllegalStateException if the {@link TraversalStrategies} have already been applied
-         */
-        public void applyStrategies() throws IllegalStateException;
-
-        /**
-         * Get the {@link TraversalEngine} that will be used to execute this traversal.
-         *
-         * @return get the traversal engine associated with this traversal.
-         */
-        public TraversalEngine getEngine();
-
-        /**
-         * Set the {@link TraversalEngine} to be used for executing this traversal.
-         *
-         * @param engine the engine to execute the traversal with.
-         */
-        public void setEngine(final TraversalEngine engine);
-
-        /**
-         * Get the {@link TraverserGenerator} associated with this traversal.
-         * The traversal generator creates {@link Traverser} instances that are respective of the traversal's {@link org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement}.
-         *
-         * @return the generator of traversers
-         */
-        public default TraverserGenerator getTraverserGenerator() {
-            return this.getStrategies().getTraverserGeneratorFactory().getTraverserGenerator(this);
-        }
-
-        /**
-         * Get the set of all {@link TraverserRequirement}s for this traversal.
-         *
-         * @return the features of a traverser that are required to execute properly in this traversal
-         */
-        public default Set<TraverserRequirement> getTraverserRequirements() {
-            final Set<TraverserRequirement> requirements = this.getSteps().stream()
-                    .flatMap(step -> ((Step<?, ?>) step).getRequirements().stream())
-                    .collect(Collectors.toSet());
-            if (this.getSideEffects().keys().size() > 0)
-                requirements.add(TraverserRequirement.SIDE_EFFECTS);
-            if (this.getSideEffects().getSackInitialValue().isPresent())
-                requirements.add(TraverserRequirement.SACK);
-            if (this.getEngine().isComputer())
-                requirements.add(TraverserRequirement.BULK);
-            return requirements;
-        }
-
-        /**
-         * Call the {@link Step#reset} method on every step in the traversal.
-         */
-        public default void reset() {
-            this.getSteps().forEach(Step::reset);
-        }
-
-        /**
-         * Set the {@link TraversalSideEffects} of this traversal.
-         *
-         * @param sideEffects the sideEffects to set for this traversal.
-         */
-        public void setSideEffects(final TraversalSideEffects sideEffects);
-
-        /**
-         * Get the {@link TraversalSideEffects} associated with the traversal.
-         *
-         * @return The traversal sideEffects
-         */
-        public TraversalSideEffects getSideEffects();
-
-        /**
-         * Set the {@link TraversalStrategies} to be used by this traversal at evaluation time.
-         *
-         * @param strategies the strategies to use on this traversal
-         */
-        public void setStrategies(final TraversalStrategies strategies);
-
-        /**
-         * Get the {@link TraversalStrategies} associated with this traversal.
-         *
-         * @return the strategies associated with this traversal
-         */
-        public TraversalStrategies getStrategies();
-
-        /**
-         * Set the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
-         * Traversals can be nested and this is the means by which the traversal tree is connected.
-         *
-         * @param step the traversal holder parent step
-         */
-        public void setParent(final TraversalParent step);
-
-        /**
-         * Get the {@link org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent} {@link Step} that is the parent of this traversal.
-         * Traversals can be nested and this is the means by which the traversal tree is walked.
-         *
-         * @return the traversal holder parent step
-         */
-        public TraversalParent getParent();
-
-        /**
-         * Cloning is used to duplicate the traversal typically in OLAP environments.
-         *
-         * @return The cloned traversal
-         */
-        @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-        public Traversal.Admin<S, E> clone();
-
-        /**
-         * When the traversal has had its {@link TraversalStrategies} applied to it, it is locked.
-         *
-         * @return whether the traversal is locked
-         */
-        public boolean isLocked();
-
-        public Optional<Graph> getGraph();
-
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
deleted file mode 100644
index d93c08d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalEngine.java
+++ /dev/null
@@ -1,55 +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;
-
-import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.io.Serializable;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public interface TraversalEngine extends Serializable {
-
-    public enum Type {STANDARD, COMPUTER}
-
-    public void processTraversal(final Traversal.Admin<?, ?> traversal);
-
-    public Type getType();
-
-    public Optional<GraphComputer> getGraphComputer();
-
-    public default boolean isStandard() {
-        return this.getType().equals(Type.STANDARD);
-    }
-
-    public default boolean isComputer() {
-        return this.getType().equals(Type.COMPUTER);
-    }
-
-    ///////////
-
-    public interface Builder extends Serializable {
-        public TraversalEngine create(final Graph graph);
-    }
-}


[16/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy
new file mode 100644
index 0000000..3ec89e9
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyChooseTest.groovy
@@ -0,0 +1,51 @@
+/*
+ * 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.branch
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class GroovyChooseTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends ChooseTest {
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+            g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends ChooseTest {
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
+            ComputerTestHelper.compute("g.V.choose(__.out.count).option(2L, __.values('name')).option(3L, __.valueMap())", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy
new file mode 100644
index 0000000..c5cbd5e
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy
@@ -0,0 +1,145 @@
+/*
+ * 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.branch
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Order
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyLocalTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends LocalTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+            g.V.local(__.properties('location').order.by(T.value, Order.incr).limit(2)).value
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
+            g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
+            g.V.local(__.outE.count());
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
+            g.V(v1Id).local(__.outE('knows').limit(1)).inV.name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+            g.V().local(__.bothE('created').limit(1)).otherV.name
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
+            g.V(v4Id).local(__.bothE('created').limit(1))
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
+            g.V(v4Id).local(__.bothE('knows', 'created').limit(1))
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
+            g.V(v4Id).local(__.bothE.limit(1)).otherV.name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
+            g.V(v4Id).local(__.bothE.limit(2).otherV).name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
+            g.V().inE('knows').local(__.limit(2).outV).name
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends LocalTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
+            ComputerTestHelper.compute("g.V.local(__.properties('location').order.by(T.value,Order.incr).limit(2)).value", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
+            ComputerTestHelper.compute("g.V.has(T.label, 'person').as('a').local(__.out('created').as('b')).select('a', 'b').by('name').by(T.id)", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
+            ComputerTestHelper.compute("g.V.local(__.outE.count())", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).local(__.outE('knows').limit(1)).inV.name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
+            ComputerTestHelper.compute("g.V().local(__.bothE('created').limit(1)).otherV.name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('created').limit(1))", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE('knows', 'created').limit(1))", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(1)).otherV.name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).local(__.bothE.limit(2)).otherV.name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
+            ComputerTestHelper.compute("g.V().local(__.inE('knows').limit(2).outV).name", g);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy
new file mode 100644
index 0000000..cee4733
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyRepeatTest.groovy
@@ -0,0 +1,134 @@
+/*
+ * 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.branch
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.groupCount
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyRepeatTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends RepeatTest {
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
+            g.V.repeat(__.out).times(2).emit.path
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+            g.V.repeat(__.out).times(2).repeat(__.in).times(2).name
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
+            g.V.repeat(__.out).times(2)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
+            g.V.repeat(__.out).times(2).emit;
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
+            g.V(v1Id).times(2).repeat(__.out).name
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
+            g.V.emit.repeat(__.out).times(2).path
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
+            g.V.emit.times(2).repeat(__.out).path
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
+            g.V(v1Id).emit(has(T.label, 'person')).repeat(__.out).name
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+            g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends RepeatTest {
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
+            ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit.path", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
+            ComputerTestHelper.compute("g.V.repeat(__.out).times(2).repeat(__.in).times(2).name", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
+            ComputerTestHelper.compute("g.V.repeat(__.out).times(2)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
+            ComputerTestHelper.compute("g.V.repeat(__.out).times(2).emit", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).times(2).repeat(__.out).name", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
+            ComputerTestHelper.compute("g.V.emit.repeat(__.out).times(2).path", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
+            ComputerTestHelper.compute("g.V.emit.times(2).repeat(__.out).path", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).emit(has(T.label, 'person')).repeat(__.out).name", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
+            ComputerTestHelper.compute("g.V.repeat(groupCount('m').by('name').out).times(2).cap('m')", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy
new file mode 100644
index 0000000..626a19e
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyUnionTest.groovy
@@ -0,0 +1,111 @@
+/*
+ * 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.branch
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyUnionTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends UnionTest {
+
+        public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
+            g.V.union(__.out, __.in).name
+        }
+
+        public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
+            g.V(v1Id).union(repeat(__.out).times(2), __.out).name
+        }
+
+        public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
+            g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)
+        }
+
+        public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+            g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount
+        }
+
+        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+            g.V.union(
+                    repeat(union(
+                            out('created'),
+                            __.in('created'))).times(2),
+                    repeat(union(
+                            __.in('created'),
+                            out('created'))).times(2)).label.groupCount()
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
+                final Object v1Id, final Object v2Id) {
+            g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
+        }
+
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends UnionTest {
+
+        public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
+            ComputerTestHelper.compute("g.V.union(__.out, __.in).name", g)
+        }
+
+        public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).union(repeat(__.out).times(2), __.out).name", g)
+        }
+
+        public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
+            ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label)", g)
+        }
+
+        public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
+            ComputerTestHelper.compute("g.V.choose(__.label.is('person'), union(__.out.lang, __.out.name), __.in.label).groupCount", g)
+        }
+
+        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
+            ComputerTestHelper.compute("""
+            g.V.union(
+                    repeat(union(
+                            out('created'),
+                            __.in('created'))).times(2),
+                    repeat(union(
+                            __.in('created'),
+                            out('created'))).times(2)).label.groupCount()
+           """, g)
+        }
+
+        @Override
+        public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(
+                final Object v1Id, final Object v2Id) {
+            g.engine(StandardTraversalEngine.INSTANCE);
+            g.V(v1Id, v2Id).union(outE().count, inE().count, outE().weight.sum);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
new file mode 100644
index 0000000..4ee88a6
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyAndTest.groovy
@@ -0,0 +1,65 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAndTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends AndTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+            g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+            g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends AndTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
+            ComputerTestHelper.compute("g.V.and(has('age', gt, 27), outE().count.is(gte, 2l)).name", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
+            ComputerTestHelper.compute("g.V.and(outE(), has(T.label, 'person') & has('age', gte, 32)).name", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy
new file mode 100644
index 0000000..01ae205
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCoinTest.groovy
@@ -0,0 +1,59 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyCoinTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends CoinTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
+            g.V.coin(1.0f)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
+            g.V.coin(0.0f)
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends CoinTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
+            ComputerTestHelper.compute("g.V.coin(1.0f)", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
+            ComputerTestHelper.compute("g.V.coin(0.0f)", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy
new file mode 100644
index 0000000..042d4e0
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyCyclicPathTest.groovy
@@ -0,0 +1,60 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyCyclicPathTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends CyclicPathTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
+            g.V(v1Id).out('created').in('created').cyclicPath
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
+            g.V(v1Id).out('created').in('created').cyclicPath.path
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends CyclicPathTest {
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1) {
+            ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath", g);
+        }
+
+        @Override
+        Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1) {
+            ComputerTestHelper.compute("g.V(${v1}).out('created').in('created').cyclicPath().path()", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy
new file mode 100644
index 0000000..036d18c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyDedupTest.groovy
@@ -0,0 +1,105 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.dedup
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyDedupTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends DedupTest {
+        @Override
+        public Traversal<Vertex, String> get_g_V_both_dedup_name() {
+            g.V.both.dedup.name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+            g.V.both.has(T.label, 'software').dedup.by('lang').name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
+            g.V().both().properties('name').order.by { a, b -> a.value() <=> b.value() }.dedup.value
+        }
+
+        @Override
+        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))
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends DedupTest {
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_both_dedup_name() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_both_name_orderXa_bX_dedup() {
+        }
+
+        @Override
+        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
+        Traversal<Vertex, String> get_g_V_both_dedup_name() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy
new file mode 100644
index 0000000..6dddba2
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyExceptTest.groovy
@@ -0,0 +1,114 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyExceptTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends ExceptTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
+            g.V(v1Id).out.except(g.V(v2Id).next())
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
+            g.V(v1Id).out.aggregate('x').out.except('x')
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
+            g.V(v1Id).out('created').in('created').except(g.V(v1Id).next()).values('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
+            g.V.out.except(g.V.toList())
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
+            g.V.out.except([])
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
+                final Object v1Id) {
+            g.V(v1Id).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
+            g.V(v1Id).as('a').out('created').in('created').except('a').name
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends ExceptTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.except(g.V(${v2Id}).next())", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.except('x')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').except(g.V(${v1Id}).next()).values('name')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
+            ComputerTestHelper.compute("g.V.out.except(g.V.toList())", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
+            ComputerTestHelper.compute("g.V.out.except([])", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(
+                final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).repeat(__.bothE('created').except('e').aggregate('e').otherV).emit.path", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').except('a').name", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy
new file mode 100644
index 0000000..6b854eb
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyFilterTest.groovy
@@ -0,0 +1,179 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyFilterTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends FilterTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
+            g.V.filter { false }
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
+            g.V.filter { true }
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
+            g.V.filter { it.property('lang').orElse("none") == 'java' }
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
+            g.V(v1Id).filter { it.age > 30 }
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
+            g.V(v1Id).out.filter { it.property('age').orElse(0) > 30 }
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+            g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
+            g.E.filter { false }
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
+            g.E.filter { true }
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends FilterTest {
+
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_V_filterXfalseX() {
+            super.g_V_filterXfalseX();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_V_filterXtrueX() {
+            super.g_V_filterXtrueX();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_V_filterXlang_eq_javaX() {
+            super.g_V_filterXlang_eq_javaX();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_VX1X_filterXage_gt_30X() {
+            super.g_VX1X_filterXage_gt_30X();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_VX1X_out_filterXage_gt_30X() {
+            super.g_VX1X_out_filterXage_gt_30X();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+            super.g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_E_filterXfalseX() {
+            super.g_E_filterXfalseX();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_E_filterXtrueX() {
+            super.g_E_filterXtrueX();
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
+            ComputerTestHelper.compute("g.V.filter { false }", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
+            ComputerTestHelper.compute("g.V.filter { true }", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
+            ComputerTestHelper.compute("g.V.filter { it.property('lang').orElse('none') == 'java' }", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).filter { it.age > 30 }", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.filter { it.property('age').orElse(0) > 30 }", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
+            ComputerTestHelper.compute("g.V.filter { it.name.startsWith('m') || it.name.startsWith('p') }", g);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
+            ComputerTestHelper.compute("g.E.filter { false }", g);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
+            ComputerTestHelper.compute("g.E.filter { true }", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
new file mode 100644
index 0000000..6e63e96
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasNotTest.groovy
@@ -0,0 +1,68 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Joshua Shinavier (http://fortytwo.net)
+ */
+public abstract class GroovyHasNotTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends HasNotTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
+            g.V(v1Id).hasNot(propertyKey)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
+            g.V.hasNot(propertyKey)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
+            return g.V().hasNot(__.out('created')).values('name');
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends HasNotTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
+            ComputerTestHelper.compute("g.V(${v1Id}).hasNot('${propertyKey}')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
+            ComputerTestHelper.compute("g.V.hasNot('${propertyKey}')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
+            ComputerTestHelper.compute("return g.V().hasNot(__.out('created')).values('name')", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
new file mode 100644
index 0000000..d4512cb
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy
@@ -0,0 +1,191 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyHasTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends HasTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
+            g.V.out('knows').has(__.out('created')).name
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
+            g.V(v1Id).has(key)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
+            g.V(v1Id).has('name', 'marko')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
+            g.V.has('name', 'marko')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
+            g.V.has('name', 'blah')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
+            g.V.has('blah')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
+            g.V(v1Id).has('age', Compare.gt, 30)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
+            g.V(v1Id).out.hasId(v2Id)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
+            g.V.has('age', Compare.gt, 30)
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
+            g.E(e7Id).hasLabel('knows')
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
+            g.E.hasLabel('knows')
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
+            g.E.hasLabel('uses', 'traverses')
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
+            g.V.hasLabel("person", "software", 'blah');
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
+            g.V.has('person', 'name', 'marko').age;
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
+            g.V(v1Id).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends HasTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
+            ComputerTestHelper.compute("g.V.out('knows').has(__.out('created')).name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
+            ComputerTestHelper.compute("g.V(${v1Id}).has('${key}')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).has('name', 'marko')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
+            ComputerTestHelper.compute("g.V.has('name', 'marko')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
+            ComputerTestHelper.compute(" g.V.has('name', 'blah')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
+            ComputerTestHelper.compute("g.V.has('blah')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).has('age', Compare.gt, 30)", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
+            ComputerTestHelper.compute(" g.V(${v1Id}).out.hasId(${v2Id})", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
+            ComputerTestHelper.compute("g.V.has('age', Compare.gt, 30)", g);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
+            ComputerTestHelper.compute(" g.E(${e7Id}).hasLabel('knows')", g);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
+            ComputerTestHelper.compute("g.E.hasLabel('knows')", g);
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
+            ComputerTestHelper.compute("g.E.hasLabel('uses', 'traverses')", g);
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
+            ComputerTestHelper.compute("g.V.hasLabel('person', 'software', 'blah')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
+            ComputerTestHelper.compute("g.V.has('person', 'name', 'marko').age", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE.has('weight', Compare.inside, [0.0d, 0.6d]).inV", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy
new file mode 100644
index 0000000..6e57af9
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyIsTest.groovy
@@ -0,0 +1,90 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyIsTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends IsTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
+            return g.V().values('age').is(32);
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
+            return g.V().values('age').is(Compare.lte, 30);
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+            return g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+            return g.V().has(__.in('created').count().is(1l)).values('name');
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+            return g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name');
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends IsTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
+            ComputerTestHelper.compute("g.V().values('age').is(32)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
+            ComputerTestHelper.compute("g.V().values('age').is(Compare.lte, 30)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
+            ComputerTestHelper.compute("g.V().values('age').is(Compare.gte, 29).is(Compare.lt, 34)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
+            ComputerTestHelper.compute("g.V().has(__.in('created').count().is(1l)).values('name')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
+            ComputerTestHelper.compute("g.V().has(__.in('created').count().is(Compare.gte, 2l)).values('name')", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy
new file mode 100644
index 0000000..7ce8fec
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyOrTest.groovy
@@ -0,0 +1,65 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE
+import static org.apache.tinkerpop.gremlin.structure.Compare.gt
+import static org.apache.tinkerpop.gremlin.structure.Compare.gte
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyOrTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends OrTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+            g.V.or(has('age', gt, 27), outE().count.gte(2l)).name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+            g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends OrTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
+            ComputerTestHelper.compute("g.V.or(has('age', gt, 27), outE().count.gte(2l)).name", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
+            ComputerTestHelper.compute("g.V.or(outE('knows'), has(T.label, 'software') | has('age', gte, 35)).name", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
new file mode 100644
index 0000000..a7d4cde
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRangeTest.groovy
@@ -0,0 +1,196 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyRangeTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends RangeTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
+            g.V(v1Id).out.limit(2)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
+            g.V.local(__.outE.limit(3)).inV.limit(3)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
+            g.V(v1Id).out('knows').outE('created')[0].inV()
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
+            g.V(v1Id).out('knows').out('created')[0]
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
+            g.V(v1Id).out('created').in('created')[1..3]
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
+            g.V(v1Id).out('created').inE('created')[1..3].outV
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+            g.V().repeat(__.both).times(3)[5..11];
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+            g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().limit(Scope.local, 1)).as('w').select().by('name').by()
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+            g.V().hasLabel('software').as('s').local(__.inE('created').values('weight').fold().range(Scope.local, 1, 3)).as('w').select().by('name').by()
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends RangeTest {
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_out_limitX2X() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+            // TODO: the traversal should work in computer mode, but throws a ClassCastException
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy
new file mode 100644
index 0000000..0c271de
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyRetainTest.groovy
@@ -0,0 +1,67 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyRetainTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends RetainTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
+            g.V(v1Id).out.retain(g.V(v2Id).next())
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
+            g.V(v1Id).out.aggregate('x').out.retain('x')
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
+            g.V(v1Id).as('a').out('created').in('created').retain('a').name
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends RetainTest {
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.retain(g.V($v2Id).next())", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.aggregate('x').out.retain('x')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('created').in('created').retain('a').name", g);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy
new file mode 100644
index 0000000..8cdb4fc
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySampleTest.groovy
@@ -0,0 +1,113 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static __.bothE
+import static __.sample
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySampleTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SampleTest {
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_sampleX1X() {
+            g.E.sample(1)
+        }
+
+        @Override
+        public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
+            g.E.sample(2).by('weight')
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
+            g.V.local(__.outE.sample(1).by('weight'))
+        }
+
+        @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))
+        }
+
+        @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))
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends SampleTest {
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_E_sampleX1X() {
+            // TODO: makes no sense when its global
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_E_sampleX2X_byXweightX() {
+            // TODO: makes no sense when its global
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
+            ComputerTestHelper.compute("g.V.local(__.outE.sample(1).by('weight'))", g)
+        }
+
+        @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))", 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))", g)
+        }
+
+        @Override
+        Traversal<Edge, Edge> get_g_E_sampleX1X() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy
new file mode 100644
index 0000000..b9789fe
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovySimplePathTest.groovy
@@ -0,0 +1,61 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySimplePathTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SimplePathTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
+            g.V(v1Id).out('created').in('created').simplePath
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
+            return g.V.repeat(__.both.simplePath).times(3).path()
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends SimplePathTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out('created').in('created').simplePath", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
+            ComputerTestHelper.compute("g.V.repeat(__.both.simplePath).times(3).path()", g);
+        }
+    }
+}


[15/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
new file mode 100644
index 0000000..b248f40
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyWhereTest.groovy
@@ -0,0 +1,95 @@
+/*
+ * 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.filter
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyWhereTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends WhereTest {
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+            g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b');
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
+            g.V.has('age').as('a').out.in.has('age').as('b').select().where('a',Compare.neq, 'b');
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+            g.V.has('age').as('a').out.in.has('age').as('b').select().where(__.as('b').has('name', 'marko'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+            g.V().has('age').as('a').out.in.has('age').as('b').select().where(__.as('a').out('knows').as('b'));
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends WhereTest {
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
+            ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.eq, 'b')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
+            ComputerTestHelper.compute("g.V.has('age').as('a').out.in.has('age').as('b').select().where('a', Compare.neq, 'b')", g);
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
new file mode 100644
index 0000000..b1fd7cd
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddEdgeTest.groovy
@@ -0,0 +1,51 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAddEdgeTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends AddEdgeTest {
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
+            g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a')
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(
+                final Object v1Id) {
+            g.V(v1Id).as('a').out('created').addOutE('createdBy', 'a', 'weight', 2)
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
+            g.V.addOutE('existsWith', g.V, 'time', 'now');
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
new file mode 100644
index 0000000..1fdf0ae
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
@@ -0,0 +1,46 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyAddVertexTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends AddVertexTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
+            g.V.addV(T.label, 'animal', 'age', 0);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
+            g.addV(T.label, 'person', 'name', 'stephen');
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy
new file mode 100644
index 0000000..620d257
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyBackTest.groovy
@@ -0,0 +1,146 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyBackTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends BackTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
+            g.V(v1Id).as('here').out.back('here')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
+            g.V(v4Id).out.as('here').has('lang', 'java').back('here')
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
+                final Object v4Id) {
+            g.V(v4Id).out.as('here').has('lang', 'java').back('here').name
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
+            g.V(v1Id).outE.as('here').inV.has('name', 'vadas').back('here')
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
+                final Object v1Id) {
+            g.V(v1Id).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
+                final Object v1Id) {
+            g.V(v1Id).outE('knows').as('here').has('weight', 1.0d).inV.has('name', 'josh').back('here')
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
+                final Object v1Id) {
+            g.V(v1Id).outE("knows").as('here').has('weight', 1.0d).as('fake').inV.has("name", 'josh').back('here')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
+            g.V().as("here").out.name.back("here");
+        }
+
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+            g.V.out('created')
+                    .union(__.as('project').in('created').has('name', 'marko').back('project'),
+                    __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends BackTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).as('here').out.back('here')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(
+                final Object v4Id) {
+            ComputerTestHelper.compute("g.V(${v4Id}).out.as('here').has('lang', 'java').back('here').name", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE.as('here').inV.has('name', 'vadas').back('here')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(
+                final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').has('weight', 1.0d).as('here').inV.has('name', 'josh').back('here')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(
+                final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).inV.has('name','josh').back('here')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(
+                final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE('knows').as('here').has('weight', 1.0d).as('fake').inV.has('name','josh').back('here')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
+            ComputerTestHelper.compute("g.V().as('here').out.name.back('here')", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
+            ComputerTestHelper.compute("""
+            g.V.out('created')
+                    .union(__.as('project').in('created').has('name', 'marko').back('project'),
+                    __.as('project').in('created').in('knows').has('name', 'marko').back('project')).groupCount().by('name');
+            """, g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy
new file mode 100644
index 0000000..815ac01
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCoalesceTest.groovy
@@ -0,0 +1,103 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE
+
+/**
+ *
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovyCoalesceTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends CoalesceTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
+            g.V().coalesce(out('foo'), out('bar'));
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
+            g.V(v1Id).coalesce(out('knows'), out('created')).values('name');
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
+            g.V(v1Id).coalesce(out('created'), out('knows')).values('name');
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+            g.V.coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name');
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+            g.V.coalesce(outE('knows'), outE('created')).otherV.path.by('name').by(T.label);
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends CoalesceTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
+            ComputerTestHelper.compute("g.V().coalesce(out('foo'), out('bar'))", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('knows'), out('created')).values('name')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).coalesce(out('created'), out('knows')).values('name')", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
+            ComputerTestHelper.compute("g.V().coalesce(out('likes'), out('knows'), out('created')).groupCount().by('name')", g)
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+        }
+
+        @Override
+        Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy
new file mode 100644
index 0000000..c50605c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyCountTest.groovy
@@ -0,0 +1,117 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyCountTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends CountTest {
+        @Override
+        public Traversal<Vertex, Long> get_g_V_count() {
+            g.V.count()
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_out_count() {
+            g.V.out.count
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_both_both_count() {
+            g.V.both.both.count()
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
+            g.V().repeat(__.out).times(3).count()
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
+            g.V.repeat(__.out).times(8).count()
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
+            g.V.has('no').count
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
+            return g.V.fold.count(Scope.local);
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends CountTest {
+        @Override
+        public Traversal<Vertex, Long> get_g_V_count() {
+            ComputerTestHelper.compute("g.V.count()", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_out_count() {
+            ComputerTestHelper.compute("g.V.out.count", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_both_both_count() {
+            ComputerTestHelper.compute("g.V.both.both.count()", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
+            ComputerTestHelper.compute("g.V().repeat(__.out).times(3).count()", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
+            ComputerTestHelper.compute("g.V.repeat(__.out).times(8).count()", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
+            ComputerTestHelper.compute("g.V.has('no').count", g)
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_fold_countXlocalX() {
+        }
+
+        @Override
+        Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy
new file mode 100644
index 0000000..6b8e9c7
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyFoldTest.groovy
@@ -0,0 +1,76 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyFoldTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends FoldTest {
+        @Override
+        public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
+            g.V.fold
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
+            g.V.fold.unfold
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
+            g.V.age.fold(0) { seed, age -> seed + age };
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends FoldTest {
+        @Override
+        public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
+            ComputerTestHelper.compute("g.V.fold", g)
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_fold_unfold() {
+            // Does not work in OLAP cause fold() is not an endstep.
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
+            ComputerTestHelper.compute("g.V.age.fold(0) { seed, age -> seed + age }", g);
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy
new file mode 100644
index 0000000..8bde4a6
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMapTest.groovy
@@ -0,0 +1,129 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public abstract class GroovyMapTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends MapTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
+            g.V(v1Id).map { v -> v.name };
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
+            g.V(v1Id).outE.label.map { l -> l.length() };
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
+            g.V(v1Id).out.map { v -> v.name }.map { n -> n.length() };
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
+            g.V.as('a').out.map { v -> v.path('a').name };
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
+            g.V().as('a').out.out().map { v -> v.path('a').name + v.name };
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends MapTest {
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_VX1X_mapXnameX() {
+            super.g_VX1X_mapXnameX();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_VX1X_outE_label_mapXlengthX() {
+            super.g_VX1X_outE_label_mapXlengthX();
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_VX1X_out_mapXnameX_mapXlengthX() {
+            super.g_VX1X_out_mapXnameX_mapXlengthX();
+        }
+
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).map { v -> v.name }", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).outE.label.map { l -> l.length() }", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).out.map { v -> v.name }.map { n -> n.length() }", g);
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_asXaX_out_mapXa_nameX() {
+            // TODO: Doesn't work for graph computer because sideEffects are not accessible
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
+            // TODO: Doesn't work for graph computer because sideEffects are not accessible
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
new file mode 100644
index 0000000..c7d48b3
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
@@ -0,0 +1,186 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.T
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Compare
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMatchTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends MatchTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
+            g.V().match('a', __.as('a').out().as('b'));
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_matchXa_out_bX_selectXb_idX() {
+            g.V().match('a', __.as('a').out().as('b')).select('b').by(T.id)
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__b_created_cX() {
+            g.V().match('a',
+                    __.as('a').out('knows').as('b'),
+                    __.as('b').out('created').as('c'))
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_knows_b__a_created_cX() {
+            return g.V().match('a',
+                    __.as('a').out('knows').as('b'),
+                    __.as('a').out('created').as('c'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXd_0knows_a__d_hasXname_vadasX__a_knows_b__b_created_cX() {
+            return g.V().match('d',
+                    __.as('d').in('knows').as('a'),
+                    __.as('d').has('name', 'vadas'),
+                    __.as('a').out('knows').as('b'),
+                    __.as('b').out('created').as('c'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__a_repeatXoutX_timesX2XX_selectXab_nameX() {
+            g.V().match('a',
+                    __.as('a').out('created').as('b'),
+                    __.as('a').repeat(__.out).times(2).as('b')).select('a', 'b').by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_c__c_repeatXoutX_timesX2XX_selectXnameX() {
+            g.V().match('a',
+                    __.as('a').out('created').has('name', 'lop').as('b'),
+                    __.as('b').in('created').has('age', 29).as('c'),
+                    __.as('c').repeat(__.out).times(2)).select.by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_out_out_matchXa_0created_b__b_0knows_cX_selectXcX_outXcreatedX_name() {
+            g.V().out().out().match('a',
+                    __.as('a').in('created').as('b'),
+                    __.as('b').in('knows').as('c')).select('c').out('created').name
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_created_b__b_0created_aX() {
+            g.V().match('a',
+                    __.as('a').out('created').as('b'),
+                    __.as('b').in('created').as('a'))
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_matchXa_knows_b__c_knows_bX() {
+            return g.V().match('a', __.as('a').out('knows').as('b'),
+                    __.as('c').out('knows').as('b'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_knows_b__b_created_lop__b_matchXa1_created_b1__b1_0created_c1X_selectXc1X_cX_selectXnameX() {
+            g.V().match('a',
+                    __.as('a').out('knows').as('b'),
+                    __.as('b').out('created').has('name', 'lop'),
+                    __.as('b').match('a1',
+                            __.as('a1').out('created').as('b1'),
+                            __.as('b1').in('created').as('c1')).select('c1').as('c')).select.by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX() {
+            g.V().match('a',
+                    __.as('a').has('name', 'Garcia'),
+                    __.as('a').in('writtenBy').as('b'),
+                    __.as('a').in('sungBy').as('b'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX() {
+            g.V().match('a',
+                    __.as('a').in('sungBy').as('b'),
+                    __.as('a').in('sungBy').as('c'),
+                    __.as('b').out('writtenBy').as('d'),
+                    __.as('c').out('writtenBy').as('e'),
+                    __.as('d').has('name', 'George_Harrison'),
+                    __.as('e').has('name', 'Bob_Marley'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX() {
+            g.V().match('a',
+                    __.as('a').in('sungBy').as('b'),
+                    __.as('a').in('writtenBy').as('c'),
+                    __.as('b').out('writtenBy').as('d'),
+                    __.as('c').out('sungBy').as('d'),
+                    __.as('d').has('name', 'Garcia'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_dX_whereXc_sungBy_dX_whereXd_hasXname_GarciaXX() {
+            return g.V().match('a',
+                    __.as('a').in('sungBy').as('b'),
+                    __.as('a').in('writtenBy').as('c'),
+                    __.as('b').out('writtenBy').as('d'))
+                    .where(__.as('c').out('sungBy').as('d'))
+                    .where(__.as('d').has('name', 'Garcia'));
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_lop_b__b_0created_29_cX_whereXc_repeatXoutX_timesX2XX_selectXnameX() {
+            g.V().match("a",
+                    __.as("a").out("created").has("name", "lop").as("b"),
+                    __.as("b").in("created").has("age", 29).as("c"))
+                    .where(__.as("c").repeat(__.out()).times(2))
+                    .select.by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_0created_cX_whereXa_neq_cX_selectXa_c_nameX() {
+            g.V().match('a',
+                    __.as('a').out('created').as('b'),
+                    __.as('b').in('created').as('c'))
+                    .where('a', Compare.neq, 'c')
+                    .select('a', 'c').by('name')
+        }
+
+        /*@Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__c_created_bX_selectXnameX() {
+            g.V.match('a',
+                    __.as('a').out('created').as('b'),
+                    __.as('c').out('created').as('b')).select { it.value('name') }
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name() {
+            g.V.out.out.match('a',
+                    __.as('b').out('created').as('a'),
+                    __.as('c').out('knows').as('b')).select('c').out('knows').name
+        }*/
+    }
+
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy
new file mode 100644
index 0000000..7cef641
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMaxTest.groovy
@@ -0,0 +1,74 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static __.bothE
+import static __.max
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMaxTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends MaxTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_max() {
+            g.V.age.max
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
+            g.V.repeat(__.both).times(5).age.max
+        }
+
+        @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))
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends MaxTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_max() {
+            ComputerTestHelper.compute("g.V.age.max", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_max() {
+            ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.max", g)
+        }
+
+        @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))", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy
new file mode 100644
index 0000000..5a32f96
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMeanTest.groovy
@@ -0,0 +1,63 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.mean
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMeanTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends MeanTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_age_mean() {
+            g.V.age.mean
+        }
+
+        @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))
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends MeanTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_age_mean() {
+            ComputerTestHelper.compute("g.V.age.mean", g)
+        }
+
+        @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))", g)
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy
new file mode 100644
index 0000000..7746fdf
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMinTest.groovy
@@ -0,0 +1,74 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static __.bothE
+import static __.min
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyMinTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends MinTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_min() {
+            g.V.age.min
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
+            g.V.repeat(__.both).times(5).age.min
+        }
+
+        @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))
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends MinTest {
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_age_min() {
+            ComputerTestHelper.compute("g.V.age.min", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Integer> get_g_V_repeatXbothX_timesX5X_age_min() {
+            ComputerTestHelper.compute("g.V.repeat(__.both).times(5).age.min", g)
+        }
+
+        @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))", g)
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
new file mode 100644
index 0000000..6471725
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyOrderTest.groovy
@@ -0,0 +1,188 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith
+import org.apache.tinkerpop.gremlin.process.*
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Order
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyOrderTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends OrderTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_name_order() {
+            g.V().name.order()
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
+            g.V.name.order.by { a, b -> a[1] <=> b[1] }.by { a, b -> b[2] <=> a[2] }
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
+            g.V.order.by('name', Order.incr).name
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
+            g.V.order.by('name', Order.incr).name
+        }
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
+            g.V.outE.order.by('weight', Order.decr).weight
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+            return g.V.order.by('name', { a, b -> a[1].compareTo(b[1]) }).by('name', { a, b -> b[2].compareTo(a[2]) }).name;
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+            g.V.as('a').out('created').as('b').order.by(Order.shuffle).select();
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
+                final Object v1Id) {
+            g.V(v1Id).map {
+                final Map map = [:];
+                map[1] = it.age;
+                map[2] = it.age * 2;
+                map[3] = it.age * 3;
+                map[4] = it.age;
+                return map;
+            }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+            g.V.order.by(__.outE.count, Order.decr)
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends OrderTest {
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_name_order() {
+            ComputerTestHelper.compute("g.V().name.order()", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_name_order_byXa1_b1X_byXb2_a2X() {
+            ComputerTestHelper.compute("g.V.name.order.by { a, b -> a[1] <=> b[1] }.by{ a, b -> b[2] <=> a[2] }", g)
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_order_byXname_incrX_name() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_outE_order_byXweight_decrX_weight() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_V_asXaX_outXcreatedX_asXbX_order_byXshuffleX_select() {
+            ComputerTestHelper.compute("g.V.as('a').out('created').as('b').order.by(Order.shuffle).select()", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Map<Integer, Integer>> get_g_VX1X_hasXlabel_personX_mapXmapXint_ageXX_orderXlocalX_byXvalueDecrX_byXkeyIncrX(
+                final Object v1Id) {
+            ComputerTestHelper.compute("""
+            g.V(${v1Id}).map {
+                final Map map = [:];
+                map[1] = it.age;
+                map[2] = it.age * 2;
+                map[3] = it.age * 3;
+                map[4] = it.age;
+                return map;
+            }.order(Scope.local).by(Order.valueDecr).by(Order.keyIncr);
+            """, g)
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_order_byXoutE_count__decrX() {
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_V_order_byXname_incrX_name() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_V_order_byXnameX_name() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Double> get_g_V_outE_order_byXweight_decrX_weight() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_V_order_byXname_a1_b1X_byXname_b2_a2X_name() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Vertex> get_g_V_order_byXoutE_count__decrX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Test
+        @LoadGraphWith(org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN)
+        @Override
+        public void g_V_name_order_byXa1_b1X_byXb2_a2X() {
+            super.g_V_name_order_byXa1_b1X_byXb2_a2X();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy
new file mode 100644
index 0000000..62fae7c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPathTest.groovy
@@ -0,0 +1,113 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyPathTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends PathTest {
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
+            g.V(v1Id).identity.name.path
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(final Object v1Id) {
+            g.V(v1Id).out.path.by('age').by('name');
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
+            g.V.repeat(__.out).times(2).path.by.by('name').by('lang');
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
+            g.V.out.out.path.by('name').by('age');
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+            g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path;
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends PathTest {
+
+        @Override
+        public Traversal<Vertex, Path> get_g_VX1X_name_path(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).identity.name.path", g);
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_out_path_byXageX_byXnameX() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_V_repeatXoutX_timesX2X_path_byXitX_byXnameX_byXlangX() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_out_out_path_byXnameX_byXageX() {
+        }
+
+        @Override
+        public Traversal<Vertex, Path> get_g_V_asXaX_hasXname_markoX_asXbX_hasXage_29X_asXcX_path() {
+            ComputerTestHelper.compute("g.V.as('a').has('name', 'marko').as('b').has('age', 29).as('c').path", g);
+        }
+
+        @Override
+        Traversal<Vertex, Path> get_g_VX1X_out_path_byXageX_byXnameX(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_path_by_byXnameX_byXlangX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Path> get_g_V_out_out_path_byXnameX_byXageX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy
new file mode 100644
index 0000000..d9b1d9f
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyPropertiesTest.groovy
@@ -0,0 +1,60 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyPropertiesTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends PropertiesTest {
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
+            g.V.has('age').properties('name', 'age').value;
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
+            g.V.has('age').properties('age', 'name').value;
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends PropertiesTest {
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXname_ageX_value() {
+            ComputerTestHelper.compute("g.V.has('age').properties('name', 'age').value", g);
+        }
+
+        @Override
+        public Traversal<Vertex, Object> get_g_V_hasXageX_propertiesXage_nameX_value() {
+            ComputerTestHelper.compute("g.V.has('age').properties('age', 'name').value", g);
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
new file mode 100644
index 0000000..a7d3894
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
@@ -0,0 +1,206 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Order
+import org.apache.tinkerpop.gremlin.structure.Vertex
+import org.junit.Test
+
+import static __.values
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovySelectTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SelectTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
+            g.V(v1Id).as('a').out('knows').as('b').select()
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(
+                final Object v1Id) {
+            g.V(v1Id).as('a').out('knows').as('b').select.by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
+            g.V(v1Id).as('a').out('knows').as('b').select('a')
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(
+                final Object v1Id) {
+            g.V(v1Id).as('a').out('knows').as('b').select('a').by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
+            g.V.as('a').out.as('b').select.by('name')
+        }
+
+        @Override
+        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
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
+            g.V().as('a').name.order().as('b').select.by('name').by
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+            g.V.has('name', 'gremlin').inE('uses').order.by('skill', Order.incr).as('a').outV.as('b').select.by('skill').by('name')
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
+            return g.V.has(values('name').is('marko')).as('a').select
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
+            return g.V().label().groupCount().as('x').select()
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+            return g.V().hasLabel('person').as('person').local(__.bothE().label().groupCount()).as('relations').select().by('name').by()
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends SelectTest {
+
+        @Override
+        public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_select(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select()", g);
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX() {
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX(final Object v1Id) {
+            ComputerTestHelper.compute("g.V(${v1Id}).as('a').out('knows').as('b').select('a')", g);
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_asXaX_out_asXbX_select_byXnameX() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_V_asXaX_name_order_asXbX_select_byXnameX_byXitX() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+        }
+
+        @Override
+        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_isXmarkoXX_asXaX_select() {
+            ComputerTestHelper.compute("g.V.has(values('name').is('marko')).as('a').select", g)
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        public void g_V_label_groupCount_asXxX_select() {
+        }
+
+        @Override
+        @Test
+        @org.junit.Ignore("Traversal not supported by ComputerTraversalEngine.computer")
+        void g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, String>> get_g_VX1X_asXaX_outXknowsX_asXbX_select_byXnameX(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, String> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXaX_byXnameX(Object v1Id) {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, String>> get_g_V_asXaX_out_asXbX_select_byXnameX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        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
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, String>> get_g_V_asXaX_name_order_asXbX_select_byXnameX_by_XitX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasXname_gremlinX_inEXusesX_order_byXskill_incrX_asXaX_outV_asXbX_select_byXskillX_byXnameX() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_label_groupCount_asXxX_select() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+
+        @Override
+        Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXpersonX_asXpersonX_localXbothE_label_groupCountX_asXrelationsX_select_byXnameX_by() {
+            // override with nothing until the test itself is supported
+            return null
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy
new file mode 100644
index 0000000..9c72f6c
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySumTest.groovy
@@ -0,0 +1,63 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Scope
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.sum
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public abstract class GroovySumTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends SumTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
+            g.V().values('age').sum()
+        }
+
+        @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))
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends SumTest {
+
+        @Override
+        public Traversal<Vertex, Double> get_g_V_valuesXageX_sum() {
+            ComputerTestHelper.compute("g.V.age.sum", g)
+        }
+
+        @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))", g)
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
new file mode 100644
index 0000000..9901805
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyUnfoldTest.groovy
@@ -0,0 +1,63 @@
+/*
+ * 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.map
+
+import org.apache.tinkerpop.gremlin.process.computer.ComputerTestHelper
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine
+import org.apache.tinkerpop.gremlin.process.UseEngine
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__
+import org.apache.tinkerpop.gremlin.structure.Edge
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyUnfoldTest {
+
+    @UseEngine(TraversalEngine.Type.STANDARD)
+    public static class StandardTraversals extends UnfoldTest {
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
+            g.V.local(__.outE.fold).unfold
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
+            g.V.valueMap.unfold.map { it.key }
+        }
+    }
+
+    @UseEngine(TraversalEngine.Type.COMPUTER)
+    public static class ComputerTraversals extends UnfoldTest {
+
+        @Override
+        public Traversal<Vertex, Edge> get_g_V_localXoutE_foldX_unfold() {
+            ComputerTestHelper.compute("g.V.local(__.outE.fold).unfold", g)
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_valueMap_unfold_mapXkeyX() {
+            ComputerTestHelper.compute("g.V.valueMap.unfold.map { it.key }", g)
+        }
+    }
+
+
+}


[12/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index 76904f6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/DedupTest.java
+++ /dev/null
@@ -1,146 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.dedup;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class DedupTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_V_both_dedup_name();
-
-    public abstract Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
-
-    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();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_both_dedup_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_both_dedup_name();
-        printTraversalForm(traversal);
-        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(6, names.size());
-        assertTrue(names.contains("marko"));
-        assertTrue(names.contains("vadas"));
-        assertTrue(names.contains("lop"));
-        assertTrue(names.contains("josh"));
-        assertTrue(names.contains("ripple"));
-        assertTrue(names.contains("peter"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name();
-        printTraversalForm(traversal);
-        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(1, names.size());
-        assertTrue(names.contains("lop") || names.contains("ripple"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_both_name_orderXa_bX_dedup() {
-        final Traversal<Vertex, String> traversal = get_g_V_both_name_orderXa_bX_dedup();
-        printTraversalForm(traversal);
-        final List<String> names = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(6, names.size());
-        assertEquals("josh", names.get(0));
-        assertEquals("lop", names.get(1));
-        assertEquals("marko", names.get(2));
-        assertEquals("peter", names.get(3));
-        assertEquals("ripple", names.get(4));
-        assertEquals("vadas", names.get(5));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX() {
-        final Traversal<Vertex, Map<String, Set<Double>>> traversal =
-                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXdedupXlocalXX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Set<Double>> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(3, map.get("software").size());
-        assertEquals(4, map.get("person").size());
-        assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 1.0)), map.get("software"));
-        assertEquals(new HashSet<>(Arrays.asList(0.2, 0.4, 0.5, 1.0)), map.get("person"));
-    }
-
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends DedupTest {
-        @Override
-        public Traversal<Vertex, String> get_g_V_both_dedup_name() {
-            return g.V().both().dedup().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_both_hasXlabel_softwareX_dedup_byXlangX_name() {
-            return g.V().both().has(T.label, "software").dedup().by("lang").values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_both_name_orderXa_bX_dedup() {
-            return g.V().both().<String>properties("name").order().by((a, b) -> a.value().compareTo(b.value())).dedup().value();
-        }
-
-        @Override
-        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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java
deleted file mode 100644
index 8ff327f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/ExceptTest.java
+++ /dev/null
@@ -1,187 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class ExceptTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_exceptXX();
-
-    public abstract Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_out_exceptXg_v2X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_exceptXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("lop"));
-        }
-        assertEquals(2, counter);
-        assertEquals(2, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_aggregateXxX_out_exceptXxX() {
-        Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_exceptXxX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertEquals("ripple", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name() {
-        Traversal<Vertex, String> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        List<String> names = Arrays.asList(traversal.next(), traversal.next());
-        assertFalse(traversal.hasNext());
-        assertEquals(2, names.size());
-        assertTrue(names.contains("peter"));
-        assertTrue(names.contains("josh"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_exceptXg_V_toListX() {
-        Traversal<Vertex, Vertex> traversal = get_g_V_exceptXg_V_toListX();
-        printTraversalForm(traversal);
-        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(0, vertices.size());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_exceptXX() {
-        Traversal<Vertex, Vertex> traversal = get_g_V_exceptXX();
-        printTraversalForm(traversal);
-        final List<Vertex> vertices = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(6, vertices.size());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path() {
-        Traversal<Vertex, Path> traversal = get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        final List<Path> paths = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(4, paths.size());
-        assertEquals(1, paths.stream().filter(path -> path.size() == 3).count());
-        assertEquals(2, paths.stream().filter(path -> path.size() == 5).count());
-        assertEquals(1, paths.stream().filter(path -> path.size() == 7).count());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("peter", "josh"), traversal);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class StandardTest extends ExceptTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_exceptXg_v2X(final Object v1Id, final Object v2Id) {
-            return g.V(v1Id).out().except(g.V(v2Id).next());
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_exceptXxX(final Object v1Id) {
-            return g.V(v1Id).out().aggregate("x").out().except("x");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_outXcreatedX_inXcreatedX_exceptXg_v1X_name(final Object v1Id) {
-            return g.V(v1Id).out("created").in("created").except(g.V(v1Id).next()).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_exceptXg_V_toListX() {
-            return g.V().except(g.V().toList());
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_exceptXX() {
-            return g.V().except(Collections.emptyList());
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_repeatXbothEXcreatedX_exceptXeX_aggregateXeX_otherVX_emit_path(final Object v1Id) {
-            return g.V(v1Id).repeat(bothE("created").except("e").aggregate("e").otherV()).emit().path();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_exceptXaX_name(final Object v1Id) {
-            return g.V(v1Id).as("a").out("created").in("created").except("a").values("name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java
deleted file mode 100644
index e4610de..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/FilterTest.java
+++ /dev/null
@@ -1,222 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class FilterTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_filterXfalseX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_filterXtrueX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
-
-    public abstract Traversal<Edge, Edge> get_g_E_filterXfalseX();
-
-    public abstract Traversal<Edge, Edge> get_g_E_filterXtrueX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_filterXfalseX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXfalseX();
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_filterXtrueX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXtrueX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        final Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            vertices.add(traversal.next());
-        }
-        assertEquals(6, counter);
-        assertEquals(6, vertices.size());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_filterXlang_eq_javaX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXlang_eq_javaX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("ripple") ||
-                    vertex.value("name").equals("lop"));
-        }
-        assertEquals(2, counter);
-        assertEquals(2, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_filterXage_gt_30X() {
-        Traversal<Vertex, Vertex> traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-        traversal = get_g_VX1X_filterXage_gt_30X(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_out_filterXage_gt_30X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_filterXage_gt_30X(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertEquals(Integer.valueOf(32), traversal.next().<Integer>value("age"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            vertices.add(vertex);
-            assertTrue(vertex.value("name").equals("marko") ||
-                    vertex.value("name").equals("peter"));
-        }
-        assertEquals(counter, 2);
-        assertEquals(vertices.size(), 2);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_E_filterXfalseX() {
-        final Traversal<Edge, Edge> traversal = get_g_E_filterXfalseX();
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_E_filterXtrueX() {
-        final Traversal<Edge, Edge> traversal = get_g_E_filterXtrueX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        final Set<Edge> edges = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            edges.add(traversal.next());
-        }
-        assertEquals(6, counter);
-        assertEquals(6, edges.size());
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends FilterTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXfalseX() {
-            return g.V().filter(v -> false);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXtrueX() {
-            return g.V().filter(v -> true);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXlang_eq_javaX() {
-            return g.V().filter(v -> v.get().<String>property("lang").orElse("none").equals("java"));
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_filterXage_gt_30X(final Object v1Id) {
-            return g.V(v1Id).filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_filterXage_gt_30X(final Object v1Id) {
-            return g.V(v1Id).out().filter(v -> v.get().<Integer>property("age").orElse(0) > 30);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_filterXname_startsWith_m_OR_name_startsWith_pX() {
-            return g.V().filter(v -> {
-                final String name = v.get().value("name");
-                return name.startsWith("m") || name.startsWith("p");
-            });
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_filterXfalseX() {
-            return g.E().filter(e -> false);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_filterXtrueX() {
-            return g.E().filter(e -> true);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java
deleted file mode 100644
index 65eb52f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasNotTest.java
+++ /dev/null
@@ -1,98 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.graph.traversal.__;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class HasNotTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey);
-
-    public abstract Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_hasNotXprop() {
-        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "circumference");
-        printTraversalForm(traversal);
-        assertEquals("marko", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-        traversal = get_g_VX1X_hasNotXprop(convertToVertexId("marko"), "name");
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasNotXprop() {
-        Traversal<Vertex, Vertex> traversal = get_g_V_hasNotXprop("circumference");
-        printTraversalForm(traversal);
-        final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(6, list.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasNotXoutXcreatedXX() {
-        Traversal<Vertex, String> traversal = get_g_V_hasNotXoutXcreatedXX();
-        checkResults(Arrays.asList("vadas", "lop", "ripple"), traversal);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends HasNotTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasNotXprop(final Object v1Id, final String propertyKey) {
-            return g.V(v1Id).hasNot(propertyKey);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasNotXprop(final String propertyKey) {
-            return g.V().hasNot(propertyKey);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasNotXoutXcreatedXX() {
-            return g.V().hasNot(__.out("created")).values("name");
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java
deleted file mode 100644
index f7165da..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/HasTest.java
+++ /dev/null
@@ -1,325 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-import static org.junit.Assume.assumeTrue;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class HasTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name();
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_markoX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_blahX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_hasXblahX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X();
-
-    public abstract Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id);
-
-    public abstract Traversal<Edge, Edge> get_g_E_hasLabelXknowsX();
-
-    public abstract Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX();
-
-    public abstract Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age();
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_outXknowsX_hasXoutXcreatedXX_valuesXnameX() {
-        Traversal<Vertex, String> traversal = get_g_V_outXknowsX_hasXoutXcreatedXX_name();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("josh"), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_hasXkeyX() {
-        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "name");
-        printTraversalForm(traversal);
-        assertEquals("marko", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-        //
-        traversal = get_g_VX1X_hasXkeyX(convertToVertexId("marko"), "circumference");
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_hasXname_markoX() {
-        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertEquals("marko", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-        traversal = get_g_VX1X_hasXname_markoX(convertToVertexId("vadas"));
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXname_markoX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_markoX();
-        printTraversalForm(traversal);
-        assertEquals("marko", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXname_blahX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXname_blahX();
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXage_gt_30X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXage_gt_30X();
-        printTraversalForm(traversal);
-        final List<Element> list = StreamFactory.stream(traversal).collect(Collectors.toList());
-        assertEquals(2, list.size());
-        for (final Element v : list) {
-            assertTrue(v.<Integer>value("age") > 30);
-        }
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_hasXage_gt_30X() {
-        Traversal<Vertex, Vertex> traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-        traversal = get_g_VX1X_hasXage_gt_30X(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_hasXid_2X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_hasIdX2X(convertToVertexId("marko"), convertToVertexId("vadas"));
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        assertEquals(convertToVertexId("vadas"), traversal.next().id());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXblahX() {
-        assumeTrue(graphMeetsTestRequirements());
-        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXblahX();
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-    }
-
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_EX7X_hasXlabelXknowsX() {
-        //System.out.println(convertToEdgeId("marko", "knows", "vadas"));
-        Traversal<Edge, Edge> traversal = get_g_EX7X_hasLabelXknowsX(convertToEdgeId("marko", "knows", "vadas"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertEquals("knows", traversal.next().label());
-        }
-        assertEquals(1, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_E_hasXlabelXknowsX() {
-        final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXknowsX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertEquals("knows", traversal.next().label());
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(CREW)
-    public void g_E_hasXlabelXuses_traversesX() {
-        final Traversal<Edge, Edge> traversal = get_g_E_hasLabelXuses_traversesX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String label = traversal.next().label();
-            assertTrue(label.equals("uses") || label.equals("traverses"));
-        }
-        assertEquals(9, counter);
-    }
-
-    @Test
-    @LoadGraphWith(CREW)
-    public void g_V_hasXlabelXperson_software_blahX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_hasLabelXperson_software_blahX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String label = traversal.next().label();
-            assertTrue(label.equals("software") || label.equals("person"));
-        }
-        assertEquals(6, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXperson_name_markoX_age() {
-        final Traversal<Vertex, Integer> traversal = get_g_V_hasXperson_name_markoX_age();
-        printTraversalForm(traversal);
-        assertEquals(29, traversal.next().intValue());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outE_hasXweight_inside_0_06X_inV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outE_hasXweight_inside_0_06X_inV(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        while (traversal.hasNext()) {
-            Vertex vertex = traversal.next();
-            assertTrue(vertex.value("name").equals("vadas") || vertex.value("name").equals("lop"));
-        }
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends HasTest {
-        @Override
-        public Traversal<Vertex, String> get_g_V_outXknowsX_hasXoutXcreatedXX_name() {
-            return g.V().out("knows").has(out("created")).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXkeyX(final Object v1Id, final String key) {
-            return g.V(v1Id).has(key);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXname_markoX(final Object v1Id) {
-            return g.V(v1Id).has("name", "marko");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXname_markoX() {
-            return g.V().has("name", "marko");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXname_blahX() {
-            return g.V().has("name", "blah");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXblahX() {
-            return g.V().has("blah");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_hasXage_gt_30X(final Object v1Id) {
-            return g.V(v1Id).has("age", Compare.gt, 30);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_hasIdX2X(final Object v1Id, final Object v2Id) {
-            return g.V(v1Id).out().hasId(v2Id);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasXage_gt_30X() {
-            return g.V().has("age", Compare.gt, 30);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
-            return g.E(e7Id).hasLabel("knows");
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_hasLabelXknowsX() {
-            return g.E().hasLabel("knows");
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_hasLabelXuses_traversesX() {
-            return g.E().hasLabel("uses", "traverses");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_hasLabelXperson_software_blahX() {
-            return g.V().hasLabel("person", "software", "blah");
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_hasXperson_name_markoX_age() {
-            return g.V().has("person", "name", "marko").values("age");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outE_hasXweight_inside_0_06X_inV(final Object v1Id) {
-            return g.V(v1Id).outE().has("weight", Compare.inside, Arrays.asList(0.0d, 0.6d)).inV();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java
deleted file mode 100644
index 065f1f7..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/IsTest.java
+++ /dev/null
@@ -1,125 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class IsTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X();
-
-    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X();
-
-    public abstract Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
-
-    public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
-
-    public abstract Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_valuesXageX_isX32X() {
-        Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isX32X();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        assertEquals(Integer.valueOf(32), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_valuesXageX_isXlte_30X() {
-        Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXlte_30X();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList(27, 29), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_valuesXageX_isXgte_29X_isXlt_34X() {
-        Traversal<Vertex, Integer> traversal = get_g_V_valuesXageX_isXgte_29X_isXlt_34X();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList(29, 32), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
-        Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        assertEquals("ripple", traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
-        Traversal<Vertex, String> traversal = get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        assertEquals("lop", traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends IsTest {
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isX32X() {
-            return g.V().<Integer>values("age").is(32);
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXlte_30X() {
-            return g.V().<Integer>values("age").is(Compare.lte, 30);
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_valuesXageX_isXgte_29X_isXlt_34X() {
-            return g.V().<Integer>values("age").is(Compare.gte, 29).is(Compare.lt, 34);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX() {
-            return g.V().has(in("created").count().is(1l)).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_hasXinXcreatedX_count_isXgte_2XX_valuesXnameX() {
-            return g.V().has(in("created").count().is(Compare.gte, 2l)).values("name");
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java
deleted file mode 100644
index 0038ddd..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/OrTest.java
+++ /dev/null
@@ -1,77 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.has;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class OrTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
-
-    public abstract Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("marko", "josh", "peter"), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("marko", "ripple", "lop", "peter"), traversal);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends OrTest {
-        @Override
-        public Traversal<Vertex, String> get_g_V_orXhasXage_gt_27X__outE_count_gte_2X_name() {
-            return g.V().or(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name() {
-            return g.V().or(outE("knows"), has(T.label, "software").or().has("age", Compare.gte, 35)).values("name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java
deleted file mode 100644
index 9726b62..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RangeTest.java
+++ /dev/null
@@ -1,265 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-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.structure.Vertex;
-import org.junit.Ignore;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class RangeTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X();
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_out_limitX2X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_limitX2X(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            traversal.next();
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_localXoutE_limitX1X_inVX_limitX3X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_localXoutE_limitX1X_inVX_limitX3X();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            traversal.next();
-        }
-        assertEquals(3, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String name = traversal.next().value("name");
-            assertTrue(name.equals("lop") || name.equals("ripple"));
-        }
-        assertEquals(1, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String name = traversal.next().value("name");
-            assertTrue(name.equals("lop") || name.equals("ripple"));
-        }
-        assertEquals(1, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String name = traversal.next().value("name");
-            assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String name = traversal.next().value("name");
-            assertTrue(name.equals("marko") || name.equals("josh") || name.equals("peter"));
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_repeatXbothX_timesX3X_rangeX5_11X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_rangeX5_11X();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            traversal.next();
-            counter++;
-        }
-        assertEquals(6, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    @Ignore("This should not work cause fold kills the path history")
-    public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            final Map<String, Object> map = traversal.next();
-            final List<Double> weights = (List<Double>) map.get("w");
-            if (map.get("s").equals("lop")) {
-                assertEquals(1, weights.size());
-                assertTrue(Arrays.asList(0.4, 0.2).contains(weights.get(0)));
-            } else if (map.get("s").equals("ripple")) {
-                assertEquals(1, weights.size());
-                assertEquals(1.0, weights.get(0), 0.0);
-            } else {
-                assertTrue(false);
-            }
-            counter++;
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    @Ignore("This should not work cause fold kills the path history")
-    public void g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            final Map<String, Object> map = traversal.next();
-            final List<Double> weights = (List<Double>) map.get("w");
-            if (map.get("s").equals("lop")) {
-                assertEquals(2, weights.size());
-                assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(0)));
-                assertTrue(Arrays.asList(0.2, 0.4).contains(weights.get(1)));
-                assertNotEquals(weights.get(0), weights.get(1));
-            } else if (map.get("s").equals("ripple")) {
-                assertEquals(0, weights.size());
-            } else {
-                assertTrue(false);
-            }
-            counter++;
-        }
-        assertEquals(2, counter);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends RangeTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_limitX2X(final Object v1Id) {
-            return g.V(v1Id).out().limit(2);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_localXoutE_limitX1X_inVX_limitX3X() {
-            return g.V().local(outE().limit(1)).inV().limit(3);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outEXcreatedX_rangeX0_1X_inV(final Object v1Id) {
-            return g.V(v1Id).out("knows").outE("created").range(0, 1).inV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXknowsX_outXcreatedX_rangeX0_1X(final Object v1Id) {
-            return g.V(v1Id).out("knows").out("created").range(0, 1);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_rangeX1_3X(final Object v1Id) {
-            return g.V(v1Id).out("created").in("created").range(1, 3);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inEXcreatedX_rangeX1_3X_outV(final Object v1Id) {
-            return g.V(v1Id).out("created").inE("created").range(1, 3).outV();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_rangeX5_11X() {
-            return g.V().repeat(both()).times(3).range(5, 11);
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_limitXlocal_1XX_asXwX_select_byXnameX_by() {
-            return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().limit(Scope.local, 1)).as("w").select().by("name").by();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasLabelXsoftwareX_asXsX_localXinEXcreatedX_valuesXweightX_fold_rangeXlocal_1_3XX_asXwX_select_byXnameX_by() {
-            return g.V().hasLabel("software").as("s").local(inE("created").values("weight").fold().range(Scope.local, 1, 3)).as("w").select().by("name").by();
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java
deleted file mode 100644
index edbb91e..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/RetainTest.java
+++ /dev/null
@@ -1,94 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class RetainTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_out_retainXg_v2X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_retainXg_v2X(convertToVertexId("marko"), convertToVertexId("vadas"));
-        printTraversalForm(traversal);
-        assertEquals("vadas", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_out_aggregateXxX_out_retainXxX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_out_aggregateXxX_out_retainXxX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertEquals("lop", traversal.next().<String>value("name"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertEquals("marko", traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends RetainTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_retainXg_v2X(final Object v1Id, final Object v2Id) {
-            return g.V(v1Id).out().retain(g.V(v2Id).next());
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_out_aggregateXxX_out_retainXxX(final Object v1Id) {
-            return g.V(v1Id).out().aggregate("x").out().retain("x");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_asXaX_outXcreatedX_inXcreatedX_retainXaX_name(final Object v1Id) {
-            return g.V(v1Id).as("a").out("created").in("created").retain("a").values("name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/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
deleted file mode 100644
index df65486..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SampleTest.java
+++ /dev/null
@@ -1,148 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Collection;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SampleTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Edge, Edge> get_g_E_sampleX1X();
-
-    public abstract Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX();
-
-    public abstract Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX();
-
-    public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
-
-    public abstract Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_E_sampleX1X() {
-        final Traversal<Edge, Edge> traversal = get_g_E_sampleX1X();
-        assertTrue(traversal.hasNext());
-        traversal.next();
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_E_sampleX2X_byXweightX() {
-        final Traversal<Edge, Edge> traversal = get_g_E_sampleX2X_byXweightX();
-        assertTrue(traversal.hasNext());
-        traversal.next();
-        assertTrue(traversal.hasNext());
-        traversal.next();
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_localXoutE_sampleX1X_byXweightXX() {
-        final Traversal<Vertex, Edge> traversal = get_g_V_localXoutE_sampleX1X_byXweightXX();
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            traversal.next();
-        }
-        assertEquals(3, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
-        final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
-                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Collection<Double>> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(2, map.get("software").size());
-        assertEquals(2, map.get("person").size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX() {
-        final Traversal<Vertex, Map<String, Collection<Double>>> traversal =
-                get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_5XX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Map<String, Collection<Double>> map = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(2, map.size());
-        assertEquals(4, map.get("software").size());
-        assertEquals(5, map.get("person").size());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends SampleTest {
-        @Override
-        public Traversal<Edge, Edge> get_g_E_sampleX1X() {
-            return g.E().sample(1);
-        }
-
-        @Override
-        public Traversal<Edge, Edge> get_g_E_sampleX2X_byXweightX() {
-            return g.E().sample(2).by("weight");
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_localXoutE_sampleX1X_byXweightXX() {
-            return g.V().local(outE().sample(1).by("weight"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Collection<Double>>> get_g_V_group_byXlabelX_byXbothE_valuesXweightX_foldX_byXsampleXlocal_2XX() {
-            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().<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/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java
deleted file mode 100644
index 38a629d..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/SimplePathTest.java
+++ /dev/null
@@ -1,86 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class SimplePathTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id);
-
-    public abstract Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outXcreatedX_inXcreatedX_simplePath() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            assertTrue(vertex.value("name").equals("josh") || vertex.value("name").equals("peter"));
-        }
-        assertEquals(2, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXboth_simplePathX_timesX3X_path() {
-        final Traversal<Vertex, Path> traversal = get_g_V_repeatXboth_simplePathX_timesX3X_path();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertTrue(traversal.next().isSimple());
-        }
-        assertEquals(18, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends SimplePathTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_simplePath(final Object v1Id) {
-            return g.V(v1Id).out("created").in("created").simplePath();
-        }
-
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXboth_simplePathX_timesX3X_path() {
-            return g.V().repeat(both().simplePath()).times(3).path();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java
deleted file mode 100644
index 89ab5d1..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/WhereTest.java
+++ /dev/null
@@ -1,162 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class WhereTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Map<String, Object> map = traversal.next();
-            assertEquals(2, map.size());
-            assertTrue(map.containsKey("a"));
-            assertTrue(map.containsKey("b"));
-            assertEquals(map.get("a"), map.get("b"));
-        }
-        assertEquals(6, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_b_neqX() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Map<String, Object> map = traversal.next();
-            assertEquals(2, map.size());
-            assertTrue(map.containsKey("a"));
-            assertTrue(map.containsKey("b"));
-            assertNotEquals(map.get("a"), map.get("b"));
-            assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("marko")) ||
-                    ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")) ||
-                    ((Vertex) map.get("a")).id().equals(convertToVertexId("josh")));
-            assertTrue(((Vertex) map.get("b")).id().equals(convertToVertexId("marko")) ||
-                    ((Vertex) map.get("b")).id().equals(convertToVertexId("peter")) ||
-                    ((Vertex) map.get("b")).id().equals(convertToVertexId("josh")));
-        }
-        assertEquals(6, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        int markoCounter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Map<String, Object> map = traversal.next();
-            assertEquals(2, map.size());
-            assertTrue(map.containsKey("a"));
-            assertTrue(map.containsKey("b"));
-            assertEquals(convertToVertexId("marko"), ((Vertex) map.get("b")).id());
-            if (((Vertex) map.get("a")).id().equals(convertToVertexId("marko")))
-                markoCounter++;
-            else
-                assertTrue(((Vertex) map.get("a")).id().equals(convertToVertexId("josh")) || ((Vertex) map.get("a")).id().equals(convertToVertexId("peter")));
-        }
-        assertEquals(3, markoCounter);
-        assertEquals(5, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Map<String, Object> map = traversal.next();
-            assertEquals(2, map.size());
-            assertTrue(map.containsKey("a"));
-            assertTrue(map.containsKey("b"));
-            assertEquals(convertToVertexId("marko"), ((Vertex) map.get("a")).id());
-            assertEquals(convertToVertexId("josh"), ((Vertex) map.get("b")).id());
-        }
-        assertEquals(1, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends WhereTest {
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_eq_bX() {
-            return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.eq, "b");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_neq_bX() {
-            return g.V().has("age").as("a").out().in().has("age").as("b").select().where("a", Compare.neq, "b");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXb_hasXname_markoXX() {
-            return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("b").has("name", "marko"));
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_select_whereXa_outXknowsX_bX() {
-            return g.V().has("age").as("a").out().in().has("age").as("b").select().where(as("a").out("knows").as("b"));
-        }
-    }
-}
\ No newline at end of file


[11/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java
deleted file mode 100644
index 878575c..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddEdgeTest.java
+++ /dev/null
@@ -1,130 +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.map;
-
-import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-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.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class AddEdgeTest extends AbstractGremlinTest {
-
-    public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
-    public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int count = 0;
-        while (traversal.hasNext()) {
-            final Edge edge = traversal.next();
-            assertEquals("createdBy", edge.label());
-            assertEquals(0, IteratorUtils.count(edge.properties()));
-            count++;
-
-        }
-        assertEquals(1, count);
-        assertEquals(7, IteratorUtils.count(graph.edges()));
-        assertEquals(6, IteratorUtils.count(graph.vertices()));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
-    public void g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int count = 0;
-        while (traversal.hasNext()) {
-            final Edge edge = traversal.next();
-            assertEquals("createdBy", edge.label());
-            assertEquals(2, edge.<Integer>value("weight").intValue());
-            assertEquals(1, IteratorUtils.count(edge.properties()));
-            count++;
-
-
-        }
-        assertEquals(1, count);
-        assertEquals(7, IteratorUtils.count(graph.edges()));
-        assertEquals(6, IteratorUtils.count(graph.vertices()));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
-    public void g_V_addOutEXexistsWith__g_V__time_nowX() {
-        final Traversal<Vertex, Edge> traversal = get_g_V_addOutEXexistsWith__g_V__time_nowX();
-        printTraversalForm(traversal);
-        int count = 0;
-        while (traversal.hasNext()) {
-            final Edge edge = traversal.next();
-            assertEquals("existsWith", edge.label());
-            assertEquals("now", edge.value("time"));
-            assertEquals(1, IteratorUtils.count(edge.properties()));
-            count++;
-        }
-        assertEquals(36, count);
-        assertEquals(42, IteratorUtils.count(graph.edges()));
-        for (final Vertex vertex : IteratorUtils.list(graph.vertices())) {
-            assertEquals(6, IteratorUtils.count(vertex.edges(Direction.OUT, "existsWith")));
-            assertEquals(6, IteratorUtils.count(vertex.edges(Direction.IN, "existsWith")));
-        }
-        assertEquals(6, IteratorUtils.count(graph.vertices()));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class Traversals extends AddEdgeTest {
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_aX(final Object v1Id) {
-            return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a");
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_asXaX_outXcreatedX_addOutEXcreatedBy_a_weight_2X(final Object v1Id) {
-            return g.V(v1Id).as("a").out("created").addOutE("createdBy", "a", "weight", 2);
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_V_addOutEXexistsWith__g_V__time_nowX() {
-            return g.V().addOutE("existsWith", g.V(), "time", "now");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
deleted file mode 100644
index 020b98b..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/AddVertexTest.java
+++ /dev/null
@@ -1,91 +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.map;
-
-import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-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.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AddVertexTest extends AbstractGremlinTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X();
-
-    public abstract Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    public void g_V_addVXlabel_animal_age_0X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_addVXlabel_animal_age_0X();
-        printTraversalForm(traversal);
-        int count = 0;
-        while (traversal.hasNext()) {
-            final Vertex vertex = traversal.next();
-            assertEquals("animal", vertex.label());
-            assertEquals(0, vertex.<Integer>value("age").intValue());
-            count++;
-        }
-        assertEquals(12, IteratorUtils.count(graph.vertices()));
-        assertEquals(6, count);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
-    public void g_addVXlabel_person_name_stephenX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_addVXlabel_person_name_stephenX();
-        printTraversalForm(traversal);
-        final Vertex stephen = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals("person", stephen.label());
-        assertEquals("stephen", stephen.value("name"));
-        assertEquals(1, IteratorUtils.count(stephen.properties()));
-        assertEquals(7, IteratorUtils.count(graph.vertices()));
-    }
-
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    public static class Traversals extends AddVertexTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
-            return g.V().addV(T.label, "animal", "age", 0);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_addVXlabel_person_name_stephenX() {
-            return g.addV(T.label, "person", "name", "stephen");
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java
deleted file mode 100644
index d37f766..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/BackTest.java
+++ /dev/null
@@ -1,221 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class BackTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_asXhereX_out_backXhereX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_asXhereX_out_backXhereX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertEquals("marko", traversal.next().<String>value("name"));
-        }
-        assertEquals(3, counter);
-    }
-
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final Vertex vertex = traversal.next();
-            assertEquals("java", vertex.<String>value("lang"));
-            assertTrue(vertex.value("name").equals("ripple") || vertex.value("name").equals("lop"));
-        }
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        final Edge edge = traversal.next();
-        assertEquals("knows", edge.label());
-        assertEquals(convertToVertexId("vadas"), edge.inVertex().id());
-        assertEquals(convertToVertexId("marko"), edge.outVertex().id());
-        assertEquals(0.5d, edge.<Double>value("weight"), 0.0001d);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        final Set<String> names = new HashSet<>();
-        while (traversal.hasNext()) {
-            counter++;
-            names.add(traversal.next());
-        }
-        assertEquals(2, counter);
-        assertEquals(2, names.size());
-        assertTrue(names.contains("ripple"));
-        assertTrue(names.contains("lop"));
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX() {
-        final List<Traversal<Vertex, Edge>> traversals = Arrays.asList(
-                get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
-                get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")),
-                get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(convertToVertexId("marko")));
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            assertTrue(traversal.hasNext());
-            assertTrue(traversal.hasNext());
-            final Edge edge = traversal.next();
-            assertEquals("knows", edge.label());
-            assertEquals(1.0d, edge.<Double>value("weight"), 0.00001d);
-            assertFalse(traversal.hasNext());
-            assertFalse(traversal.hasNext());
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_asXhereXout_name_backXhereX() {
-        Traversal<Vertex, Vertex> traversal = get_g_V_asXhereXout_name_backXhereX();
-        printTraversalForm(traversal);
-        super.checkResults(new HashMap<Vertex, Long>() {{
-            put(convertToVertex(graph, "marko"), 3l);
-            put(convertToVertex(graph, "josh"), 2l);
-            put(convertToVertex(graph, "peter"), 1l);
-        }}, traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
-        List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            assertTrue(traversal.hasNext());
-            final Map<String, Long> map = traversal.next();
-            assertFalse(traversal.hasNext());
-            assertEquals(2, map.size());
-            assertEquals(1l, map.get("ripple").longValue());
-            assertEquals(6l, map.get("lop").longValue());
-        });
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends BackTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_asXhereX_out_backXhereX(final Object v1Id) {
-            return g.V(v1Id).as("here").out().back("here");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX(final Object v4Id) {
-            return g.V(v4Id).out().as("here").has("lang", "java").back("here");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_out_asXhereX_hasXlang_javaX_backXhereX_name(final Object v4Id) {
-            return g.V(v4Id).out().as("here").has("lang", "java").back("here").values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outE_asXhereX_inV_hasXname_vadasX_backXhereX(final Object v1Id) {
-            return g.V(v1Id).outE().as("here").inV().has("name", "vadas").back("here");
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_hasXweight_1X_asXhereX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
-            return g.V(v1Id).outE("knows").has("weight", 1.0d).as("here").inV().has("name", "josh").back("here");
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_inV_hasXname_joshX_backXhereX(final Object v1Id) {
-            return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).inV().has("name", "josh").<Edge>back("here");
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX1X_outEXknowsX_asXhereX_hasXweight_1X_asXfakeX_inV_hasXname_joshX_backXhereX(final Object v1Id) {
-            return g.V(v1Id).outE("knows").as("here").has("weight", 1.0d).as("fake").inV().has("name", "josh").<Edge>back("here");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_asXhereXout_name_backXhereX() {
-            return g.V().as("here").out().values("name").back("here");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_outXcreatedX_unionXasXprojectX_inXcreatedX_hasXname_markoX_backXprojectX__asXprojectX_inXcreatedX_inXknowsX_hasXname_markoX_backXprojectXX_groupCount_byXnameX() {
-            return (Traversal) g.V().out("created")
-                    .union(as("project").in("created").has("name", "marko").back("project"),
-                            as("project").in("created").in("knows").has("name", "marko").back("project")).groupCount().by("name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java
deleted file mode 100644
index eaccc1b..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CoalesceTest.java
+++ /dev/null
@@ -1,158 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
-import static org.junit.Assert.*;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public abstract class CoalesceTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX();
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
-
-    public abstract Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_coalesceXoutXfooX_outXbarXX() {
-        Traversal<Vertex, Vertex> traversal = get_g_V_coalesceXoutXfooX_outXbarXX();
-        printTraversalForm(traversal);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX() {
-        Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("josh", "vadas"), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX() {
-        Traversal<Vertex, String> traversal = get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        assertEquals("lop", traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
-        Traversal<Vertex, Map<String, Long>> traversal = get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX();
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        Map<String, Long> result = traversal.next();
-        assertEquals(4, result.size());
-        assertTrue(result.containsKey("josh") && result.containsKey("lop") && result.containsKey("ripple") && result.containsKey("vadas"));
-        assertEquals(1L, (long) result.get("josh"));
-        assertEquals(2L, (long) result.get("lop"));
-        assertEquals(1L, (long) result.get("ripple"));
-        assertEquals(1L, (long) result.get("vadas"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    @LoadGraphWith(MODERN)
-    public void g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
-        Traversal<Vertex, Path> traversal = get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX();
-        printTraversalForm(traversal);
-        Map<String, Integer> first = new HashMap<>();
-        Map<String, Integer> last = new HashMap<>();
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Path path = traversal.next();
-            first.compute(path.<String>get(0), (k, v) -> v != null ? v + 1 : 1);
-            last.compute(path.<String>get(2), (k, v) -> v != null ? v + 1 : 1);
-            assertEquals(3, path.size());
-            assertTrue((path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("vadas"))
-                    || (path.<String>get(0).equals("marko") && path.<String>get(1).equals("knows") && path.<String>get(2).equals("josh"))
-                    || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop"))
-                    || (path.<String>get(0).equals("josh") && path.<String>get(1).equals("created") && path.<String>get(2).equals("ripple"))
-                    || (path.<String>get(0).equals("peter") && path.<String>get(1).equals("created") && path.<String>get(2).equals("lop")));
-        }
-        assertEquals(5, counter);
-        assertEquals(2, (int) first.get("marko"));
-        assertEquals(2, (int) first.get("josh"));
-        assertEquals(1, (int) first.get("peter"));
-        assertEquals(1, (int) last.get("josh"));
-        assertEquals(1, (int) last.get("vadas"));
-        assertEquals(2, (int) last.get("lop"));
-        assertEquals(1, (int) last.get("ripple"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends CoalesceTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coalesceXoutXfooX_outXbarXX() {
-            return g.V().coalesce(out("foo"), out("bar"));
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXknowsX_outXcreatedXX_valuesXnameX(final Object v1Id) {
-            return g.V(v1Id).coalesce(out("knows"), out("created")).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_coalesceXoutXcreatedX_outXknowsXX_valuesXnameX(final Object v1Id) {
-            return g.V(v1Id).coalesce(out("created"), out("knows")).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_coalesceXoutXlikesX_outXknowsX_inXcreatedXX_groupCount_byXnameX() {
-            return g.V().coalesce(out("likes"), out("knows"), out("created")).<String>groupCount().by("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_coalesceXoutEXknowsX_outEXcreatedXX_otherV_path_byXnameX_byXlabelX() {
-            return g.V().coalesce(outE("knows"), outE("created")).otherV().path().by("name").by(T.label);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java
deleted file mode 100644
index d9257cb..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/CountTest.java
+++ /dev/null
@@ -1,168 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.Scope;
-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.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CountTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Long> get_g_V_count();
-
-    public abstract Traversal<Vertex, Long> get_g_V_out_count();
-
-    public abstract Traversal<Vertex, Long> get_g_V_both_both_count();
-
-    public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count();
-
-    public abstract Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count();
-
-    public abstract Traversal<Vertex, Long> get_g_V_hasXnoX_count();
-
-    public abstract Traversal<Vertex, Long> get_g_V_fold_countXlocalX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_count() {
-        final Traversal<Vertex, Long> traversal = get_g_V_count();
-        printTraversalForm(traversal);
-        assertEquals(new Long(6), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_count() {
-        final Traversal<Vertex, Long> traversal = get_g_V_out_count();
-        printTraversalForm(traversal);
-        assertEquals(new Long(6), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_both_both_count() {
-        final Traversal<Vertex, Long> traversal = get_g_V_both_both_count();
-        printTraversalForm(traversal);
-        assertEquals(new Long(1406914), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_repeatXoutX_timesX3X_count() {
-        final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX3X_count();
-        printTraversalForm(traversal);
-        assertEquals(new Long(14465066L), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_repeatXoutX_timesX8X_count() {
-        final Traversal<Vertex, Long> traversal = get_g_V_repeatXoutX_timesX8X_count();
-        printTraversalForm(traversal);
-        assertEquals(new Long(2505037961767380L), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXnoX_count() {
-        final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
-        printTraversalForm(traversal);
-        assertEquals(new Long(0), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_filterXfalseX_count() {
-        final Traversal<Vertex, Long> traversal = get_g_V_hasXnoX_count();
-        printTraversalForm(traversal);
-        assertEquals(new Long(0), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_fold_countXlocalX() {
-        final Traversal<Vertex, Long> traversal = get_g_V_fold_countXlocalX();
-        printTraversalForm(traversal);
-        assertEquals(new Long(6), traversal.next());
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends CountTest {
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_count() {
-            return g.V().count();
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_out_count() {
-            return g.V().out().count();
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_both_both_count() {
-            return g.V().both().both().count();
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX3X_count() {
-            return g.V().repeat(out()).times(3).count();
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_repeatXoutX_timesX8X_count() {
-            return g.V().repeat(out()).times(8).count();
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_hasXnoX_count() {
-            return g.V().has("no").count();
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_fold_countXlocalX() {
-            return g.V().fold().count(Scope.local);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java
deleted file mode 100644
index 105bf12..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/FoldTest.java
+++ /dev/null
@@ -1,109 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Operator;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.BinaryOperator;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class FoldTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, List<Vertex>> get_g_V_fold();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_fold_unfold();
-
-    public abstract Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_fold() {
-        final Traversal<Vertex, List<Vertex>> traversal = get_g_V_fold();
-        printTraversalForm(traversal);
-        List<Vertex> list = traversal.next();
-        assertFalse(traversal.hasNext());
-        Set<Vertex> vertices = new HashSet<>(list);
-        assertEquals(6, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_fold_unfold() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_fold_unfold();
-        printTraversalForm(traversal);
-        int count = 0;
-        Set<Vertex> vertices = new HashSet<>();
-        while (traversal.hasNext()) {
-            vertices.add(traversal.next());
-            count++;
-        }
-        assertFalse(traversal.hasNext());
-        assertEquals(6, count);
-        assertEquals(6, vertices.size());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_age_foldX0_plusX() {
-        final Traversal<Vertex, Integer> traversal = get_g_V_age_foldX0_plusX();
-        printTraversalForm(traversal);
-        final Integer ageSum = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(Integer.valueOf(123), ageSum);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends FoldTest {
-
-        @Override
-        public Traversal<Vertex, List<Vertex>> get_g_V_fold() {
-            return g.V().fold();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_fold_unfold() {
-            return g.V().fold().unfold();
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_V_age_foldX0_plusX() {
-            return g.V().<Integer>values("age").fold(0, (BinaryOperator) Operator.sum);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java
deleted file mode 100644
index 58977b0..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/map/MapTest.java
+++ /dev/null
@@ -1,153 +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.map;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.List;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.*;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public abstract class MapTest extends AbstractGremlinProcessTest {
-    public abstract Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id);
-
-    public abstract Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX();
-
-    public abstract Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_mapXnameX() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_mapXnameX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        assertEquals(traversal.next(), "marko");
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_outE_label_mapXlengthX() {
-        final Traversal<Vertex, Integer> traversal = get_g_VX1X_outE_label_mapXlengthX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        List<Integer> lengths = traversal.toList();
-        assertTrue(lengths.contains("created".length()));
-        assertTrue(lengths.contains("knows".length()));
-        assertEquals(lengths.size(), 3);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1X_out_mapXnameX_mapXlengthX() {
-        final Traversal<Vertex, Integer> traversal = get_g_VX1X_out_mapXnameX_mapXlengthX(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        final List<Integer> lengths = traversal.toList();
-        assertTrue(lengths.contains("josh".length()));
-        assertTrue(lengths.contains("vadas".length()));
-        assertTrue(lengths.contains("lop".length()));
-        assertEquals(lengths.size(), 3);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_asXaX_out_mapXa_nameX() {
-        int marko = 0;
-        int peter = 0;
-        int josh = 0;
-        int other = 0;
-
-        final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_mapXa_nameX();
-        printTraversalForm(traversal);
-        while (traversal.hasNext()) {
-            final String name = traversal.next();
-            if (name.equals("marko")) marko++;
-            else if (name.equals("peter")) peter++;
-            else if (name.equals("josh")) josh++;
-            else other++;
-        }
-        assertEquals(marko, 3);
-        assertEquals(josh, 2);
-        assertEquals(peter, 1);
-        assertEquals(other, 0);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_asXaX_out_out_mapXa_name_it_nameX() {
-        final Traversal<Vertex, String> traversal = get_g_V_asXaX_out_out_mapXa_name_it_nameX();
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String doubleName = traversal.next();
-            assertTrue("markoripple".equals(doubleName) || "markolop".equals(doubleName));
-        }
-        assertEquals(2, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends MapTest {
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_mapXnameX(final Object v1Id) {
-            return g.V(v1Id).<String>map(v -> v.get().value("name"));
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_VX1X_outE_label_mapXlengthX(final Object v1Id) {
-            return g.V(v1Id).outE().label().map(l -> l.get().length());
-        }
-
-        @Override
-        public Traversal<Vertex, Integer> get_g_VX1X_out_mapXnameX_mapXlengthX(final Object v1Id) {
-            return g.V(v1Id).out().map(v -> v.get().value("name")).map(n -> n.get().toString().length());
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_asXaX_out_mapXa_nameX() {
-            return g.V().as("a").out().<String>map(v -> v.<Vertex>path("a").value("name"));
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_asXaX_out_out_mapXa_name_it_nameX() {
-            return g.V().as("a").out().out().map(v -> v.<Vertex>path("a").<String>value("name") + v.get().<String>value("name"));
-        }
-    }
-}


[13/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
index 6c1d6e6..6f638a5 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinSuite.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin;
 
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
index 8fab827..e5b1a79 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
@@ -19,8 +19,8 @@
 package org.apache.tinkerpop.gremlin;
 
 import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
index d5a0c94..4b3c98c 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphManager.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin;
 
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 
 /**
  * Holds objects specified by the test suites supplying them in a static manner to the test cases.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
index 6c7530a..987cf43 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/GraphProvider.java
@@ -19,18 +19,18 @@
 package org.apache.tinkerpop.gremlin;
 
 import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.B_O_Traverser;
-import org.apache.tinkerpop.gremlin.process.traverser.O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -78,23 +78,23 @@ public interface GraphProvider {
     }};
 
     /**
-     * Create a {@link org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource} from a {@link Graph} instance.  The default implementation uses the
+     * Create a {@link org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource} from a {@link Graph} instance.  The default implementation uses the
      * {@link org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine} so vendors should
      * override as necessary if their implementation is testing something that requires a different engine type,
-     * like those tests for {@link org.apache.tinkerpop.gremlin.process.TraversalEngine.Type}.
+     * like those tests for {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine.Type}.
      */
     public default GraphTraversalSource traversal(final Graph graph) {
         return GraphTraversalSource.build().engine(StandardTraversalEngine.build()).create(graph);
     }
 
     /**
-     * Create a {@link org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource} from a {@link Graph} instance.  The default implementation uses the
+     * Create a {@link org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource} from a {@link Graph} instance.  The default implementation uses the
      * {@link org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine} so vendors should
      * override as necessary if their implementation is testing something that requires a different engine type,
-     * like those tests for {@link org.apache.tinkerpop.gremlin.process.TraversalEngine.Type}.
+     * like those tests for {@link org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine.Type}.
      * <br/>
      * Implementations should apply strategies as necessary to the
-     * {@link org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource.Builder} before calling
+     * {@link org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource.Builder} before calling
      * it's {@code create} method.
      */
     public default GraphTraversalSource traversal(final Graph graph, final TraversalStrategy... strategies) {
@@ -254,9 +254,9 @@ public interface GraphProvider {
      * <li>{@link Graph}</li>
      * <li>{@link Graph.Variables}</li>
      * <li>{@link GraphTraversal}</li>
-     * <li>{@link org.apache.tinkerpop.gremlin.process.traverser.B_O_P_PA_S_SE_SL_Traverser}</li>
+     * <li>{@link org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_Traverser}</li>
      * <li>{@link Property}</li>
-     * <li>{@link org.apache.tinkerpop.gremlin.process.traverser.B_O_PA_S_SE_SL_Traverser}</li>
+     * <li>{@link org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_Traverser}</li>
      * <li>{@link Traversal}</li>
      * <li>{@link Traverser}</li>
      * <li>{@link Vertex}</li>

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
index 6e16efd..949dc92 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/AbstractGremlinProcessTest.java
@@ -20,7 +20,9 @@ package org.apache.tinkerpop.gremlin.process;
 
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.GraphManager;
-import org.apache.tinkerpop.gremlin.process.util.MapHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper;
 import org.junit.Before;
 
 import java.util.ArrayList;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
index 256a253..245b9e5 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/IgnoreEngine.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process;
 
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
 import java.lang.annotation.Retention;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
index 7604248..51dc452 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
@@ -22,51 +22,52 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.process.computer.ranking.PageRankVertexProgramTest;
 import org.apache.tinkerpop.gremlin.process.computer.util.ComputerGraphTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.BranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.ChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.UnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.FilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.FoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.UnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.ValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.TreeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategyTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ExceptTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RetainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.BackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TraversalVerificationStrategyTest;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ReadOnlyStrategyProcessTest;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
 import org.junit.runners.model.InitializationError;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 1878122..82696b2 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -20,63 +20,63 @@ package org.apache.tinkerpop.gremlin.process;
 
 import org.apache.tinkerpop.gremlin.AbstractGremlinSuite;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.BranchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.ChooseTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.LocalTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.RepeatTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.branch.UnionTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.AndTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CoinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.CyclicPathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.DedupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.ExceptTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.FilterTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasNotTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.HasTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.IsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.OrTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RangeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.RetainTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SampleTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.SimplePathTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.filter.WhereTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddEdgeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.BackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CoalesceTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.FoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MaxTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MeanTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MinTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.OrderTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SelectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.SumTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.UnfoldTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.ValueMapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.AggregateTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupCountTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroupTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.InjectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SackTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectCapTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SideEffectTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StoreTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.SubgraphTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.TreeTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.util.TraversalSideEffectsTest;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.TraversalVerificationStrategyTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.BranchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.ChooseTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CoinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.CyclicPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ExceptTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasNotTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RetainTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SampleTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.SimplePathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.BackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CoalesceTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MaxTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.UnfoldTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ValueMapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.AggregateTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCountTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StoreTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.TreeTest;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffectsTest;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.TraversalVerificationStrategyTest;
 import org.apache.tinkerpop.gremlin.process.traversal.CoreTraversalTest;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategyProcessTest;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ReadOnlyStrategyProcessTest;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategyProcessTest;
-import org.apache.tinkerpop.gremlin.process.util.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.PathTest;
 import org.junit.runners.model.InitializationError;
 import org.junit.runners.model.RunnerBuilder;
 
@@ -155,7 +155,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             MinTest.Traversals.class,
             SumTest.Traversals.class,
             OrderTest.Traversals.class,
-            org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PathTest.Traversals.class,
+            org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest.Traversals.class,
             PropertiesTest.Traversals.class,
             SelectTest.Traversals.class,
             VertexTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
index 346428d..5bf7542 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/TraversalPerformanceTest.java
@@ -26,12 +26,12 @@ import com.carrotsearch.junitbenchmarks.annotation.BenchmarkMethodChart;
 import com.carrotsearch.junitbenchmarks.annotation.LabelType;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.__;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.TestRule;
 
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.out;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
index 63f66a4..fc1b9b5 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/UseEngine.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process;
 
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Inherited;
 import java.lang.annotation.Repeatable;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
index ea611f3..1022229 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/GraphComputerTest.java
@@ -21,12 +21,10 @@ package org.apache.tinkerpop.gremlin.process.computer;
 import org.apache.tinkerpop.gremlin.ExceptionCoverage;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.apache.tinkerpop.gremlin.process.computer.lambda.LambdaMapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.lambda.LambdaVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
-import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
index 3d4bf4e..b7159f4 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/ranking/PageRankVertexProgramTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.process.computer.ranking;
 
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
index 9c45b63..d69f1ee 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/computer/util/ComputerGraphTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.process.computer.util;
 
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.UseEngine;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java
deleted file mode 100644
index 7ed2db6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/BranchTest.java
+++ /dev/null
@@ -1,82 +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.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.label;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.values;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class BranchTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
-
-    public abstract Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
-        Traversal<Vertex, Object> traversal = get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
-        Traversal<Vertex, Object> traversal = get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("java", "java", "lop", "ripple", 29, 27, 32, 35), traversal);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends BranchTest {
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX() {
-            return g.V().branch(v -> v.get().label().equals("person") ? "a" : "b")
-                    .option("a", values("age"))
-                    .option("b", values("lang"))
-                    .option("b", values("name"));
-        }
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_branchXlabelX_optionXperson__ageX_optionXsoftware__langX_optionXsoftware__nameX() {
-            return g.V().branch(label().is("person").count())
-                    .option(1L, values("age"))
-                    .option(0L, values("lang"))
-                    .option(0L, values("name"));
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java
deleted file mode 100644
index e16fddb..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/ChooseTest.java
+++ /dev/null
@@ -1,75 +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.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Joshua Shinavier (http://fortytwo.net)
- */
-public abstract class ChooseTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
-        final Traversal<Vertex, Object> traversal = get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX();
-        printTraversalForm(traversal);
-        Map<String, Long> counts = new HashMap<>();
-        int counter = 0;
-        while (traversal.hasNext()) {
-            MapHelper.incr(counts, traversal.next().toString(), 1l);
-            counter++;
-        }
-        assertFalse(traversal.hasNext());
-        assertEquals(2, counter);
-        assertEquals(2, counts.size());
-        assertEquals(Long.valueOf(1), counts.get("{name=[marko], age=[29]}"));
-        assertEquals(Long.valueOf(1), counts.get("josh"));
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends ChooseTest {
-
-        @Override
-        public Traversal<Vertex, Object> get_g_V_chooseXout_countX_optionX2L__nameX_optionX3L__valueMapX() {
-            return g.V().choose(out().count())
-                    .option(2L, values("name"))
-                    .option(3L, valueMap());
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java
deleted file mode 100644
index 2247d42..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/LocalTest.java
+++ /dev/null
@@ -1,255 +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.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Order;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW;
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class LocalTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
-
-    public abstract Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
-
-    public abstract Traversal<Vertex, Long> get_g_V_localXoutE_countX();
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
-
-    public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id);
-
-    public abstract Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id);
-
-    public abstract Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id);
-
-    public abstract Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name();
-
-    @Test
-    @LoadGraphWith(CREW)
-    public void g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
-        final Traversal<Vertex, String> traversal = get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("brussels", "san diego", "centreville", "dulles", "baltimore", "bremen", "aachen", "kaiserslautern"), traversal);
-
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_by() {
-        final Traversal<Vertex, Map<String, Object>> traversal = get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            final Map<String, Object> map = traversal.next();
-            counter++;
-            assertEquals(2, map.size());
-            if (map.get("a").equals("marko")) {
-                assertEquals(convertToVertexId("lop"), map.get("b"));
-            } else if (map.get("a").equals("josh")) {
-                assertTrue(convertToVertexId("lop").equals(map.get("b")) || convertToVertexId("ripple").equals(map.get("b")));
-            } else if (map.get("a").equals("peter")) {
-                assertEquals(convertToVertexId("lop"), map.get("b"));
-            } else {
-                fail("The following map should not have been returned: " + map);
-            }
-        }
-        assertEquals(4, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_localXoutE_countX() {
-        final Traversal<Vertex, Long> traversal = get_g_V_localXoutE_countX();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList(3l, 0l, 0l, 0l, 1l, 2l), traversal);
-
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_localXbothEXknows_createdX_limitX1XX() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEXknows_createdX_limitX1XX(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        final Edge edge = traversal.next();
-        assertTrue(edge.label().equals("created") || edge.label().equals("knows"));
-        assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_localXbothE_limitX1XX_otherV_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX1XX_otherV_name(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String name = traversal.next();
-            assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
-        }
-        assertEquals(1, counter);
-        assertFalse(traversal.hasNext());
-
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_localXbothE_limitX2XX_otherV_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX4X_localXbothE_limitX2XX_otherV_name(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String name = traversal.next();
-            assertTrue(name.equals("marko") || name.equals("ripple") || name.equals("lop"));
-        }
-        assertEquals(2, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_localXinEXknowsX_limitX2XX_outV_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_localXinEXknowsX_limitX2XX_outV_name();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            assertEquals(traversal.next(), "marko");
-        }
-        assertFalse(traversal.hasNext());
-        assertEquals(2, counter);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX4X_localXbothEX1_createdX_limitX1XX() {
-        final Traversal<Vertex, Edge> traversal = get_g_VX4X_localXbothEX1_createdX_limitX1XX(convertToVertexId("josh"));
-        printTraversalForm(traversal);
-        final Edge edge = traversal.next();
-        assertEquals("created", edge.label());
-        assertTrue(edge.value("weight").equals(1.0d) || edge.value("weight").equals(0.4d));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_localXoutEXknowsX_limitX1XX_inV_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        final String name = traversal.next();
-        assertTrue(name.equals("vadas") || name.equals("josh"));
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            final String name = traversal.next();
-            assertTrue(name.equals("marko") || name.equals("lop") || name.equals("josh") || name.equals("ripple") || name.equals("peter"));
-        }
-        assertEquals(5, counter);
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends LocalTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() {
-            return g.V().local(properties("location").order().by(T.value, Order.incr).range(0, 2)).value();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Object>> get_g_V_hasXlabel_personX_asXaX_localXoutXcreatedX_asXbXX_selectXa_bX_byXnameX_byXidX() {
-            return g.V().has(T.label, "person").as("a").local(out("created").as("b")).select("a", "b").by("name").by(T.id);
-        }
-
-        @Override
-        public Traversal<Vertex, Long> get_g_V_localXoutE_countX() {
-            return g.V().local(outE().count());
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_localXoutEXknowsX_limitX1XX_inV_name(final Object v1Id) {
-            return g.V(v1Id).local(outE("knows").limit(1)).inV().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXbothEXcreatedX_limitX1XX_otherV_name() {
-            return g.V().local(bothE("created").limit(1)).otherV().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEX1_createdX_limitX1XX(final Object v4Id) {
-            return g.V(v4Id).local(bothE("created").limit(1));
-        }
-
-        @Override
-        public Traversal<Vertex, Edge> get_g_VX4X_localXbothEXknows_createdX_limitX1XX(final Object v4Id) {
-            return g.V(v4Id).local(bothE("knows", "created").limit(1));
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX1XX_otherV_name(final Object v4Id) {
-            return g.V(v4Id).local(bothE().limit(1)).otherV().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX4X_localXbothE_limitX2XX_otherV_name(final Object v4Id) {
-            return g.V(v4Id).local(bothE().limit(2)).otherV().values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() {
-            return g.V().local(inE("knows").limit(2)).outV().values("name");
-        }
-
-
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java
deleted file mode 100644
index 57c214f..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/RepeatTest.java
+++ /dev/null
@@ -1,272 +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.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.util.MapHelper;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class RepeatTest extends AbstractGremlinProcessTest {
-
-    // DO/WHILE
-
-    public abstract Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path();
-
-    public abstract Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit();
-
-    // WHILE/DO
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path();
-
-    public abstract Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path();
-
-    public abstract Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id);
-
-    // SIDE-EFFECTS
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX();
-
-    // TODO:
-    /*
-    gremlin> g.V(1).repeat(out()).until(outE().count().cap().filter{it.get() == 0}).path().by('name') (3)
-    ==>[marko, lop]
-    ==>[marko, vadas]
-    ==>[marko, josh, ripple]
-    ==>[marko, josh, lop]
-     */
-
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXoutX_timesX2X_emit_path() {
-        final List<Traversal<Vertex, Path>> traversals = new ArrayList<>();
-        traversals.add(get_g_V_repeatXoutX_timesX2X_emit_path());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<Integer, Long> pathLengths = new HashMap<>();
-            int counter = 0;
-            while (traversal.hasNext()) {
-                counter++;
-                MapHelper.incr(pathLengths, traversal.next().size(), 1l);
-            }
-            assertEquals(2, pathLengths.size());
-            assertEquals(8, counter);
-            assertEquals(new Long(6), pathLengths.get(2));
-            assertEquals(new Long(2), pathLengths.get(3));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
-        final List<Traversal<Vertex, String>> traversals = new ArrayList<>();
-        traversals.add(get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            checkResults(Arrays.asList("marko", "marko"), traversal);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXoutX_timesX2X() {
-        final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
-        traversals.add(get_g_V_repeatXoutX_timesX2X());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            int counter = 0;
-            while (traversal.hasNext()) {
-                counter++;
-                Vertex vertex = traversal.next();
-                assertTrue(vertex.value("name").equals("lop") || vertex.value("name").equals("ripple"));
-            }
-            assertEquals(2, counter);
-            assertFalse(traversal.hasNext());
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXoutX_timesX2X_emit() {
-        final List<Traversal<Vertex, Vertex>> traversals = new ArrayList<>();
-        traversals.add(get_g_V_repeatXoutX_timesX2X_emit());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            Map<String, Long> map = new HashMap<>();
-            while (traversal.hasNext()) {
-                Vertex vertex = traversal.next();
-                MapHelper.incr(map, vertex.value("name"), 1l);
-            }
-            assertEquals(4, map.size());
-            assertTrue(map.containsKey("vadas"));
-            assertTrue(map.containsKey("josh"));
-            assertTrue(map.containsKey("ripple"));
-            assertTrue(map.containsKey("lop"));
-            assertEquals(new Long(1), map.get("vadas"));
-            assertEquals(new Long(1), map.get("josh"));
-            assertEquals(new Long(2), map.get("ripple"));
-            assertEquals(new Long(4), map.get("lop"));
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_timesX2X_repeatXoutX_name() {
-        final List<Traversal<Vertex, String>> traversals = Arrays.asList(
-                get_g_VX1X_timesX2X_repeatXoutX_name(convertToVertexId("marko")));
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            checkResults(Arrays.asList("lop", "ripple"), traversal);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_emit_timesX2X_repeatXoutX_path() {
-        final List<Traversal<Vertex, Path>> traversals = Arrays.asList(
-                get_g_V_emit_timesX2X_repeatXoutX_path(),
-                get_g_V_emit_repeatXoutX_timesX2X_path());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            int path1 = 0;
-            int path2 = 0;
-            int path3 = 0;
-            while (traversal.hasNext()) {
-                final Path path = traversal.next();
-                if (path.size() == 1) {
-                    path1++;
-                } else if (path.size() == 2) {
-                    path2++;
-                } else if (path.size() == 3) {
-                    path3++;
-                } else {
-                    fail("Only path lengths of 1, 2, or 3 should be seen");
-                }
-            }
-            assertEquals(6, path1);
-            assertEquals(6, path2);
-            assertEquals(2, path3);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_emitXhasXlabel_personXX_repeatXoutX_name() {
-        final List<Traversal<Vertex, String>> traversals = Arrays.asList(get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(convertToVertexId("marko")));
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            checkResults(Arrays.asList("marko", "josh", "vadas"), traversal);
-        });
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
-        final List<Traversal<Vertex, Map<String, Long>>> traversals = Arrays.asList(get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX());
-        traversals.forEach(traversal -> {
-            printTraversalForm(traversal);
-            final Map<String, Long> map = traversal.next();
-            assertFalse(traversal.hasNext());
-            //[ripple:2, peter:1, vadas:2, josh:2, lop:4, marko:1]
-            assertEquals(6, map.size());
-            assertEquals(1l, map.get("marko").longValue());
-            assertEquals(2l, map.get("vadas").longValue());
-            assertEquals(2l, map.get("josh").longValue());
-            assertEquals(4l, map.get("lop").longValue());
-            assertEquals(2l, map.get("ripple").longValue());
-            assertEquals(1l, map.get("peter").longValue());
-        });
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends RepeatTest {
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_repeatXoutX_timesX2X_emit_path() {
-            return g.V().repeat(out()).times(2).emit().path();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_repeatXoutX_timesX2X_repeatXinX_timesX2X_name() {
-            return g.V().repeat(out()).times(2).repeat(in()).times(2).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X() {
-            return g.V().repeat(out()).times(2);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXoutX_timesX2X_emit() {
-            return g.V().repeat(out()).times(2).emit();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_timesX2X_repeatXoutX_name(Object v1Id) {
-            return g.V(v1Id).times(2).repeat(out()).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_emit_repeatXoutX_timesX2X_path() {
-            return g.V().emit().repeat(out()).times(2).path();
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_V_emit_timesX2X_repeatXoutX_path() {
-            return g.V().emit().times(2).repeat(out()).path();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_emitXhasXlabel_personXX_repeatXoutX_name(final Object v1Id) {
-            return g.V(v1Id).emit(has(T.label, "person")).repeat(out()).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_repeatXgroupCountXmX_byXnameX_outX_timesX2X_capXmX() {
-            return g.V().repeat(groupCount("m").by("name").out()).times(2).cap("m");
-        }
-    }
-}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java
deleted file mode 100644
index 2594349..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/branch/UnionTest.java
+++ /dev/null
@@ -1,195 +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.branch;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-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.structure.Vertex;
-import org.junit.Test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.junit.Assert.*;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class UnionTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_V_unionXout__inX_name();
-
-    public abstract Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id);
-
-    public abstract Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
-
-    public abstract Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
-
-    public abstract Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_unionXout__inX_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_unionXout__inX_name();
-        printTraversalForm(traversal);
-        checkResults(new HashMap<String, Long>() {{
-            put("marko", 3l);
-            put("lop", 3l);
-            put("peter", 1l);
-            put("ripple", 1l);
-            put("josh", 3l);
-            put("vadas", 1l);
-        }}, traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_unionXrepeatXoutX_timesX2X__outX_name() {
-        final Traversal<Vertex, String> traversal = get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        checkResults(new HashMap<String, Long>() {{
-            put("lop", 2l);
-            put("ripple", 1l);
-            put("josh", 1l);
-            put("vadas", 1l);
-        }}, traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX() {
-        final Traversal<Vertex, String> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX();
-        printTraversalForm(traversal);
-        checkResults(new HashMap<String, Long>() {{
-            put("lop", 3l);
-            put("ripple", 1l);
-            put("java", 4l);
-            put("josh", 1l);
-            put("vadas", 1l);
-            put("person", 4l);
-        }}, traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_chooseXlabel_eq_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
-        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount();
-        printTraversalForm(traversal);
-        final Map<String, Long> groupCount = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(3l, groupCount.get("lop").longValue());
-        assertEquals(1l, groupCount.get("ripple").longValue());
-        assertEquals(4l, groupCount.get("java").longValue());
-        assertEquals(1l, groupCount.get("josh").longValue());
-        assertEquals(1l, groupCount.get("vadas").longValue());
-        assertEquals(4l, groupCount.get("person").longValue());
-        assertEquals(6, groupCount.size());
-
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
-        final Traversal<Vertex, Map<String, Long>> traversal = get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount();
-        printTraversalForm(traversal);
-        final Map<String, Long> groupCount = traversal.next();
-        assertFalse(traversal.hasNext());
-        assertEquals(12l, groupCount.get("software").longValue());
-        assertEquals(20l, groupCount.get("person").longValue());
-        assertEquals(2, groupCount.size());
-
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX() {
-        final Traversal<Vertex, Number> traversal = get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(convertToVertexId("marko"), convertToVertexId("vadas"));
-        printTraversalForm(traversal);
-        assertTrue(traversal.hasNext());
-        final Number startNumber = traversal.next();
-        assertTrue(traversal.hasNext());
-        if (startNumber.longValue() == 3l) {
-            assertEquals(0l, traversal.next().longValue());
-            assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
-            //
-            assertEquals(0l, traversal.next().longValue());
-            assertEquals(1l, traversal.next().longValue());
-            assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
-        } else {
-            assertEquals(1l, traversal.next().longValue());
-            assertEquals(0.0d, traversal.next().doubleValue(), 0.1d);
-            //
-            assertEquals(3l, traversal.next().longValue());
-            assertEquals(0l, traversal.next().longValue());
-            assertEquals(1.9d, traversal.next().doubleValue(), 0.1d);
-        }
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends UnionTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_unionXout__inX_name() {
-            return g.V().union(out(), in()).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_VX1X_unionXrepeatXoutX_timesX2X__outX_name(final Object v1Id) {
-            return g.V(v1Id).union(repeat(out()).times(2), out()).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX() {
-            return g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label());
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_chooseXlabel_is_person__unionX__out_lang__out_nameX__in_labelX_groupCount() {
-            return (Traversal) g.V().choose(label().is("person"), union(out().values("lang"), out().values("name")), in().label()).groupCount();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, Long>> get_g_V_unionXrepeatXunionXoutXcreatedX__inXcreatedXX_timesX2X__repeatXunionXinXcreatedX__outXcreatedXX_timesX2XX_label_groupCount() {
-            return (Traversal) g.V().union(
-                    repeat(union(
-                            out("created"),
-                            in("created"))).times(2),
-                    repeat(union(
-                            in("created"),
-                            out("created"))).times(2)).label().groupCount();
-        }
-
-        @Override
-        public Traversal<Vertex, Number> get_g_VX1_2X_unionXoutE_count__inE_count__outE_weight_sumX(final Object v1Id, final Object v2Id) {
-            return g.V(v1Id, v2Id).union(outE().count(), inE().count(), (Traversal) outE().values("weight").sum());
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java
deleted file mode 100644
index 11dbdea..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/AndTest.java
+++ /dev/null
@@ -1,79 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-
-import java.util.Arrays;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.*;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gt;
-import static org.apache.tinkerpop.gremlin.structure.Compare.gte;
-
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AndTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
-
-    public abstract Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("marko", "josh"), traversal);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_andXout__hasXlabel_personX_and_hasXage_gte_32XX_name() {
-        final Traversal<Vertex, String> traversal = get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name();
-        printTraversalForm(traversal);
-        checkResults(Arrays.asList("josh", "peter"), traversal);
-    }
-
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends AndTest {
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_andXhasXage_gt_27X__outE_count_gt_2X_name() {
-            return g.V().and(has("age", gt, 27), outE().count().is(gte, 2l)).values("name");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_andXoutE__hasXlabel_personX_and_hasXage_gte_32XX_name() {
-            return g.V().and(outE(), has(T.label, "person").and().has("age", Compare.gte, 32)).values("name");
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java
deleted file mode 100644
index a734b58..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CoinTest.java
+++ /dev/null
@@ -1,84 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-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.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CoinTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_coinX1X();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_coinX0X();
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_coinX1X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_coinX1X();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            traversal.next();
-        }
-        assertEquals(6, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_coinX0X() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_coinX0X();
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            traversal.next();
-        }
-        assertEquals(0, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends CoinTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coinX1X() {
-            return g.V().coin(1.0d);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_coinX0X() {
-            return g.V().coin(0.0d);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java
deleted file mode 100644
index 33326d8..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/graph/traversal/step/filter/CyclicPathTest.java
+++ /dev/null
@@ -1,86 +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.filter;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.Path;
-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.structure.Vertex;
-import org.junit.Test;
-
-import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class CyclicPathTest extends AbstractGremlinProcessTest {
-
-    public abstract Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1);
-
-    public abstract Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1);
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath() {
-        final Traversal<Vertex, Vertex> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Vertex vertex = traversal.next();
-            assertEquals("marko", vertex.<String>value("name"));
-        }
-        assertEquals(1, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path() {
-        final Traversal<Vertex, Path> traversal = get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(convertToVertexId("marko"));
-        printTraversalForm(traversal);
-        int counter = 0;
-        while (traversal.hasNext()) {
-            counter++;
-            Path path = traversal.next();
-            assertFalse(path.isSimple());
-        }
-        assertEquals(1, counter);
-        assertFalse(traversal.hasNext());
-    }
-
-    @UseEngine(TraversalEngine.Type.STANDARD)
-    @UseEngine(TraversalEngine.Type.COMPUTER)
-    public static class Traversals extends CyclicPathTest {
-        @Override
-        public Traversal<Vertex, Vertex> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath(final Object v1Id) {
-            return g.V(v1Id).out("created").in("created").cyclicPath();
-        }
-
-        @Override
-        public Traversal<Vertex, Path> get_g_VX1X_outXcreatedX_inXcreatedX_cyclicPath_path(final Object v1Id) {
-            return g.V(v1Id).out("created").in("created").cyclicPath().path();
-        }
-    }
-}


[22/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
new file mode 100644
index 0000000..6804dbd
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/AbstractTraverser.java
@@ -0,0 +1,187 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyPath;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedElement;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class AbstractTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
+
+    protected T t;
+
+    protected AbstractTraverser() {
+
+    }
+
+    public AbstractTraverser(final T t) {
+        this.t = t;
+    }
+
+    /////////////
+
+    @Override
+    public void merge(final Admin<?> other) {
+        throw new UnsupportedOperationException("This traverser does not support merging: " + this.getClass().getCanonicalName());
+    }
+
+    @Override
+    public <R> Admin<R> split(final R r, final Step<T, R> step) {
+        try {
+            final AbstractTraverser<R> clone = (AbstractTraverser<R>) super.clone();
+            clone.t = r;
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public Admin<T> split() {
+        try {
+            return (AbstractTraverser<T>) super.clone();
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public void set(final T t) {
+        this.t = t;
+    }
+
+    @Override
+    public void incrLoops(final String stepLabel) {
+
+    }
+
+    @Override
+    public void resetLoops() {
+
+    }
+
+    @Override
+    public String getStepId() {
+        throw new UnsupportedOperationException("This traverser does not support futures: " + this.getClass().getCanonicalName());
+    }
+
+    @Override
+    public void setStepId(final String stepId) {
+
+    }
+
+    @Override
+    public void setBulk(final long count) {
+
+    }
+
+    @Override
+    public Admin<T> detach() {
+        this.t = DetachedFactory.detach(this.t, false);
+        return this;
+    }
+
+    @Override
+    public Admin<T> attach(final Vertex hostVertex) {
+        if (this.t instanceof DetachedElement)
+            this.t = (T) ((DetachedElement) this.t).attach(hostVertex);
+        else if (this.t instanceof DetachedProperty)
+            this.t = (T) ((DetachedProperty) this.t).attach(hostVertex);
+        // you do not want to attach a path because it will reference graph objects not at the current vertex
+        return this;
+    }
+
+    @Override
+    public void setSideEffects(final TraversalSideEffects sideEffects) {
+
+    }
+
+    @Override
+    public TraversalSideEffects getSideEffects() {
+        return EmptyTraversalSideEffects.instance();
+        //throw new UnsupportedOperationException("This traverser does not support sideEffects: " + this.getClass().getCanonicalName());
+    }
+
+    @Override
+    public T get() {
+        return this.t;
+    }
+
+    @Override
+    public <S> S sack() {
+        throw new UnsupportedOperationException("This traverser does not support sacks: " + this.getClass().getCanonicalName());
+    }
+
+    @Override
+    public <S> void sack(final S object) {
+
+    }
+
+    @Override
+    public Path path() {
+        return EmptyPath.instance();
+    }
+
+    @Override
+    public int loops() {
+        throw new UnsupportedOperationException("This traverser does not support loops: " + this.getClass().getCanonicalName());
+    }
+
+    @Override
+    public long bulk() {
+        return 1l;
+    }
+
+    @Override
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public AbstractTraverser<T> clone() {
+        try {
+            return (AbstractTraverser<T>) super.clone();
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    ///////////
+
+    @Override
+    public int hashCode() {
+        return this.t.hashCode();
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object instanceof AbstractTraverser && ((AbstractTraverser) object).get().equals(this.t);
+    }
+
+    @Override
+    public String toString() {
+        return this.t.toString();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
new file mode 100644
index 0000000..0f79d99
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/DefaultTraverserGeneratorFactory.java
@@ -0,0 +1,64 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_PA_S_SE_SL_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_P_PA_S_SE_SL_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraverserGeneratorFactory implements TraverserGeneratorFactory {
+
+    private static DefaultTraverserGeneratorFactory INSTANCE = new DefaultTraverserGeneratorFactory();
+
+    public static DefaultTraverserGeneratorFactory instance() {
+        return INSTANCE;
+    }
+
+    private DefaultTraverserGeneratorFactory() {
+    }
+
+    @Override
+    public TraverserGenerator getTraverserGenerator(final Traversal.Admin<?,?> traversal) {
+        final Set<TraverserRequirement> requirements = traversal.getTraverserRequirements();
+
+        if (O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+            return O_TraverserGenerator.instance();
+
+        if (B_O_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+            return B_O_TraverserGenerator.instance();
+
+        if (B_O_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+            return B_O_PA_S_SE_SL_TraverserGenerator.instance();
+
+        if (B_O_P_PA_S_SE_SL_TraverserGenerator.instance().getProvidedRequirements().containsAll(requirements))
+            return B_O_P_PA_S_SE_SL_TraverserGenerator.instance();
+
+        throw new IllegalStateException("The provided traverser generator factory does not support the requirements of the traversal: " + this.getClass().getCanonicalName() + requirements);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
new file mode 100644
index 0000000..498f6b0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/EmptyTraverser.java
@@ -0,0 +1,153 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Path;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyPath;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class EmptyTraverser<T> implements Traverser<T>, Traverser.Admin<T> {
+
+    private static final EmptyTraverser INSTANCE = new EmptyTraverser();
+
+    public static <R> EmptyTraverser<R> instance() {
+        return INSTANCE;
+    }
+
+    private EmptyTraverser() {
+
+    }
+
+    @Override
+    public void set(final T t) {
+
+    }
+
+    @Override
+    public void incrLoops(final String stepLabel) {
+
+    }
+
+    @Override
+    public void resetLoops() {
+
+    }
+
+    @Override
+    public String getStepId() {
+        return HALT;
+    }
+
+    @Override
+    public void setStepId(final String stepId) {
+
+    }
+
+    @Override
+    public void setBulk(long count) {
+
+    }
+
+    @Override
+    public <R> Admin<R> split(final R r, final Step<T, R> step) {
+        return INSTANCE;
+    }
+
+    @Override
+    public Admin<T> split() {
+        return this;
+    }
+
+    @Override
+    public Admin<T> detach() {
+        return this;
+    }
+
+    @Override
+    public Admin<T> attach(final Vertex hostVertex) {
+        return this;
+    }
+
+    @Override
+    public void setSideEffects(final TraversalSideEffects sideEffects) {
+
+    }
+
+    @Override
+    public T get() {
+        return null;
+    }
+
+    @Override
+    public <S> S sack() {
+        return null;
+    }
+
+    @Override
+    public <S> void sack(final S object) {
+
+    }
+
+    @Override
+    public void merge(final Traverser.Admin<?> other) {
+
+    }
+
+    @Override
+    public Path path() {
+        return EmptyPath.instance();
+    }
+
+    @Override
+    public int loops() {
+        return 0;
+    }
+
+    @Override
+    public long bulk() {
+        return 0l;
+    }
+
+    @Override
+    public TraversalSideEffects getSideEffects() {
+        return null;
+    }
+
+    @Override
+    public int hashCode() {
+        return 380473707;
+    }
+
+    @Override
+    public boolean equals(final Object object) {
+        return object instanceof EmptyTraverser;
+    }
+
+    @Override
+    @SuppressWarnings("CloneDoesntCallSuperClone")
+    public EmptyTraverser<T> clone() {
+        return this;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java
new file mode 100644
index 0000000..0a0cc5a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/traverser/util/TraverserSet.java
@@ -0,0 +1,143 @@
+/*
+ * 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.traverser.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+
+import java.io.Serializable;
+import java.util.AbstractSet;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Queue;
+import java.util.Set;
+import java.util.Spliterator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TraverserSet<S> extends AbstractSet<Traverser.Admin<S>> implements Set<Traverser.Admin<S>>, Queue<Traverser.Admin<S>>, Serializable {
+
+    private final Map<Traverser.Admin<S>, Traverser.Admin<S>> map = new LinkedHashMap<>();
+
+    public TraverserSet() {
+
+    }
+
+    public TraverserSet(final Traverser.Admin<S> traverser) {
+        this.map.put(traverser, traverser);
+    }
+
+    @Override
+    public Iterator<Traverser.Admin<S>> iterator() {
+        return this.map.values().iterator();
+    }
+
+    public Traverser.Admin<S> get(final Traverser.Admin<S> traverser) {
+        return this.map.get(traverser);
+    }
+
+    @Override
+    public int size() {
+        return this.map.size();
+    }
+
+    public long bulkSize() {
+        return this.map.values().stream().map(Traverser::bulk).reduce(0l, (a, b) -> a + b);
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return this.map.isEmpty();
+    }
+
+    @Override
+    public boolean contains(final Object traverser) {
+        return this.map.containsKey(traverser);
+    }
+
+    @Override
+    public boolean add(final Traverser.Admin<S> traverser) {
+        final Traverser.Admin<S> existing = this.map.get(traverser);
+        if (null == existing) {
+            this.map.put(traverser, traverser);
+            return true;
+        } else {
+            existing.merge(traverser);
+            return false;
+        }
+    }
+
+    @Override
+    public boolean offer(final Traverser.Admin<S> traverser) {
+        return this.add(traverser);
+    }
+
+    @Override
+    public Traverser.Admin<S> remove() {  // pop, exception if empty
+        return this.map.remove(this.map.values().iterator().next());
+    }
+
+    @Override
+    public Traverser.Admin<S> poll() {  // pop, null if empty
+        return this.map.isEmpty() ? null : this.remove();
+    }
+
+    @Override
+    public Traverser.Admin<S> element() { // peek, exception if empty
+        return this.iterator().next();
+    }
+
+    @Override
+    public Traverser.Admin<S> peek() { // peek, null if empty
+        return this.map.isEmpty() ? null : this.iterator().next();
+    }
+
+    @Override
+    public boolean remove(final Object traverser) {
+        return this.map.remove(traverser) != null;
+    }
+
+    @Override
+    public void clear() {
+        this.map.clear();
+    }
+
+    @Override
+    public Spliterator<Traverser.Admin<S>> spliterator() {
+        return this.map.values().spliterator();
+    }
+
+    @Override
+    public String toString() {
+        return this.map.keySet().toString();
+    }
+
+    public void sort(final Comparator<Traverser<S>> comparator) {
+        final List<Traverser.Admin<S>> list = new ArrayList<>(this.map.values());
+        Collections.sort(list, comparator);
+        this.map.clear();
+        list.forEach(traverser -> this.map.put(traverser, traverser));
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
new file mode 100644
index 0000000..71e286d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
@@ -0,0 +1,256 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
+
+    private E lastEnd = null;
+    private long lastEndCount = 0l;
+    private Step<?, E> finalEndStep = EmptyStep.instance();
+    private final StepPosition stepPosition = new StepPosition();
+
+    protected final transient Graph graph;
+
+    protected List<Step> steps = new ArrayList<>();
+    protected TraversalSideEffects sideEffects = new DefaultTraversalSideEffects();
+    protected TraversalStrategies strategies;
+    protected TraversalEngine traversalEngine;
+
+    protected boolean locked = false;
+
+    protected TraversalParent traversalParent = (TraversalParent) EmptyStep.instance();
+
+    public DefaultTraversal(final Graph graph) {
+        this.graph = graph;
+        this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(this.graph.getClass()));
+        this.traversalEngine = StandardTraversalEngine.instance(); // TODO: remove and then clean up v.outE
+    }
+
+    @Override
+    public Traversal.Admin<S, E> asAdmin() {
+        return this;
+    }
+
+    @Override
+    public void applyStrategies() throws IllegalStateException {
+        if (this.locked) throw Traversal.Exceptions.traversalIsLocked();
+        TraversalHelper.reIdSteps(this.stepPosition, this);
+        this.strategies.applyStrategies(this);
+        for (final Step<?, ?> step : this.getSteps()) {
+            if (step instanceof TraversalParent) {
+                for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
+                    globalChild.setStrategies(this.strategies);
+                    globalChild.setEngine(this.traversalEngine);
+                    globalChild.applyStrategies();
+                }
+                for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+                    localChild.setStrategies(this.strategies);
+                    localChild.setEngine(StandardTraversalEngine.instance());
+                    localChild.applyStrategies();
+                }
+            }
+        }
+        this.traversalEngine.processTraversal(this);
+        this.finalEndStep = this.getEndStep();
+        this.locked = true;
+    }
+
+    @Override
+    public TraversalEngine getEngine() {
+        return this.traversalEngine;
+    }
+
+    @Override
+    public void setEngine(final TraversalEngine engine) {
+        this.traversalEngine = engine;
+    }
+
+    @Override
+    public List<Step> getSteps() {
+        return Collections.unmodifiableList(this.steps);
+    }
+
+    @Override
+    public boolean hasNext() {
+        if (!this.locked) this.applyStrategies();
+        return this.lastEndCount > 0l || this.finalEndStep.hasNext();
+    }
+
+    @Override
+    public E next() {
+        if (!this.locked) this.applyStrategies();
+        if (this.lastEndCount > 0l) {
+            this.lastEndCount--;
+            return this.lastEnd;
+        } else {
+            final Traverser<E> next = this.finalEndStep.next();
+            final long nextBulk = next.bulk();
+            if (nextBulk == 1) {
+                return next.get();
+            } else {
+                this.lastEndCount = nextBulk - 1;
+                this.lastEnd = next.get();
+                return this.lastEnd;
+            }
+        }
+    }
+
+    @Override
+    public void reset() {
+        this.steps.forEach(Step::reset);
+        this.lastEndCount = 0l;
+    }
+
+    @Override
+    public void addStart(final Traverser<S> start) {
+        if (!this.locked) this.applyStrategies();
+        if (!this.steps.isEmpty()) this.steps.get(0).addStart(start);
+    }
+
+    @Override
+    public void addStarts(final Iterator<Traverser<S>> starts) {
+        if (!this.locked) this.applyStrategies();
+        if (!this.steps.isEmpty()) this.steps.get(0).addStarts(starts);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeTraversalString(this);
+    }
+
+    @Override
+    public Step<S, ?> getStartStep() {
+        return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(0);
+    }
+
+    @Override
+    public Step<?, E> getEndStep() {
+        return this.steps.isEmpty() ? EmptyStep.instance() : this.steps.get(this.steps.size() - 1);
+    }
+
+    @Override
+    public DefaultTraversal<S, E> clone() {
+        try {
+            final DefaultTraversal<S, E> clone = (DefaultTraversal<S, E>) super.clone();
+            clone.steps = new ArrayList<>();
+            clone.sideEffects = this.sideEffects.clone();
+            clone.strategies = this.strategies.clone(); // TODO: does this need to be cloned?
+            clone.lastEnd = null;
+            clone.lastEndCount = 0l;
+            for (final Step<?, ?> step : this.steps) {
+                final Step<?, ?> clonedStep = step.clone();
+                clonedStep.setTraversal(clone);
+                final Step previousStep = clone.steps.isEmpty() ? EmptyStep.instance() : clone.steps.get(clone.steps.size() - 1);
+                clonedStep.setPreviousStep(previousStep);
+                previousStep.setNextStep(clonedStep);
+                clone.steps.add(clonedStep);
+            }
+            clone.finalEndStep = clone.getEndStep();
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public boolean isLocked() {
+        return this.locked;
+    }
+
+    @Override
+    public void setSideEffects(final TraversalSideEffects sideEffects) {
+        this.sideEffects = sideEffects;
+    }
+
+    @Override
+    public TraversalSideEffects getSideEffects() {
+        return this.sideEffects;
+    }
+
+    @Override
+    public void setStrategies(final TraversalStrategies strategies) {
+        this.strategies = strategies.clone();
+    }
+
+    @Override
+    public TraversalStrategies getStrategies() {
+        return this.strategies;
+    }
+
+    @Override
+    public <S2, E2> Traversal.Admin<S2, E2> addStep(final int index, final Step<?, ?> step) throws IllegalStateException {
+        if (this.locked) throw Exceptions.traversalIsLocked();
+        step.setId(this.stepPosition.nextXId());
+        this.steps.add(index, step);
+        final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
+        final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
+        step.setPreviousStep(null != previousStep ? previousStep : EmptyStep.instance());
+        step.setNextStep(null != nextStep ? nextStep : EmptyStep.instance());
+        if (null != previousStep) previousStep.setNextStep(step);
+        if (null != nextStep) nextStep.setPreviousStep(step);
+        return (Traversal.Admin<S2, E2>) this;
+    }
+
+    @Override
+    public <S2, E2> Traversal.Admin<S2, E2> removeStep(final int index) throws IllegalStateException {
+        if (this.locked) throw Exceptions.traversalIsLocked();
+        final Step previousStep = this.steps.size() > 0 && index != 0 ? steps.get(index - 1) : null;
+        final Step nextStep = this.steps.size() > index + 1 ? steps.get(index + 1) : null;
+        this.steps.remove(index);
+        if (null != previousStep) previousStep.setNextStep(null == nextStep ? EmptyStep.instance() : nextStep);
+        if (null != nextStep) nextStep.setPreviousStep(null == previousStep ? EmptyStep.instance() : previousStep);
+        return (Traversal.Admin<S2, E2>) this;
+    }
+
+    @Override
+    public void setParent(final TraversalParent step) {
+        this.traversalParent = step;
+    }
+
+    @Override
+    public TraversalParent getParent() {
+        return this.traversalParent;
+    }
+
+    @Override
+    public Optional<Graph> getGraph() {
+        return Optional.ofNullable(this.graph);
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
new file mode 100644
index 0000000..b93185e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalSideEffects.java
@@ -0,0 +1,202 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Optional;
+import java.util.Set;
+import java.util.function.Supplier;
+import java.util.function.UnaryOperator;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversalSideEffects implements TraversalSideEffects {
+
+    protected Map<String, Object> objectMap = new HashMap<>();
+    protected Map<String, Supplier> supplierMap = new HashMap<>();
+    protected UnaryOperator sackSplitOperator = null;
+    protected Supplier sackInitialValue = null;
+
+    public DefaultTraversalSideEffects() {
+
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void registerSupplier(final String key, final Supplier supplier) {
+        this.supplierMap.put(key, supplier);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <V> Optional<Supplier<V>> getRegisteredSupplier(final String key) {
+        return Optional.ofNullable(this.supplierMap.get(key));
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void registerSupplierIfAbsent(final String key, final Supplier supplier) {
+        if (!this.supplierMap.containsKey(key))
+            this.supplierMap.put(key, supplier);
+    }
+
+    @Override
+    public <S> void setSack(final Supplier<S> initialValue, final Optional<UnaryOperator<S>> splitOperator) {
+        this.sackInitialValue = initialValue;
+        this.sackSplitOperator = splitOperator.orElse(null);
+    }
+
+    @Override
+    public <S> Optional<Supplier<S>> getSackInitialValue() {
+        return Optional.ofNullable(this.sackInitialValue);
+    }
+
+    @Override
+    public <S> Optional<UnaryOperator<S>> getSackSplitOperator() {
+        return Optional.ofNullable(this.sackSplitOperator);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public boolean exists(final String key) {
+        return this.objectMap.containsKey(key) || this.supplierMap.containsKey(key);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void set(final String key, final Object value) {
+        SideEffectHelper.validateSideEffect(key, value);
+        this.objectMap.put(key, value);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <V> V get(final String key) throws IllegalArgumentException {
+        final V value = (V) this.objectMap.get(key);
+        if (null != value)
+            return value;
+        else {
+            if (this.supplierMap.containsKey(key)) {
+                final V v = (V) this.supplierMap.get(key).get();
+                this.objectMap.put(key, v);
+                return v;
+            } else {
+                throw TraversalSideEffects.Exceptions.sideEffectDoesNotExist(key);
+            }
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public <V> V getOrCreate(final String key, final Supplier<V> orCreate) {
+        if (this.objectMap.containsKey(key))
+            return (V) this.objectMap.get(key);
+        else if (this.supplierMap.containsKey(key)) {
+            final V value = (V) this.supplierMap.get(key).get();
+            this.objectMap.put(key, value);
+            return value;
+        } else {
+            final V value = orCreate.get();
+            this.objectMap.put(key, value);
+            return value;
+        }
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void remove(final String key) {
+        this.objectMap.remove(key);
+        this.supplierMap.remove(key);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Set<String> keys() {
+        final Set<String> keys = new HashSet<>();
+        keys.addAll(this.objectMap.keySet());
+        keys.addAll(this.supplierMap.keySet());
+        return Collections.unmodifiableSet(keys);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public void setLocalVertex(final Vertex vertex) {
+        final Property<Map<String, Object>> property = vertex.property(SIDE_EFFECTS);
+        if (property.isPresent()) {
+            this.objectMap = property.value();
+        } else {
+            this.objectMap = new HashMap<>();
+            vertex.property(SIDE_EFFECTS, this.objectMap);
+        }
+    }
+
+    @Override
+    public void mergeInto(final TraversalSideEffects sideEffects) {
+        this.objectMap.forEach(sideEffects::set);
+        this.supplierMap.forEach(sideEffects::registerSupplierIfAbsent);
+        // TODO: add sack information?
+    }
+
+    @Override
+    public String toString() {
+        return StringFactory.traversalSideEffectsString(this);
+    }
+
+    @Override
+    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
+    public DefaultTraversalSideEffects clone() {
+        try {
+            final DefaultTraversalSideEffects sideEffects = (DefaultTraversalSideEffects) super.clone();
+            sideEffects.objectMap = new HashMap<>(this.objectMap);
+            sideEffects.supplierMap = new HashMap<>(this.supplierMap);
+            return sideEffects;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
new file mode 100644
index 0000000..eca4d5d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalStrategies.java
@@ -0,0 +1,105 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Optional;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class DefaultTraversalStrategies implements TraversalStrategies {
+
+    protected List<TraversalStrategy> traversalStrategies = new ArrayList<>();
+    protected TraverserGeneratorFactory traverserGeneratorFactory = DefaultTraverserGeneratorFactory.instance();
+
+    @Override
+    public TraversalStrategies addStrategies(final TraversalStrategy... strategies) {
+        boolean added = false;
+        for (final TraversalStrategy strategy : strategies) {
+            if (!this.traversalStrategies.contains(strategy)) {
+                this.traversalStrategies.add(strategy);
+                added = true;
+            }
+        }
+        if (added) TraversalStrategies.sortStrategies(this.traversalStrategies);
+        return this;
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    public TraversalStrategies removeStrategies(final Class<? extends TraversalStrategy>... strategyClasses) {
+        boolean removed = false;
+        for (final Class<? extends TraversalStrategy> strategyClass : strategyClasses) {
+            final Optional<TraversalStrategy> strategy = this.traversalStrategies.stream().filter(s -> s.getClass().equals(strategyClass)).findAny();
+            if (strategy.isPresent()) {
+                this.traversalStrategies.remove(strategy.get());
+                removed = true;
+            }
+        }
+        if (removed) TraversalStrategies.sortStrategies(this.traversalStrategies);
+        return this;
+    }
+
+    @Override
+    public List<TraversalStrategy> toList() {
+        return Collections.unmodifiableList(this.traversalStrategies);
+    }
+
+    @Override
+    public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
+        this.traversalStrategies.forEach(traversalStrategy -> traversalStrategy.apply(traversal));
+    }
+
+    @Override
+    public TraverserGeneratorFactory getTraverserGeneratorFactory() {
+        return this.traverserGeneratorFactory;
+    }
+
+    @Override
+    public void setTraverserGeneratorFactory(final TraverserGeneratorFactory traverserGeneratorFactory) {
+        this.traverserGeneratorFactory = traverserGeneratorFactory;
+    }
+
+    @Override
+    public DefaultTraversalStrategies clone() {
+        try {
+            final DefaultTraversalStrategies clone = (DefaultTraversalStrategies) super.clone();
+            clone.traversalStrategies = new ArrayList<>();
+            clone.traversalStrategies.addAll(this.traversalStrategies);
+            return clone;
+        } catch (final CloneNotSupportedException e) {
+            throw new IllegalStateException(e.getMessage(), e);
+        }
+    }
+
+    @Override
+    public String toString() {
+        return StringFactory.traversalStrategiesString(this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
new file mode 100644
index 0000000..fd580fe
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
@@ -0,0 +1,59 @@
+/*
+ * 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.util;
+
+/**
+ * This Metrics class handles a metrics chain in which durations are "double counted" by upstream metrics. Durations are
+ * corrected on-the-fly by subtracting upstream durations on every call to stop().
+ *
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public class DependantMutableMetrics extends MutableMetrics {
+    private long prevDur = 0L;
+    private DependantMutableMetrics upStreamMetrics;
+
+    private DependantMutableMetrics() {
+        // necessary for gryo serialization
+        super();
+    }
+
+    public DependantMutableMetrics(final String id, final String name, final DependantMutableMetrics upStreamMetrics) {
+        super(id, name);
+        this.upStreamMetrics = upStreamMetrics;
+    }
+
+    public void start() {
+        super.start();
+    }
+
+    public void stop() {
+        super.stop();
+        // root step will not have an upstream metrics
+        if (upStreamMetrics != null) {
+            // subtract time that is "double counted" by upstream metrics
+            super.durationNs -= upStreamMetrics.getAndResetIncrementalDur();
+        }
+    }
+
+    public long getAndResetIncrementalDur() {
+        long incrementalDur = super.durationNs - prevDur;
+        prevDur = super.durationNs;
+        return incrementalDur;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
index 5d2a6ef..72dbcc3 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversal.java
@@ -18,18 +18,18 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.process.TraverserGenerator;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.TraverserGenerator;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.Collections;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
index d41f12b..e82ac1f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalSideEffects.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 
 import java.util.Collections;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
index 48a4405..c0a9175 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/EmptyTraversalStrategies.java
@@ -18,12 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserGeneratorFactory;
-import org.apache.tinkerpop.gremlin.process.traverser.util.DefaultTraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.DefaultTraverserGeneratorFactory;
 
 import java.util.Collections;
 import java.util.List;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
new file mode 100644
index 0000000..471fc5f
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
@@ -0,0 +1,103 @@
+/*
+ * 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.util;
+
+import java.io.Serializable;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public class ImmutableMetrics implements Metrics, Serializable {
+
+    static final TimeUnit SOURCE_UNIT = TimeUnit.NANOSECONDS;
+
+    protected String id;
+    protected String name;
+    protected Map<String, AtomicLong> counts = new HashMap<>();
+    protected long durationNs = 0l;
+    protected final Map<String, Object> annotations = new HashMap<>();
+    protected final Map<String, ImmutableMetrics> nested = new LinkedHashMap<>();
+
+    protected ImmutableMetrics() {
+    }
+
+    @Override
+    public long getDuration(TimeUnit unit) {
+        return unit.convert(this.durationNs, SOURCE_UNIT);
+    }
+
+    @Override
+    public long getCount(String key) {
+        return counts.get(key).get();
+    }
+
+    @Override
+    public Map<String, Long> getCounts() {
+        Map<String, Long> ret = new HashMap<>();
+        for (Map.Entry<String, AtomicLong> count : counts.entrySet()) {
+            ret.put(count.getKey(), count.getValue().get());
+        }
+        return ret;
+    }
+
+    @Override
+    public String getName() {
+        return name;
+    }
+
+    public String getId() {
+        return id;
+    }
+
+    @Override
+    public Collection<ImmutableMetrics> getNested() {
+        return nested.values();
+    }
+
+    @Override
+    public ImmutableMetrics getNested(String metricsId) {
+        return nested.get(metricsId);
+    }
+
+    @Override
+    public Map<String, Object> getAnnotations() {
+        return annotations;
+    }
+
+    @Override
+    public Object getAnnotation(final String key) {
+        return annotations.get(key);
+    }
+
+    @Override
+    public String toString() {
+        return "ImmutableMetrics{" +
+                "id='" + id + '\'' +
+                ", name='" + name + '\'' +
+                ", counts=" + counts +
+                ", durationNs=" + durationNs +
+                '}';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java
new file mode 100644
index 0000000..6f2c963
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/Metrics.java
@@ -0,0 +1,104 @@
+/*
+ * 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.util;
+
+import java.util.Collection;
+import java.util.Map;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Holds metrics data; typically for .profile()-step analysis. Metrics may be nested. Nesting enables the ability to
+ * capture explicit metrics for multiple distinct operations. Annotations are used to store miscellaneous notes that
+ * might be useful to a developer when examining results, such as index coverage for Steps in a Traversal.
+ *
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public interface Metrics {
+
+
+
+
+    /**
+     * Get the duration of execution time taken.
+     *
+     * @param units
+     * @return
+     */
+    public long getDuration(TimeUnit units);
+
+    /**
+     * Get the count for the corresponding countKey.
+     *
+     * @param countKey key for counter to get.
+     * @return
+     */
+    public long getCount(String countKey);
+
+    /**
+     * Get the map of all counters. This method copies the internal map.
+     *
+     * @return a Map where the key is the counter ID and the value is the counter value.
+     */
+    public Map<String, Long> getCounts();
+
+    /**
+     * Name of this Metrics.
+     *
+     * @return name of this Metrics.
+     */
+    public String getName();
+
+    /**
+     * Id of this Metrics.
+     *
+     * @return id of this Metrics.
+     */
+    public String getId();
+
+
+    /**
+     * Get the nested Metrics objects. Metrics will be ordered in the order they were inserted.
+     *
+     * @return the nested Metrics objects.
+     */
+    public Collection<? extends Metrics> getNested();
+
+    /**
+     * Get a nested Metrics object by Id.
+     *
+     * @param metricsId
+     * @return a nested Metrics object.
+     */
+    Metrics getNested(String metricsId);
+
+    /**
+     * Obtain the annotations for this Metrics. Values may be of type String or Number.
+     *
+     * @return the annotations for this Metrics. Modifications to the returned object are persisted in the original.
+     */
+    public Map<String, Object> getAnnotations();
+
+    /**
+     * Obtain the annotation with the specified key. Values may be of type String or Number.
+     *
+     * @param key key of the annotation to obtain.
+     * @return
+     */
+    public Object getAnnotation(String key);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
new file mode 100644
index 0000000..ec5b19c
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
@@ -0,0 +1,171 @@
+/*
+ * 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.util;
+
+import java.util.Arrays;
+import java.util.List;
+import java.util.Map;
+import java.util.concurrent.atomic.AtomicLong;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public class MutableMetrics extends ImmutableMetrics implements Cloneable {
+
+    // Note: if you add new members then you probably need to add them to the copy constructor;
+
+    private long tempTime = -1l;
+
+    protected MutableMetrics() {
+        // necessary for gryo serialization
+    }
+
+    public MutableMetrics(final String id, final String name) {
+        this.id = id;
+        this.name = name;
+    }
+
+
+    public void addNested(MutableMetrics metrics) {
+        this.nested.put(metrics.getId(), metrics);
+    }
+
+    public void start() {
+        if (-1 != this.tempTime) {
+            throw new IllegalStateException("Internal Error: Concurrent Metrics start. Stop timer before starting timer.");
+        }
+        this.tempTime = System.nanoTime();
+    }
+
+    public void stop() {
+        if (-1 == this.tempTime)
+            throw new IllegalStateException("Internal Error: Metrics has not been started. Start timer before stopping timer");
+        this.durationNs = this.durationNs + (System.nanoTime() - this.tempTime);
+        this.tempTime = -1;
+    }
+
+    public void incrementCount(String key, final long incr) {
+        AtomicLong count = this.counts.get(key);
+        if (count == null) {
+            count = new AtomicLong();
+            this.counts.put(key, count);
+        }
+        count.addAndGet(incr);
+    }
+
+    public void aggregate(MutableMetrics other) {
+        this.durationNs += other.durationNs;
+        for (Map.Entry<String, AtomicLong> otherCount : other.counts.entrySet()) {
+            AtomicLong thisCount = this.counts.get(otherCount.getKey());
+            if (thisCount == null) {
+                thisCount = new AtomicLong(otherCount.getValue().get());
+                this.counts.put(otherCount.getKey(), thisCount);
+            } else {
+                thisCount.addAndGet(otherCount.getValue().get());
+            }
+        }
+
+        // Merge annotations. If multiple values for a given key are found then append it to a comma-separated list.
+        for (Map.Entry<String, Object> p : other.annotations.entrySet()) {
+            if (this.annotations.containsKey(p.getKey())) {
+                // Strings are concatenated
+                Object existingVal = this.annotations.get(p.getKey());
+                if (existingVal instanceof String) {
+                    final List<String> existingValues = Arrays.asList(existingVal.toString().split(","));
+                    if (!existingValues.contains(p.getValue())) {
+                        // New value. Append to comma-separated list.
+                        this.annotations.put(p.getKey(), existingVal.toString() + ',' + p.getValue());
+                    }
+                } else {
+                    // Numbers are summed
+                    Number existingNum = (Number) existingVal;
+                    Number otherNum = (Number) p.getValue();
+                    Number newVal;
+                    if (existingNum instanceof Double || existingNum instanceof Float) {
+                        newVal =
+                                existingNum.doubleValue() + otherNum.doubleValue();
+                    } else {
+                        newVal = existingNum.longValue() + otherNum.longValue();
+                    }
+                    this.annotations.put(p.getKey(), newVal);
+                }
+            } else {
+                this.annotations.put(p.getKey(), p.getValue());
+            }
+        }
+        this.annotations.putAll(other.annotations);
+
+        // Merge nested Metrics
+        other.nested.values().forEach(nested -> {
+            MutableMetrics thisNested = (MutableMetrics) this.nested.get(nested.getId());
+            if (thisNested == null) {
+                thisNested = new MutableMetrics(nested.getId(), nested.getName());
+                this.nested.put(thisNested.getId(), thisNested);
+            }
+            thisNested.aggregate((MutableMetrics) nested);
+        });
+    }
+
+    /**
+     * Set an annotation value. Support exists for Strings and Numbers only. During a merge, Strings are concatenated
+     * into a "," (comma) separated list of distinct values (duplicates are ignored), and Numbers are summed.
+     *
+     * @param key
+     * @param value
+     */
+    public void setAnnotation(String key, Object value) {
+        if (!(value instanceof String) && !(value instanceof Number)) {
+            throw new IllegalArgumentException("Metrics annotations only support String and Number values.");
+        }
+        annotations.put(key, value);
+    }
+
+    @Override
+    public MutableMetrics getNested(String metricsId) {
+        return (MutableMetrics) nested.get(metricsId);
+    }
+
+    public ImmutableMetrics getImmutableClone() {
+        final ImmutableMetrics clone = new ImmutableMetrics();
+        copyMembers(clone);
+        this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).getImmutableClone()));
+        return clone;
+    }
+
+    private void copyMembers(final ImmutableMetrics clone) {
+        clone.id = this.id;
+        clone.name = this.name;
+        clone.durationNs = this.durationNs;
+        for (Map.Entry<String, AtomicLong> c : this.counts.entrySet()) {
+            clone.counts.put(c.getKey(), new AtomicLong(c.getValue().get()));
+        }
+        for (Map.Entry<String, Object> a : this.annotations.entrySet()) {
+            clone.annotations.put(a.getKey(), a.getValue());
+        }
+    }
+
+    @Override
+    public MutableMetrics clone() {
+        final MutableMetrics clone = new MutableMetrics();
+        copyMembers(clone);
+        this.nested.values().forEach(nested -> clone.nested.put(nested.id, ((MutableMetrics) nested).clone()));
+        return clone;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
index f35a8f6..36b88af 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/SideEffectHelper.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.TraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
new file mode 100644
index 0000000..8ea8d6d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
@@ -0,0 +1,204 @@
+/*
+ * 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.util;
+
+import org.apache.commons.lang.StringUtils;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class StandardTraversalMetrics implements TraversalMetrics, Serializable {
+    // toString() specific headers
+    private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
+
+    private boolean dirty = true;
+    private final Map<String, MutableMetrics> metrics = new HashMap<>();
+    private final Map<String, MutableMetrics> allMetrics = new HashMap<>();
+    private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
+
+    /*
+    The following are computed values upon the completion of profiling in order to report the results back to the user
+     */
+    private long totalStepDuration;
+    private Map<String, ImmutableMetrics> computedMetrics;
+
+    public StandardTraversalMetrics() {
+    }
+
+    public void start(final String metricsId) {
+        dirty = true;
+        if (allMetrics.get(metricsId) == null) {
+            System.out.println();
+        }
+        allMetrics.get(metricsId).start();
+    }
+
+    public void stop(final String metricsId) {
+        dirty = true;
+        allMetrics.get(metricsId).stop();
+    }
+
+    public void finish(final String metricsId, final long bulk) {
+        dirty = true;
+        final MutableMetrics metrics = allMetrics.get(metricsId);
+        metrics.stop();
+        metrics.incrementCount(TRAVERSER_COUNT_ID, 1);
+        metrics.incrementCount(ELEMENT_COUNT_ID, bulk);
+    }
+
+    @Override
+    public long getDuration(final TimeUnit unit) {
+        computeTotals();
+        return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
+    }
+
+    @Override
+    public Metrics getMetrics(final int index) {
+        computeTotals();
+        // adjust index to account for the injected profile steps
+        return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
+    }
+
+    @Override
+    public Metrics getMetrics(final String id) {
+        computeTotals();
+        return computedMetrics.get(id);
+    }
+
+    @Override
+    public Collection<ImmutableMetrics> getMetrics() {
+        computeTotals();
+        return computedMetrics.values();
+    }
+
+    @Override
+    public String toString() {
+        computeTotals();
+
+        // Build a pretty table of metrics data.
+
+        // Append headers
+        final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
+                .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
+
+        sb.append("\n=============================================================================================================");
+
+        appendMetrics(computedMetrics.values(), sb, 0);
+
+        // Append total duration
+        sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
+                ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
+
+        return sb.toString();
+    }
+
+    private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
+        // Append each StepMetric's row. indexToLabelMap values are ordered by index.
+        for (Metrics m : metrics) {
+            String rowName = m.getName();
+            for (int ii = 0; ii < indent; ii++) {
+                rowName = "  " + rowName;
+            }
+            rowName = StringUtils.abbreviate(rowName, 50);
+            final long itemCount = m.getCount(ELEMENT_COUNT_ID);
+            final long traverserCount = m.getCount(TRAVERSER_COUNT_ID);
+
+            Double percentDur = (Double) m.getAnnotation(PERCENT_DURATION_KEY);
+            if (percentDur != null) {
+                sb.append(String.format("%n%-50s %21d %11d %15.3f %8.2f",
+                        rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0, percentDur));
+            } else {
+                sb.append(String.format("%n%-50s %21d %11d %15.3f",
+                        rowName, itemCount, traverserCount, m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
+            }
+            appendMetrics(m.getNested(), sb, indent + 1);
+        }
+    }
+
+    private void computeTotals() {
+        if (!dirty) {
+            // already good to go
+            return;
+        }
+
+        // Create temp list of ordered metrics
+        List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
+        for (String label : indexToLabelMap.values()) {
+            // The indexToLabelMap is sorted by index (key)
+            tempMetrics.add(metrics.get(label).clone());
+        }
+
+        // Calculate total duration
+        this.totalStepDuration = 0;
+        tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
+
+        // Assign %'s
+        tempMetrics.forEach(m -> {
+            double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
+            m.setAnnotation(PERCENT_DURATION_KEY, dur);
+        });
+
+        // Store immutable instances of the calculated metrics
+        computedMetrics = new LinkedHashMap<>(metrics.size());
+        tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
+
+        dirty = false;
+    }
+
+    public static StandardTraversalMetrics merge(final Iterator<StandardTraversalMetrics> toMerge) {
+        final StandardTraversalMetrics newTraversalMetrics = new StandardTraversalMetrics();
+
+        // iterate the incoming TraversalMetrics
+        toMerge.forEachRemaining(inTraversalMetrics -> {
+            // aggregate the internal Metrics
+            inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
+
+                MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
+                if (null == aggregateMetrics) {
+                    // need to create a Metrics to aggregate into
+                    aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
+
+                    newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
+                    // Set the index of the Metrics
+                    for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
+                        if (metricsId.equals(entry.getValue())) {
+                            newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
+                            break;
+                        }
+                    }
+                }
+                aggregateMetrics.aggregate(toAggregate);
+            });
+        });
+        return newTraversalMetrics;
+    }
+
+    public void addMetrics(final MutableMetrics newMetrics, final String id, final int index, final boolean isTopLevel, final String profileStepId) {
+        if (isTopLevel) {
+            // The index is necessary to ensure that step order is preserved after a merge.
+            indexToLabelMap.put(index, id);
+            metrics.put(id, newMetrics);
+        }
+        allMetrics.put(profileStepId, newMetrics);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java
new file mode 100644
index 0000000..4438543
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StepPosition.java
@@ -0,0 +1,57 @@
+/*
+ * 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.util;
+
+import java.io.Serializable;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class StepPosition implements Serializable {
+
+    public int x; // step in traversal length
+    public int y; // depth in traversal nested tree
+    public int z; // breadth in traversal siblings
+    public String parentId; // the traversal holder id
+
+    private static final String DOT = ".";
+    private static final String LEFT_PARENTHESES = "(";
+    private static final String RIGHT_PARENTHESES = ")";
+    private static final String EMPTY_STRING = "";
+
+    private StepPosition(final int x, final int y, final int z, final String parentId) {
+        this.x = x;
+        this.y = y;
+        this.z = z;
+        this.parentId = parentId;
+    }
+
+    public StepPosition() {
+        this(0, 0, 0, EMPTY_STRING);
+    }
+
+    public String nextXId() {
+        return this.x++ + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
+    }
+
+    @Override
+    public String toString() {
+        return this.x + DOT + this.y + DOT + this.z + LEFT_PARENTHESES + this.parentId + RIGHT_PARENTHESES;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index 4e71c7e..0ffe53f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -18,17 +18,14 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.EdgeVertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.PropertiesStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.StepPosition;
-import org.apache.tinkerpop.gremlin.process.traversal.step.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.util.BulkSet;
-import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 
 import java.util.ArrayList;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
new file mode 100644
index 0000000..36a105a
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMatrix.java
@@ -0,0 +1,66 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * A TraversalMatrix provides random, non-linear access to the steps of a traversal by their step id.
+ * This is useful in situations where traversers becomes detached from their traversal (and step) and later need to be re-attached.
+ * A classic use case is {@link org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram} on {@link org.apache.tinkerpop.gremlin.process.computer.GraphComputer}.
+ *
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class TraversalMatrix<S, E> {
+
+    private final Map<String, Step<?, ?>> matrix = new HashMap<>();
+    private final Traversal.Admin<S, E> traversal;
+
+    public TraversalMatrix(final Traversal.Admin<S, E> traversal) {
+        this.harvestSteps(this.traversal = traversal);
+    }
+
+    public <A, B, C extends Step<A, B>> C getStepById(final String stepId) {
+        return (C) this.matrix.get(stepId);
+    }
+
+    public Traversal.Admin<S, E> getTraversal() {
+        return this.traversal;
+    }
+
+    private final void harvestSteps(final Traversal.Admin<?, ?> traversal) {
+        for (final Step<?, ?> step : traversal.getSteps()) {
+            this.matrix.put(step.getId(), step);
+            if (step instanceof TraversalParent) {
+                for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
+                    this.harvestSteps(globalChild);
+                }
+                /*for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+                    this.harvestSteps(localChild);
+                }*/
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
new file mode 100644
index 0000000..b2c70cf
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
@@ -0,0 +1,77 @@
+/*
+ * 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.util;
+
+import org.apache.tinkerpop.gremlin.structure.Graph;
+
+import java.util.Collection;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * Contains the Metrics gathered for a Traversal as the result of the .profile()-step.
+ *
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public interface TraversalMetrics {
+    /**
+     * The side-effect key used to store and retrieve the TraversalMetrics for a given Traversal.
+     */
+    public static final String METRICS_KEY = Graph.Hidden.hide("metrics");
+
+    /**
+     * The MetricsId used to obtain the element count via Metrics.getCount(String countKey)
+     */
+    public static final String ELEMENT_COUNT_ID = "elementCount";
+
+    /**
+     * The MetricsId used to obtain the traverser count via Metrics.getCount(String countKey)
+     */
+    public static final String TRAVERSER_COUNT_ID = "traverserCount";
+
+    /**
+     * The annotation key used to obtain the percent duration via Metrics.getAnnotation(String key)
+     */
+    public static final String PERCENT_DURATION_KEY = "percentDur";
+
+    /**
+     * Get the total duration taken by the Traversal.
+     *
+     * @param unit
+     * @return total duration taken by the Traversal.
+     */
+    public long getDuration(TimeUnit unit);
+
+    /**
+     * Get an individual Metrics object by the index of the profiled Step.
+     *
+     * @param stepIndex
+     * @return an individual Metrics object.
+     */
+    public Metrics getMetrics(final int stepIndex);
+
+    /**
+     * Get an individual Metrics object by the id of the profiled Step.
+     *
+     * @param id
+     * @return an individual Metrics object.
+     */
+    public Metrics getMetrics(final String id);
+
+    public Collection<? extends Metrics> getMetrics();
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
index 43abc0e..2d16fab 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalRing.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
 
 import java.io.Serializable;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
index 7c3d74e..98b3b9f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalUtil.java
@@ -18,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 
 import java.util.NoSuchElementException;
 


[29/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java
deleted file mode 100644
index 36db578..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/AbstractStep.java
+++ /dev/null
@@ -1,183 +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 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.traversal.util.TraversalHelper;
-
-import java.util.Iterator;
-import java.util.NoSuchElementException;
-import java.util.Objects;
-import java.util.Optional;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class AbstractStep<S, E> implements Step<S, E> {
-
-    protected String label = null;
-    protected String id = Traverser.Admin.HALT;
-    protected Traversal.Admin traversal;
-    protected ExpandableStepIterator<S> starts;
-    protected Traverser<E> nextEnd = null;
-    protected boolean traverserStepIdSetByChild = false; // TODO: Step.teleport(traverser, step)
-
-    protected Step<?, S> previousStep = EmptyStep.instance();
-    protected Step<E, ?> nextStep = EmptyStep.instance();
-
-    public AbstractStep(final Traversal.Admin traversal) {
-        this.traversal = traversal;
-        this.starts = new ExpandableStepIterator<S>((Step) this);
-    }
-
-    @Override
-    public void setId(final String id) {
-        Objects.nonNull(id);
-        this.id = id;
-    }
-
-    @Override
-    public String getId() {
-        return this.id;
-    }
-
-    @Override
-    public void setLabel(final String label) {
-        Objects.nonNull(label);
-        this.label = label;
-    }
-
-    @Override
-    public Optional<String> getLabel() {
-        return Optional.ofNullable(this.label);
-    }
-
-    @Override
-    public void reset() {
-        this.starts.clear();
-        this.nextEnd = null;
-    }
-
-    @Override
-    public void addStarts(final Iterator<Traverser<S>> starts) {
-        this.starts.add((Iterator) starts);
-    }
-
-    @Override
-    public void addStart(final Traverser<S> start) {
-        this.starts.add((Traverser.Admin<S>) start);
-    }
-
-    @Override
-    public void setPreviousStep(final Step<?, S> step) {
-        this.previousStep = step;
-    }
-
-    @Override
-    public Step<?, S> getPreviousStep() {
-        return this.previousStep;
-    }
-
-    @Override
-    public void setNextStep(final Step<E, ?> step) {
-        this.nextStep = step;
-    }
-
-    @Override
-    public Step<E, ?> getNextStep() {
-        return this.nextStep;
-    }
-
-    @Override
-    public Traverser<E> next() {
-        if (null != this.nextEnd) {
-            try {
-                return this.prepareTraversalForNextStep(this.nextEnd);
-            } finally {
-                this.nextEnd = null;
-            }
-        } else {
-            while (true) {
-                final Traverser<E> traverser = this.processNextStart();
-                if (0 != traverser.bulk()) {
-                    return this.prepareTraversalForNextStep(traverser);
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        if (null != this.nextEnd)
-            return true;
-        else {
-            try {
-                while (true) {
-                    this.nextEnd = this.processNextStart();
-                    if (0 != this.nextEnd.bulk())
-                        return true;
-                    else
-                        this.nextEnd = null;
-                }
-            } catch (final NoSuchElementException e) {
-                return false;
-            }
-        }
-    }
-
-    @Override
-    public <A, B> Traversal.Admin<A, B> getTraversal() {
-        return this.traversal;
-    }
-
-    @Override
-    public void setTraversal(final Traversal.Admin<?, ?> traversal) {
-        this.traversal = traversal;
-    }
-
-    protected abstract Traverser<E> processNextStart() throws NoSuchElementException;
-
-    public String toString() {
-        return TraversalHelper.makeStepString(this);
-    }
-
-    @Override
-    @SuppressWarnings("CloneDoesntDeclareCloneNotSupportedException")
-    public AbstractStep<S, E> clone() {
-        try {
-            final AbstractStep clone = (AbstractStep) super.clone();
-            clone.starts = new ExpandableStepIterator<S>(clone);
-            clone.previousStep = EmptyStep.instance();
-            clone.nextStep = EmptyStep.instance();
-            clone.nextEnd = null;
-            return clone;
-        } catch (CloneNotSupportedException e) {
-            throw new IllegalStateException(e.getMessage(), e);
-        }
-    }
-
-    private final Traverser<E> prepareTraversalForNextStep(final Traverser<E> traverser) {
-        if (!this.traverserStepIdSetByChild) ((Traverser.Admin<E>) traverser).setStepId(this.nextStep.getId());
-        if (null != this.label) traverser.path().addLabel(this.label);
-        return traverser;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java
new file mode 100644
index 0000000..e8a7141
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ComparatorHolder.java
@@ -0,0 +1,33 @@
+/*
+ * 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.util.Comparator;
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface ComparatorHolder<S> {
+
+    public void addComparator(final Comparator<S> comparator);
+
+    public List<Comparator<S>> getComparators();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
deleted file mode 100644
index c6a6702..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementFunctionComparator.java
+++ /dev/null
@@ -1,57 +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 org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.io.Serializable;
-import java.util.Comparator;
-import java.util.function.Function;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ElementFunctionComparator<V> implements Comparator<Element>, Serializable {
-
-    private final Function<Element, V> elementFunction;
-    private final Comparator<V> valueComparator;
-
-    public ElementFunctionComparator(final Function<Element, V> elementFunction, final Comparator<V> valueComparator) {
-        this.elementFunction = elementFunction;
-        this.valueComparator = valueComparator;
-    }
-
-    public Function<Element, V> getElementFunction() {
-        return this.elementFunction;
-    }
-
-    public Comparator<V> getValueComparator() {
-        return this.valueComparator;
-    }
-
-    @Override
-    public int compare(final Element elementA, final Element elementB) {
-        return this.valueComparator.compare(this.elementFunction.apply(elementA), this.elementFunction.apply(elementB));
-    }
-
-    @Override
-    public String toString() {
-        return this.valueComparator.toString() + "(" + this.elementFunction + ')';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
deleted file mode 100644
index 1062b9b..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ElementValueComparator.java
+++ /dev/null
@@ -1,56 +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 org.apache.tinkerpop.gremlin.structure.Element;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ElementValueComparator<V> implements Comparator<Element>, Serializable {
-
-    private final String propertyKey;
-    private final Comparator<V> valueComparator;
-
-    public ElementValueComparator(final String propertyKey, final Comparator<V> valueComparator) {
-        this.propertyKey = propertyKey;
-        this.valueComparator = valueComparator;
-    }
-
-    public String getPropertyKey() {
-        return this.propertyKey;
-    }
-
-    public Comparator<V> getValueComparator() {
-        return this.valueComparator;
-    }
-
-    @Override
-    public int compare(final Element elementA, final Element elementB) {
-        return this.valueComparator.compare(elementA.value(this.propertyKey), elementB.value(this.propertyKey));
-    }
-
-    @Override
-    public String toString() {
-        return this.valueComparator.toString() + '(' + this.propertyKey + ')';
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java
deleted file mode 100644
index 3a3e9ed..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EmptyStep.java
+++ /dev/null
@@ -1,142 +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 org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
-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.traversal.util.EmptyTraversal;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
-
-import java.util.Collections;
-import java.util.Iterator;
-import java.util.Optional;
-import java.util.Set;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class EmptyStep<S, E> implements Step<S, E>, TraversalParent {
-
-    private static final EmptyStep INSTANCE = new EmptyStep<>();
-
-    public static <S, E> Step<S, E> instance() {
-        return INSTANCE;
-    }
-
-    private EmptyStep() {
-    }
-
-    @Override
-    public void addStarts(final Iterator<Traverser<S>> starts) {
-
-    }
-
-    @Override
-    public void addStart(final Traverser<S> start) {
-
-    }
-
-    @Override
-    public void setPreviousStep(final Step<?, S> step) {
-
-    }
-
-    @Override
-    public void reset() {
-
-    }
-
-    @Override
-    public Step<?, S> getPreviousStep() {
-        return INSTANCE;
-    }
-
-    @Override
-    public void setNextStep(final Step<E, ?> step) {
-
-    }
-
-    @Override
-    public Step<E, ?> getNextStep() {
-        return INSTANCE;
-    }
-
-    @Override
-    public <A, B> Traversal.Admin<A, B> getTraversal() {
-        return EmptyTraversal.instance();
-    }
-
-    @Override
-    public void setTraversal(final Traversal.Admin<?, ?> traversal) {
-
-    }
-
-    @Override
-    @SuppressWarnings("CloneDoesntCallSuperClone")
-    public EmptyStep<S, E> clone() {
-        return INSTANCE;
-    }
-
-    @Override
-    public Optional<String> getLabel() {
-        return Optional.empty();
-    }
-
-    @Override
-    public void setLabel(final String label) {
-
-    }
-
-    @Override
-    public void setId(final String id) {
-
-    }
-
-    @Override
-    public String getId() {
-        return Traverser.Admin.HALT;
-    }
-
-    @Override
-    public boolean hasNext() {
-        return false;
-    }
-
-    @Override
-    public Traverser<E> next() {
-        throw FastNoSuchElementException.instance();
-    }
-
-    @Override
-    public int hashCode() {
-        return -1691648095;
-    }
-
-    @Override
-    public boolean equals(final Object object) {
-        return object instanceof EmptyStep;
-    }
-
-    @Override
-    public Set<TraverserRequirement> getRequirements() {
-        return Collections.emptySet();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java
index 7853fa7..cb1aeec 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/EngineDependent.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step;
 
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java
deleted file mode 100644
index 19ba213..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/ExpandableStepIterator.java
+++ /dev/null
@@ -1,77 +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 org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traverser;
-import org.apache.tinkerpop.gremlin.util.iterator.MultiIterator;
-import org.apache.tinkerpop.gremlin.process.util.TraverserSet;
-
-import java.io.Serializable;
-import java.util.Iterator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class ExpandableStepIterator<E> implements Iterator<Traverser.Admin<E>>, Serializable {
-
-    private final TraverserSet<E> traverserSet = new TraverserSet<>();
-    private final MultiIterator<Traverser.Admin<E>> traverserIterators = new MultiIterator<>();
-    private final Step<?, E> hostStep;
-
-    public ExpandableStepIterator(final Step<?, E> hostStep) {
-        this.hostStep = hostStep;
-    }
-
-    @Override
-    public boolean hasNext() {
-        return !this.traverserSet.isEmpty() || this.hostStep.getPreviousStep().hasNext() || this.traverserIterators.hasNext();
-    }
-
-    @Override
-    public Traverser.Admin<E> next() {
-        if (!this.traverserSet.isEmpty())
-            return this.traverserSet.remove();
-        if (this.traverserIterators.hasNext())
-            return this.traverserIterators.next();
-        /////////////
-        if (this.hostStep.getPreviousStep().hasNext())
-            return (Traverser.Admin<E>) this.hostStep.getPreviousStep().next();
-        /////////////
-        return this.traverserSet.remove();
-    }
-
-    public void add(final Iterator<Traverser.Admin<E>> iterator) {
-        this.traverserIterators.addIterator(iterator);
-    }
-
-    public void add(final Traverser.Admin<E> traverser) {
-        this.traverserSet.add(traverser);
-    }
-
-    @Override
-    public String toString() {
-        return this.traverserSet.toString();
-    }
-
-    public void clear() {
-        this.traverserIterators.clear();
-        this.traverserSet.clear();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
new file mode 100644
index 0000000..cd7f493
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/HasContainerHolder.java
@@ -0,0 +1,33 @@
+/*
+ * 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 org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+
+import java.util.List;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface HasContainerHolder {
+
+    public List<HasContainer> getHasContainers();
+
+    public void addHasContainer(final HasContainer hasContainer);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java
new file mode 100644
index 0000000..13ce032
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Mutating.java
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+/**
+ * A marker interface for steps that modify the graph.
+ *
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public interface Mutating {
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java
new file mode 100644
index 0000000..db205b6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Ranging.java
@@ -0,0 +1,30 @@
+/*
+ * 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;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface Ranging {
+
+    public long getLowRange();
+
+    public long getHighRange();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java
new file mode 100644
index 0000000..786e161
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/SideEffectCapable.java
@@ -0,0 +1,28 @@
+/*
+ * 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;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface SideEffectCapable {
+
+    public String getSideEffectKey();
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
deleted file mode 100644
index df1ce3a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalComparator.java
+++ /dev/null
@@ -1,57 +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 org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
-
-import java.io.Serializable;
-import java.util.Comparator;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class TraversalComparator<S, E> implements Comparator<S>, Serializable, Cloneable {
-
-    private Traversal.Admin<S, E> traversal;
-    private final Comparator<E> comparator;
-
-    public TraversalComparator(final Traversal.Admin<S, E> traversal, final Comparator<E> comparator) {
-        this.traversal = traversal;
-        this.comparator = comparator;
-    }
-
-    @Override
-    public String toString() {
-        return this.comparator.toString() + "(" + this.traversal + ")";
-    }
-
-    @Override
-    public int compare(final S start1, final S start2) {
-        return this.comparator.compare(TraversalUtil.apply(start1, this.traversal), TraversalUtil.apply(start2, this.traversal));
-    }
-
-    @Override
-    public TraversalComparator clone() throws CloneNotSupportedException {
-        final TraversalComparator clone = (TraversalComparator) super.clone();
-        clone.traversal = this.traversal.clone();
-        return clone;
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java
new file mode 100644
index 0000000..6eb60a2
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalOptionParent.java
@@ -0,0 +1,31 @@
+/*
+ * 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 org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public interface TraversalOptionParent<M, S, E> extends TraversalParent {
+
+    public static enum Pick {any, none}
+
+    public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption);
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
index 2a24ad2..bd8ee99 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
@@ -18,9 +18,9 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step;
 
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 
 import java.util.Collections;
 import java.util.EnumSet;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
new file mode 100644
index 0000000..f49103d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/BranchStep.java
@@ -0,0 +1,166 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class BranchStep<S, E, M> extends ComputerAwareStep<S, E> implements TraversalOptionParent<M, S, E> {
+
+    protected Traversal.Admin<S, M> branchTraversal;
+    protected Map<M, List<Traversal.Admin<S, E>>> traversalOptions = new HashMap<>();
+    private boolean first = true;
+
+    public BranchStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    public void setBranchTraversal(final Traversal.Admin<S, M> branchTraversal) {
+        this.branchTraversal = this.integrateChild(branchTraversal);
+    }
+
+    @Override
+    public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
+        if (this.traversalOptions.containsKey(pickToken))
+            this.traversalOptions.get(pickToken).add(traversalOption);
+        else
+            this.traversalOptions.put(pickToken, new ArrayList<>(Collections.singletonList(traversalOption)));
+        traversalOption.addStep(new EndStep(traversalOption));
+        this.integrateChild(traversalOption);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements();
+    }
+
+    @Override
+    public List<Traversal.Admin<S, E>> getGlobalChildren() {
+        return Collections.unmodifiableList(this.traversalOptions.values().stream()
+                .flatMap(list -> list.stream())
+                .collect(Collectors.toList()));
+    }
+
+    @Override
+    public List<Traversal.Admin<S, M>> getLocalChildren() {
+        return Collections.singletonList(this.branchTraversal);
+    }
+
+    @Override
+    protected Iterator<Traverser<E>> standardAlgorithm() {
+        while (true) {
+            if (!this.first) {
+                for (final List<Traversal.Admin<S, E>> options : this.traversalOptions.values()) {
+                    for (final Traversal.Admin<S, E> option : options) {
+                        if (option.hasNext())
+                            return option.getEndStep();
+                    }
+                }
+            }
+            this.first = false;
+            ///
+            final Traverser.Admin<S> start = this.starts.next();
+            final M choice = TraversalUtil.apply(start, this.branchTraversal);
+            final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
+            if (null != branch) {
+                branch.forEach(traversal -> {
+                    traversal.reset();
+                    traversal.addStart(start.split());
+                });
+            }
+            if (choice != Pick.any) {
+                final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
+                if (null != anyBranch)
+                    anyBranch.forEach(traversal -> {
+                        traversal.reset();
+                        traversal.addStart(start.split());
+                    });
+            }
+        }
+    }
+
+    @Override
+    protected Iterator<Traverser<E>> computerAlgorithm() {
+        final List<Traverser<E>> ends = new ArrayList<>();
+        final Traverser.Admin<S> start = this.starts.next();
+        final M choice = TraversalUtil.apply(start, this.branchTraversal);
+        final List<Traversal.Admin<S, E>> branch = this.traversalOptions.containsKey(choice) ? this.traversalOptions.get(choice) : this.traversalOptions.get(Pick.none);
+        if (null != branch) {
+            branch.forEach(traversal -> {
+                final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
+                split.setStepId(traversal.getStartStep().getId());
+                ends.add(split);
+            });
+        }
+        if (choice != Pick.any) {
+            final List<Traversal.Admin<S, E>> anyBranch = this.traversalOptions.get(Pick.any);
+            if (null != anyBranch) {
+                anyBranch.forEach(traversal -> {
+                    final Traverser.Admin<E> split = (Traverser.Admin<E>) start.split();
+                    split.setStepId(traversal.getStartStep().getId());
+                    ends.add(split);
+                });
+            }
+        }
+        return ends.iterator();
+    }
+
+    @Override
+    public BranchStep<S, E, M> clone() {
+        final BranchStep<S, E, M> clone = (BranchStep<S, E, M>) super.clone();
+        clone.traversalOptions = new HashMap<>(this.traversalOptions.size());
+        for (final Map.Entry<M, List<Traversal.Admin<S, E>>> entry : this.traversalOptions.entrySet()) {
+            final List<Traversal.Admin<S, E>> traversals = entry.getValue();
+            if (traversals.size() > 0) {
+                final List<Traversal.Admin<S, E>> clonedTraversals = clone.traversalOptions.compute(entry.getKey(), (k, v) ->
+                        (v == null) ? new ArrayList<>(traversals.size()) : v);
+                for (final Traversal.Admin<S, E> traversal : traversals) {
+                    final Traversal.Admin<S, E> clonedTraversal = traversal.clone();
+                    clonedTraversals.add(clonedTraversal);
+                    clone.integrateChild(clonedTraversal);
+                }
+            }
+        }
+        clone.branchTraversal = this.branchTraversal.clone();
+        clone.integrateChild(clone.branchTraversal);
+        return clone;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.branchTraversal, this.traversalOptions);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.first = true;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
new file mode 100644
index 0000000..09af7e2
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/ChooseStep.java
@@ -0,0 +1,51 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.HasNextTraversal;
+
+/**
+ * A step which offers a choice of two or more Traversals to take.
+ *
+ * @author Joshua Shinavier (http://fortytwo.net)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ChooseStep<S, E, M> extends BranchStep<S, E, M> {
+
+    public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, M> choiceTraversal) {
+        super(traversal);
+        this.setBranchTraversal(choiceTraversal);
+    }
+
+    public ChooseStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> predicateTraversal, final Traversal.Admin<S, E> trueChoice, final Traversal.Admin<S, E> falseChoice) {
+        this(traversal, new HasNextTraversal(predicateTraversal));
+        this.addGlobalChildOption((M) Boolean.TRUE, trueChoice);
+        this.addGlobalChildOption((M) Boolean.FALSE, falseChoice);
+    }
+
+    @Override
+    public void addGlobalChildOption(final M pickToken, final Traversal.Admin<S, E> traversalOption) {
+        if (Pick.any.equals(pickToken))
+            throw new IllegalArgumentException("Choose step can not have an any-option as only one option per traverser is allowed");
+        if (this.traversalOptions.containsKey(pickToken))
+            throw new IllegalArgumentException("Choose step can only have one traversal per pick token: " + pickToken);
+        super.addGlobalChildOption(pickToken, traversalOption);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
new file mode 100644
index 0000000..2e5ba18
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalStep.java
@@ -0,0 +1,87 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class LocalStep<S, E> extends AbstractStep<S, E> implements TraversalParent {
+
+    private Traversal.Admin<S, E> localTraversal;
+    private boolean first = true;
+
+    public LocalStep(final Traversal.Admin traversal, final Traversal.Admin<S, E> localTraversal) {
+        super(traversal);
+        this.localTraversal = this.integrateChild(localTraversal);
+    }
+
+    @Override
+    public LocalStep<S, E> clone() {
+        final LocalStep<S, E> clone = (LocalStep<S, E>) super.clone();
+        clone.localTraversal = clone.integrateChild(this.localTraversal.clone());
+        clone.first = true;
+        return clone;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.localTraversal);
+    }
+
+    @Override
+    public List<Traversal.Admin<S, E>> getLocalChildren() {
+        return Collections.singletonList(this.localTraversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.localTraversal.getTraverserRequirements();
+    }
+
+    @Override
+    protected Traverser<E> processNextStart() throws NoSuchElementException {
+        if (this.first) {
+            this.first = false;
+            this.localTraversal.addStart(this.starts.next());
+        }
+        while (true) {
+            if (this.localTraversal.hasNext())
+                return this.localTraversal.getEndStep().next();
+            else if (this.starts.hasNext()) {
+                this.localTraversal.reset();
+                this.localTraversal.addStart(this.starts.next());
+            } else {
+                throw FastNoSuchElementException.instance();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
new file mode 100644
index 0000000..3dc2941
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
@@ -0,0 +1,263 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class RepeatStep<S> extends ComputerAwareStep<S, S> implements TraversalParent {
+
+    private Traversal.Admin<S, S> repeatTraversal = null;
+    private Traversal.Admin<S, ?> untilTraversal = null;
+    private Traversal.Admin<S, ?> emitTraversal = null;
+    public boolean untilFirst = false;
+    public boolean emitFirst = false;
+
+    public RepeatStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        final Set<TraverserRequirement> requirements = this.getSelfAndChildRequirements(TraverserRequirement.BULK);
+        if (requirements.contains(TraverserRequirement.SINGLE_LOOP))
+            requirements.add(TraverserRequirement.NESTED_LOOP);
+        requirements.add(TraverserRequirement.SINGLE_LOOP);
+        return requirements;
+    }
+
+    @SuppressWarnings("unchecked")
+    public void setRepeatTraversal(final Traversal.Admin<S, S> repeatTraversal) {
+        this.repeatTraversal = repeatTraversal; // .clone();
+        this.repeatTraversal.addStep(new RepeatEndStep(this.repeatTraversal));
+        this.integrateChild(this.repeatTraversal);
+    }
+
+    public void setUntilTraversal(final Traversal.Admin<S, ?> untilTraversal) {
+        if (null == this.repeatTraversal) this.untilFirst = true;
+        this.untilTraversal = this.integrateChild(untilTraversal);
+    }
+
+    public void setEmitTraversal(final Traversal.Admin<S, ?> emitTraversal) {
+        if (null == this.repeatTraversal) this.emitFirst = true;
+        this.emitTraversal = this.integrateChild(emitTraversal);
+    }
+
+    public List<Traversal.Admin<S, S>> getGlobalChildren() {
+        return null == this.repeatTraversal ? Collections.emptyList() : Collections.singletonList(this.repeatTraversal);
+    }
+
+    public List<Traversal.Admin<S, ?>> getLocalChildren() {
+        final List<Traversal.Admin<S, ?>> list = new ArrayList<>();
+        if (null != this.untilTraversal)
+            list.add(this.untilTraversal);
+        if (null != this.emitTraversal)
+            list.add(this.emitTraversal);
+        return list;
+    }
+
+    public final boolean doUntil(final Traverser.Admin<S> traverser, boolean utilFirst) {
+        return utilFirst == this.untilFirst && null != this.untilTraversal && TraversalUtil.test(traverser, this.untilTraversal);
+    }
+
+    public final boolean doEmit(final Traverser.Admin<S> traverser, boolean emitFirst) {
+        return emitFirst == this.emitFirst && null != this.emitTraversal && TraversalUtil.test(traverser, this.emitTraversal);
+    }
+
+    @Override
+    public String toString() {
+        if (this.untilFirst && this.emitFirst)
+            return TraversalHelper.makeStepString(this, untilString(), emitString(), this.repeatTraversal);
+        else if (this.emitFirst)
+            return TraversalHelper.makeStepString(this, emitString(), this.repeatTraversal, untilString());
+        else if (this.untilFirst)
+            return TraversalHelper.makeStepString(this, untilString(), this.repeatTraversal, emitString());
+        else
+            return TraversalHelper.makeStepString(this, this.repeatTraversal, untilString(), emitString());
+    }
+
+    private final String untilString() {
+        return null == this.untilTraversal ? "until(false)" : "until(" + this.untilTraversal + ')';
+    }
+
+    private final String emitString() {
+        return null == this.emitTraversal ? "emit(false)" : "emit(" + this.emitTraversal + ')';
+    }
+
+    /////////////////////////
+
+    @Override
+    public RepeatStep<S> clone() {
+        final RepeatStep<S> clone = (RepeatStep<S>) super.clone();
+        clone.repeatTraversal = clone.integrateChild(this.repeatTraversal.clone());
+        if (null != this.untilTraversal)
+            clone.untilTraversal = clone.integrateChild(this.untilTraversal.clone());
+        if (null != this.emitTraversal)
+            clone.emitTraversal = clone.integrateChild(this.emitTraversal.clone());
+        return clone;
+    }
+
+    @Override
+    protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
+        while (true) {
+            if (this.repeatTraversal.getEndStep().hasNext()) {
+                return this.repeatTraversal.getEndStep();
+            } else {
+                final Traverser.Admin<S> start = this.starts.next();
+                if (doUntil(start, true)) {
+                    start.resetLoops();
+                    return IteratorUtils.of(start);
+                }
+                this.repeatTraversal.addStart(start);
+                if (doEmit(start, true)) {
+                    final Traverser.Admin<S> emitSplit = start.split();
+                    emitSplit.resetLoops();
+                    return IteratorUtils.of(emitSplit);
+                }
+            }
+        }
+    }
+
+    @Override
+    protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
+        final Traverser.Admin<S> start = this.starts.next();
+        if (doUntil(start, true)) {
+            start.resetLoops();
+            start.setStepId(this.getNextStep().getId());
+            return IteratorUtils.of(start);
+        } else {
+            start.setStepId(this.repeatTraversal.getStartStep().getId());
+            if (doEmit(start, true)) {
+                final Traverser.Admin<S> emitSplit = start.split();
+                emitSplit.resetLoops();
+                emitSplit.setStepId(this.getNextStep().getId());
+                return IteratorUtils.of(start, emitSplit);
+            } else {
+                return IteratorUtils.of(start);
+            }
+        }
+    }
+
+    /////////////////////////
+
+    public static <A, B, C extends Traversal<A, B>> C addRepeatToTraversal(final C traversal, final Traversal.Admin<B, B> repeatTraversal) {
+        final Step<?, B> step = traversal.asAdmin().getEndStep();
+        if (step instanceof RepeatStep && null == ((RepeatStep) step).repeatTraversal) {
+            ((RepeatStep<B>) step).setRepeatTraversal(repeatTraversal);
+        } else {
+            final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
+            repeatStep.setRepeatTraversal(repeatTraversal);
+            traversal.asAdmin().addStep(repeatStep);
+        }
+        return traversal;
+    }
+
+    public static <A, B, C extends Traversal<A, B>> C addUntilToTraversal(final C traversal, final Traversal.Admin<B, ?> untilPredicate) {
+        final Step<?, B> step = traversal.asAdmin().getEndStep();
+        if (step instanceof RepeatStep && null == ((RepeatStep) step).untilTraversal) {
+            ((RepeatStep<B>) step).setUntilTraversal(untilPredicate);
+        } else {
+            final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
+            repeatStep.setUntilTraversal(untilPredicate);
+            traversal.asAdmin().addStep(repeatStep);
+        }
+        return traversal;
+    }
+
+    public static <A, B, C extends Traversal<A, B>> C addEmitToTraversal(final C traversal, final Traversal.Admin<B, ?> emitPredicate) {
+        final Step<?, B> step = traversal.asAdmin().getEndStep();
+        if (step instanceof RepeatStep && null == ((RepeatStep) step).emitTraversal) {
+            ((RepeatStep<B>) step).setEmitTraversal(emitPredicate);
+        } else {
+            final RepeatStep<B> repeatStep = new RepeatStep<>(traversal.asAdmin());
+            repeatStep.setEmitTraversal(emitPredicate);
+            traversal.asAdmin().addStep(repeatStep);
+        }
+        return traversal;
+    }
+
+    ///////////////////////////////////
+
+    public class RepeatEndStep extends ComputerAwareStep<S, S> {
+
+        public RepeatEndStep(final Traversal.Admin traversal) {
+            super(traversal);
+        }
+
+        @Override
+        protected Iterator<Traverser<S>> standardAlgorithm() throws NoSuchElementException {
+            while (true) {
+                final Traverser.Admin<S> start = this.starts.next();
+                start.incrLoops(this.getId());
+                if (doUntil(start, false)) {
+                    start.resetLoops();
+                    return IteratorUtils.of(start);
+                } else {
+                    if (!RepeatStep.this.untilFirst && !RepeatStep.this.emitFirst)
+                        RepeatStep.this.repeatTraversal.addStart(start);
+                    else
+                        RepeatStep.this.addStart(start);
+                    if (doEmit(start, false)) {
+                        final Traverser.Admin<S> emitSplit = start.split();
+                        emitSplit.resetLoops();
+                        return IteratorUtils.of(emitSplit);
+                    }
+                }
+            }
+        }
+
+        @Override
+        protected Iterator<Traverser<S>> computerAlgorithm() throws NoSuchElementException {
+            final Traverser.Admin<S> start = this.starts.next();
+            start.incrLoops(RepeatStep.this.getId());
+            if (doUntil(start, false)) {
+                start.resetLoops();
+                start.setStepId(RepeatStep.this.getNextStep().getId());
+                return IteratorUtils.of(start);
+            } else {
+                start.setStepId(RepeatStep.this.getId());
+                if (doEmit(start, false)) {
+                    final Traverser.Admin<S> emitSplit = start.split();
+                    emitSplit.resetLoops();
+                    emitSplit.setStepId(RepeatStep.this.getNextStep().getId());
+                    return IteratorUtils.of(start, emitSplit);
+                }
+                return IteratorUtils.of(start);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java
new file mode 100644
index 0000000..b74beca
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/UnionStep.java
@@ -0,0 +1,52 @@
+/*
+ * 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.branch;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalOptionParent;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.ConstantTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.Collections;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class UnionStep<S, E> extends BranchStep<S, E, TraversalOptionParent.Pick> {
+
+    public UnionStep(final Traversal.Admin traversal, final Traversal.Admin<?, E>... unionTraversals) {
+        super(traversal);
+        this.setBranchTraversal(new ConstantTraversal<>(Pick.any));
+        for (final Traversal.Admin<?, E> union : unionTraversals) {
+            this.addGlobalChildOption(Pick.any, (Traversal.Admin) union);
+        }
+    }
+
+    @Override
+    public void addGlobalChildOption(final Pick pickToken, final Traversal.Admin<S, E> traversalOption) {
+        if (Pick.any != pickToken)
+            throw new IllegalArgumentException("Union step only supports the any token: " + pickToken);
+        super.addGlobalChildOption(pickToken, traversalOption);
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.traversalOptions.getOrDefault(Pick.any, Collections.emptyList()));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
new file mode 100644
index 0000000..0f1f19d
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/AndStep.java
@@ -0,0 +1,39 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class AndStep<S> extends ConjunctionStep<S> implements TraversalParent {
+
+    public AndStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... andTraversals) {
+        super(traversal, andTraversals);
+
+    }
+
+    public static final class AndMarker<S> extends ConjunctionMarker<S> {
+        public AndMarker(final Traversal.Admin traversal) {
+            super(traversal);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java
new file mode 100644
index 0000000..6d95875
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CoinStep.java
@@ -0,0 +1,64 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Random;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class CoinStep<S> extends FilterStep<S> {
+
+    private static final Random RANDOM = new Random();
+    private final double probability;
+
+    public CoinStep(final Traversal.Admin traversal, final double probability) {
+        super(traversal);
+        this.probability = probability;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        long newBulk = 0l;
+        for (int i = 0; i < traverser.bulk(); i++) {
+            if (this.probability >= RANDOM.nextDouble())
+                newBulk++;
+        }
+        if (0 == newBulk) return false;
+        traverser.setBulk(newBulk);
+        return true;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.probability);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.BULK);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java
new file mode 100644
index 0000000..8d8b50e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ConjunctionStep.java
@@ -0,0 +1,193 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+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.traverser.TraverserRequirement;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class ConjunctionStep<S> extends AbstractStep<S, S> implements TraversalParent {
+
+    private List<Traversal.Admin<S, ?>> conjunctionTraversals;
+    private final boolean isAnd;
+
+    public ConjunctionStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?>... conjunctionTraversals) {
+        super(traversal);
+        this.isAnd = this.getClass().equals(AndStep.class);
+        this.conjunctionTraversals = Arrays.asList(conjunctionTraversals);
+        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
+            this.integrateChild(conjunctionTraversal);
+        }
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() throws NoSuchElementException {
+        while (true) {
+            final Traverser.Admin<S> start = this.starts.next();
+            boolean found = false;
+            for (final Traversal.Admin<S, ?> traversal : this.conjunctionTraversals) {
+                traversal.addStart(start.split());
+                found = traversal.hasNext();
+                traversal.reset();
+                if (this.isAnd) {
+                    if (!found)
+                        break;
+                } else if (found)
+                    break;
+            }
+            if (found) return start;
+        }
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements();
+    }
+
+    @Override
+    public List<Traversal.Admin<S, ?>> getLocalChildren() {
+        return Collections.unmodifiableList(this.conjunctionTraversals);
+    }
+
+    @Override
+    public ConjunctionStep<S> clone() {
+        final ConjunctionStep<S> clone = (ConjunctionStep<S>) super.clone();
+        clone.conjunctionTraversals = new ArrayList<>();
+        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
+            clone.conjunctionTraversals.add(clone.integrateChild(conjunctionTraversal.clone()));
+        }
+        return clone;
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.conjunctionTraversals);
+    }
+
+    public boolean isConjunctionHasTree() {
+        for (final Traversal.Admin<S, ?> conjunctionTraversal : this.conjunctionTraversals) {
+            for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
+                if (step instanceof ConjunctionStep) {
+                    if (!((ConjunctionStep) step).isConjunctionHasTree())
+                        return false;
+                } else if (!(step instanceof HasStep))
+                    return false;
+            }
+        }
+        return true;
+    }
+
+    public ConjunctionTree getConjunctionHasTree() {
+        return new ConjunctionTree(this);
+    }
+
+
+    ////////
+
+    public static class ConjunctionMarker<S> extends AbstractStep<S, S> {
+
+        public ConjunctionMarker(final Traversal.Admin traversal) {
+            super(traversal);
+        }
+
+        @Override
+        protected Traverser<S> processNextStart() throws NoSuchElementException {
+            throw new IllegalStateException("This step should have been removed via a strategy: " + this.getClass().getCanonicalName());
+        }
+    }
+
+    ////////
+
+    public static class ConjunctionTree implements Iterable<ConjunctionTree.Entry> {
+
+        private final List<Entry> tree = new ArrayList<>();
+        private final boolean isAnd;
+
+        public ConjunctionTree(final ConjunctionStep<?> conjunctionStep) {
+            this.isAnd = conjunctionStep.isAnd;
+            for (final Traversal.Admin<?, ?> conjunctionTraversal : conjunctionStep.conjunctionTraversals) {
+                for (final Step<?, ?> step : conjunctionTraversal.getSteps()) {
+                    if (step instanceof HasStep) {
+                        (((HasStep<?>) step).getHasContainers()).forEach(container -> this.tree.add(new Entry(HasContainer.class, container)));
+                    } else if (step instanceof ConjunctionStep) {
+                        this.tree.add(new Entry(ConjunctionTree.class, ((ConjunctionStep) step).getConjunctionHasTree()));
+                    } else {
+                        throw new IllegalArgumentException("This conjunction supports more complex steps than HasStep");
+                    }
+                }
+            }
+        }
+
+        @Override
+        public String toString() {
+            return (this.isAnd ? "and" : "or") + this.tree.toString();
+        }
+
+        public boolean isAnd() {
+            return this.isAnd;
+        }
+
+        @Override
+        public Iterator<Entry> iterator() {
+            return this.tree.iterator();
+        }
+
+        public static class Entry {
+            private Class entryClass;
+            private Object entryValue;
+
+            public Entry(final Class entryClass, final Object entryValue) {
+                this.entryClass = entryClass;
+                this.entryValue = entryValue;
+            }
+
+            public <V> V getValue() {
+                return (V) this.entryValue;
+            }
+
+            public boolean isHasContainer() {
+                return this.entryClass.equals(HasContainer.class);
+            }
+
+            public boolean isConjunctionTree() {
+                return this.entryClass.equals(ConjunctionTree.class);
+            }
+
+            public String toString() {
+                return this.entryValue.toString();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
new file mode 100644
index 0000000..e9c5dcf
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/CyclicPathStep.java
@@ -0,0 +1,46 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class CyclicPathStep<S> extends FilterStep<S> {
+
+    public CyclicPathStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        return !traverser.path().isSimple();
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return Collections.singleton(TraverserRequirement.PATH);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
new file mode 100644
index 0000000..9357e43
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
@@ -0,0 +1,86 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal;
+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.traversal.traverser.TraverserRequirement;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class DedupGlobalStep<S> extends FilterStep<S> implements TraversalParent {
+
+    private Traversal.Admin<S, Object> dedupTraversal = new IdentityTraversal<>();
+    private Set<Object> duplicateSet = new HashSet<>();
+
+    public DedupGlobalStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        traverser.setBulk(1);
+        return this.duplicateSet.add(TraversalUtil.apply(traverser, this.dedupTraversal));
+    }
+
+
+    @Override
+    public List<Traversal<S, Object>> getLocalChildren() {
+        return Collections.singletonList(this.dedupTraversal);
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin dedupTraversal) {
+        this.dedupTraversal = this.integrateChild(dedupTraversal);
+    }
+
+    @Override
+    public DedupGlobalStep<S> clone() {
+        final DedupGlobalStep<S> clone = (DedupGlobalStep<S>) super.clone();
+        clone.duplicateSet = new HashSet<>();
+        clone.dedupTraversal = clone.integrateChild(this.dedupTraversal.clone());
+        return clone;
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.duplicateSet.clear();
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.dedupTraversal);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return this.getSelfAndChildRequirements(TraverserRequirement.SIDE_EFFECTS);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java
new file mode 100644
index 0000000..332037e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/ExceptStep.java
@@ -0,0 +1,97 @@
+/*
+ * 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.filter;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class ExceptStep<S> extends FilterStep<S> {
+
+    private final String sideEffectKeyOrPathLabel;
+    private final Collection<S> exceptCollection;
+    private final S exceptObject;
+    private final short choice;
+
+    public ExceptStep(final Traversal.Admin traversal, final String sideEffectKeyOrPathLabel) {
+        super(traversal);
+        this.sideEffectKeyOrPathLabel = sideEffectKeyOrPathLabel;
+        this.exceptCollection = null;
+        this.exceptObject = null;
+        this.choice = 0;
+    }
+
+    public ExceptStep(final Traversal.Admin traversal, final Collection<S> exceptionCollection) {
+        super(traversal);
+        this.sideEffectKeyOrPathLabel = null;
+        this.exceptCollection = exceptionCollection;
+        this.exceptObject = null;
+        this.choice = 1;
+    }
+
+    public ExceptStep(final Traversal.Admin traversal, final S exceptionObject) {
+        super(traversal);
+        this.sideEffectKeyOrPathLabel = null;
+        this.exceptCollection = null;
+        this.exceptObject = exceptionObject;
+        this.choice = 2;
+    }
+
+    @Override
+    protected boolean filter(final Traverser.Admin<S> traverser) {
+        switch (this.choice) {
+            case 0: {
+                final Object except = traverser.asAdmin().getSideEffects().exists(this.sideEffectKeyOrPathLabel) ?
+                        traverser.sideEffects(this.sideEffectKeyOrPathLabel) :
+                        traverser.path(this.sideEffectKeyOrPathLabel);
+                return except instanceof Collection ?
+                        !((Collection) except).contains(traverser.get()) :
+                        !except.equals(traverser.get());
+            }
+            case 1:
+                return !this.exceptCollection.contains(traverser.get());
+            default:
+                return !this.exceptObject.equals(traverser.get());
+        }
+    }
+
+    @Override
+    public String toString() {
+        return TraversalHelper.makeStepString(this, this.sideEffectKeyOrPathLabel);
+    }
+
+    @Override
+    public Set<TraverserRequirement> getRequirements() {
+        return null == this.sideEffectKeyOrPathLabel ?
+                Collections.singleton(TraverserRequirement.OBJECT) :
+                Stream.of(TraverserRequirement.OBJECT,
+                        TraverserRequirement.SIDE_EFFECTS,
+                        TraverserRequirement.PATH_ACCESS).collect(Collectors.toSet());
+    }
+}


[02/40] incubator-tinkerpop git commit: the traversal steps provided by TinkerPop are the foundation for all dsl. GraphTraversal is just a dsl of traversal. Refactored the process API to reflect this concept. Fixed #592.

Posted by ok...@apache.org.
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
index 9805fbf..13441ec 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SequenceStrategyTest.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.structure.strategy;
 import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
index fa624bc..943eeef 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/StrategyGraphTest.java
@@ -22,7 +22,7 @@ import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
 import org.apache.tinkerpop.gremlin.FeatureRequirement;
 import org.apache.tinkerpop.gremlin.FeatureRequirementSet;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
index ae064c5..8b580b0 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/strategy/SubgraphStrategyTest.java
@@ -28,8 +28,8 @@ import java.util.NoSuchElementException;
 import java.util.function.Predicate;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.graph.traversal.__.outE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
 import static org.junit.Assert.*;
 
 /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
index 9627b3d..ac91e48 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
@@ -28,9 +28,9 @@ import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
 import org.codehaus.groovy.tools.shell.Groovysh;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
index 13ebd04..4429a4b 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier1.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.hadoop.process.computer.example;
 
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 
 import java.util.function.Supplier;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
index 6714edd..2bb0cf2 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier2.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.hadoop.process.computer.example;
 
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 
 import java.util.function.Supplier;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
index 5089bf5..1d768f2 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/example/TraversalSupplier3.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.hadoop.process.computer.example;
 
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 
 import java.util.Collection;
 import java.util.function.Supplier;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
index b2855de..bddde66 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/GiraphMessenger.java
@@ -19,11 +19,11 @@
 package org.apache.tinkerpop.gremlin.hadoop.process.computer.giraph;
 
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.ObjectWritable;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
 import org.apache.tinkerpop.gremlin.process.computer.Messenger;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
index 7d9ac1b..42997f1 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/SparkVertexPayload.java
@@ -18,11 +18,11 @@
  */
 package org.apache.tinkerpop.gremlin.hadoop.process.computer.spark;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
 import org.apache.tinkerpop.gremlin.process.computer.Messenger;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
index 8ccba89..306d9aa 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
@@ -52,51 +52,51 @@ import java.util.Optional;
 @Graph.OptIn(Graph.OptIn.SUITE_GROOVY_PROCESS_STANDARD)
 @Graph.OptIn(Graph.OptIn.SUITE_GROOVY_PROCESS_COMPUTER)
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
         method = "g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
         method = "g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.MatchTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
         method = "g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest$StandardTraversals",
         method = "g_V_matchXa_hasXname_GarciaX__a_0writtenBy_b__a_0sungBy_bX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest$StandardTraversals",
         method = "g_V_matchXa_0sungBy_b__a_0sungBy_c__b_writtenBy_d__c_writtenBy_e__d_hasXname_George_HarisonX__e_hasXname_Bob_MarleyXX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyMatchTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest$StandardTraversals",
         method = "g_V_matchXa_0sungBy_b__a_0writtenBy_c__b_writtenBy_d__c_sungBy_d__d_hasXname_GarciaXX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest$Traversals",
         method = "g_V_both_both_count",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest$Traversals",
         method = "g_V_repeatXoutX_timesX3X_count",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.CountTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.CountTest$Traversals",
         method = "g_V_repeatXoutX_timesX8X_count",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest$StandardTraversals",
         method = "g_V_both_both_count",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest$StandardTraversals",
         method = "g_V_repeatXoutX_timesX3X_count",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyCountTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyCountTest$StandardTraversals",
         method = "g_V_repeatXoutX_timesX8X_count",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
@@ -112,11 +112,11 @@ import java.util.Optional;
         method = "shouldHaveConsistentMemoryVertexPropertiesAndExceptions",
         reason = "Hadoop does a hard kill on failure and stops threads which stops test cases. Exception handling semantics are correct though.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.ProfileTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest$Traversals",
         method = "g_V_out_out_grateful_profile",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GroovyProfileTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest$StandardTraversals",
         method = "g_V_out_out_grateful_profile",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 public class HadoopGraph implements Graph {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
index d5276c6..46bf38a 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopEdgeIterator.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.hadoop.structure.hdfs;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopEdge;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.hadoop.fs.Path;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
index 25f1eff..7186700 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/HadoopVertexIterator.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.hadoop.structure.hdfs;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopGraph;
 import org.apache.tinkerpop.gremlin.hadoop.structure.HadoopVertex;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.io.NullWritable;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
index a1d42b6..83bf858 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/hdfs/TextIterator.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.hadoop.structure.hdfs;
 
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
index 44f9c17..7fb3791 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/ObjectWritableIterator.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.hadoop.structure.io;
 
 import org.apache.tinkerpop.gremlin.hadoop.structure.hdfs.HiddenFileFilter;
 import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.FastNoSuchElementException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.FileStatus;
 import org.apache.hadoop.fs.FileSystem;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
index 49bd8d0..62d8e68 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/io/script/ScriptRecordReader.java
@@ -29,7 +29,7 @@ import org.apache.hadoop.mapreduce.lib.input.LineRecordReader;
 import org.apache.tinkerpop.gremlin.groovy.DefaultImportCustomizerProvider;
 import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
 import org.apache.tinkerpop.gremlin.hadoop.structure.io.VertexWritable;
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
index e17f7ff..45a5d5b 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/giraph/HadoopGiraphGraphProvider.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.hadoop.process.computer.giraph;
 
 import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
index 3cb7de1..a48b4ba 100644
--- a/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
+++ b/hadoop-gremlin/src/test/java/org/apache/tinkerpop/gremlin/hadoop/process/computer/spark/HadoopSparkGraphProvider.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.hadoop.process.computer.spark;
 
 import org.apache.tinkerpop.gremlin.hadoop.HadoopGraphProvider;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEngine;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
deleted file mode 100644
index 4fef2fd..0000000
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/sideEffect/Neo4jGraphStep.java
+++ /dev/null
@@ -1,238 +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.neo4j.process.graph.traversal.step.sideEffect;
-
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertexProperty;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Contains;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
-import org.apache.tinkerpop.gremlin.util.StreamFactory;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-import org.javatuples.Pair;
-import org.neo4j.graphdb.Direction;
-import org.neo4j.graphdb.DynamicLabel;
-import org.neo4j.graphdb.Node;
-import org.neo4j.graphdb.ResourceIterator;
-import org.neo4j.graphdb.index.AutoIndexer;
-import org.neo4j.graphdb.schema.IndexDefinition;
-import org.neo4j.tooling.GlobalGraphOperations;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Stream;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- * @author Stephen Mallette (http://stephen.genoprime.com)
- * @author Pieter Martin
- */
-public class Neo4jGraphStep<S extends Element> extends GraphStep<S> {
-
-    public final List<HasContainer> hasContainers = new ArrayList<>();
-
-    public Neo4jGraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
-        super(traversal, returnClass, ids);
-        this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
-    }
-
-    private Iterator<? extends Edge> edges() {
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        graph.tx().readWrite();
-        // ids are present, filter on them first
-        if (this.ids != null && this.ids.length > 0)
-            return IteratorUtils.filter(graph.edges(this.ids), edge -> HasContainer.testAll((Edge) edge, this.hasContainers));
-        final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Edge.class);
-        return (null == hasContainer) ?
-                IteratorUtils.filter(graph.edges(), edge -> HasContainer.testAll((Edge) edge, this.hasContainers)) :
-                getEdgesUsingAutomaticIndex(hasContainer).filter(edge -> HasContainer.testAll((Edge) edge, this.hasContainers)).iterator();
-    }
-
-    private Iterator<? extends Vertex> vertices() {
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        graph.tx().readWrite();
-        // ids are present, filter on them first
-        if (this.ids != null && this.ids.length > 0)
-            return IteratorUtils.filter(graph.vertices(this.ids), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
-        // a label and a property
-        final Pair<String, HasContainer> labelHasPair = this.getHasContainerForLabelIndex();
-        if (null != labelHasPair)
-            return this.getVerticesUsingLabelAndProperty(labelHasPair.getValue0(), labelHasPair.getValue1())
-                    .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
-        // use automatic indices
-        final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Vertex.class);
-        if (null != hasContainer)
-            return this.getVerticesUsingAutomaticIndex(hasContainer)
-                    .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
-        // only labels
-        final List<String> labels = this.getLabels();
-        if (null != labels)
-            return this.getVerticesUsingOnlyLabels(labels).filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
-        // linear scan
-        return IteratorUtils.filter(graph.vertices(), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
-    }
-
-
-    private Stream<Neo4jVertex> getVerticesUsingLabelAndProperty(final String label, final HasContainer hasContainer) {
-        //System.out.println("labelProperty: " + label + ":" + hasContainer);
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        final ResourceIterator<Node> iterator1 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(label), hasContainer.key, hasContainer.value).iterator();
-        final ResourceIterator<Node> iterator2 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(hasContainer.key), T.value.getAccessor(), hasContainer.value).iterator();
-        final Stream<Neo4jVertex> stream1 = StreamFactory.stream(iterator1)
-                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
-                .map(node -> new Neo4jVertex(node, graph));
-        final Stream<Neo4jVertex> stream2 = StreamFactory.stream(iterator2)
-                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
-                .filter(node -> node.getProperty(T.key.getAccessor()).equals(hasContainer.key))
-                .map(node -> node.getRelationships(Direction.INCOMING).iterator().next().getStartNode())
-                .map(node -> new Neo4jVertex(node, graph));
-        return Stream.concat(stream1, stream2);
-    }
-
-    private Stream<Neo4jVertex> getVerticesUsingOnlyLabels(final List<String> labels) {
-        //System.out.println("labels: " + labels);
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        return labels.stream()
-                .filter(label -> !label.equals(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL.name()))
-                .flatMap(label -> StreamFactory.stream(GlobalGraphOperations.at(graph.getBaseGraph()).getAllNodesWithLabel(DynamicLabel.label(label)).iterator()))
-                .filter(node -> !node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL))
-                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
-                .map(node -> new Neo4jVertex(node, graph));
-    }
-
-    private Stream<Neo4jVertex> getVerticesUsingAutomaticIndex(final HasContainer hasContainer) {
-        //System.out.println("automatic index: " + hasContainer);
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        return StreamFactory.stream(graph.getBaseGraph().index().getNodeAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
-                .map(node -> node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL) ?
-                        node.getRelationships(Direction.INCOMING).iterator().next().getStartNode() :
-                        node)
-                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
-                .map(node -> new Neo4jVertex(node, graph));
-    }
-
-    private Stream<Neo4jEdge> getEdgesUsingAutomaticIndex(final HasContainer hasContainer) {
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        return StreamFactory.stream(graph.getBaseGraph().index().getRelationshipAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
-                .filter(relationship -> ElementHelper.idExists(relationship.getId(), this.ids))
-                .filter(relationship -> !relationship.getType().name().startsWith(Neo4jVertexProperty.VERTEX_PROPERTY_PREFIX))
-                .map(relationship -> new Neo4jEdge(relationship, graph));
-    }
-
-    private Pair<String, HasContainer> getHasContainerForLabelIndex() {
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        for (final HasContainer hasContainer : this.hasContainers) {
-            if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq)) {
-                for (final IndexDefinition index : graph.getBaseGraph().schema().getIndexes(DynamicLabel.label((String) hasContainer.value))) {
-                    for (final HasContainer hasContainer1 : this.hasContainers) {
-                        if (!hasContainer1.key.equals(T.label.getAccessor()) && hasContainer1.predicate.equals(Compare.eq)) {
-                            for (final String key : index.getPropertyKeys()) {
-                                if (key.equals(hasContainer1.key))
-                                    return Pair.with((String) hasContainer.value, hasContainer1);
-                            }
-                        }
-                    }
-                }
-            }
-        }
-        return null;
-    }
-
-    private List<String> getLabels() {
-        for (final HasContainer hasContainer : this.hasContainers) {
-            if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq))
-                return Arrays.asList(((String) hasContainer.value));
-            else if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Contains.within))
-                return new ArrayList<>((Collection<String>) hasContainer.value);
-        }
-        return null;
-    }
-
-    private HasContainer getHasContainerForAutomaticIndex(final Class<? extends Element> elementClass) {
-        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
-        final AutoIndexer<?> indexer = elementClass.equals(Vertex.class) ?
-                graph.getBaseGraph().index().getNodeAutoIndexer() :
-                graph.getBaseGraph().index().getRelationshipAutoIndexer();
-
-        if (!indexer.isEnabled())
-            return null;
-        final Set<String> indexKeys = indexer.getAutoIndexedProperties();
-        for (final HasContainer hasContainer : this.hasContainers) {
-            if (hasContainer.predicate.equals(Compare.eq) && indexKeys.contains(hasContainer.key))
-                return hasContainer;
-        }
-        return null;
-    }
-
-    @Override
-    public String toString() {
-        if (this.hasContainers.isEmpty())
-            return super.toString();
-        else
-            return 0 == this.ids.length ?
-                    TraversalHelper.makeStepString(this, this.hasContainers) :
-                    TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.hasContainers);
-    }
-
-    /*private String makeCypherQuery() {
-        final StringBuilder builder = new StringBuilder("MATCH node WHERE ");
-        int counter = 0;
-        for (final HasContainer hasContainer : this.hasContainers) {
-            if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.EQUAL)) {
-                if (counter++ > 0) builder.append(" AND ");
-                builder.append("node:").append(hasContainer.value);
-            } else {
-                if (counter++ > 0) builder.append(" AND ");
-                builder.append("node.").append(hasContainer.key).append(" ");
-                if (hasContainer.predicate instanceof Compare) {
-                    builder.append(((Compare) hasContainer.predicate).asString()).append(" ").append(toStringOfValue(hasContainer.value));
-                } else if (hasContainer.predicate.equals(Contains.IN)) {
-                    builder.append("IN [");
-                    for (Object object : (Collection) hasContainer.value) {
-                        builder.append(toStringOfValue(object)).append(",");
-                    }
-                    builder.replace(builder.length() - 1, builder.length(), "").append("]");
-                }
-            }
-
-        }
-        System.out.println(builder);
-        return builder.toString();
-    }
-
-    private String toStringOfValue(final Object value) {
-        if (value instanceof String)
-            return "'" + value + "'";
-        else return value.toString();
-    }*/
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java
deleted file mode 100644
index 894af7e..0000000
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/step/util/Neo4jCypherIterator.java
+++ /dev/null
@@ -1,66 +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.neo4j.process.graph.traversal.step.util;
-
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
-import org.neo4j.graphdb.Node;
-import org.neo4j.graphdb.Relationship;
-import org.neo4j.graphdb.ResourceIterator;
-
-import java.util.Iterator;
-import java.util.Map;
-import java.util.stream.Collectors;
-
-/**
- * @author Stephen Mallette (http://stephen.genoprime.com)
- */
-public class Neo4jCypherIterator<T> implements Iterator<Map<String, T>> {
-
-    private final ResourceIterator<Map<String, T>> iterator;
-    private final Neo4jGraph graph;
-
-    public Neo4jCypherIterator(final ResourceIterator<Map<String, T>> iterator, final Neo4jGraph graph) {
-        this.iterator = iterator;
-        this.graph = graph;
-    }
-
-    @Override
-    public boolean hasNext() {
-        return this.iterator.hasNext();
-    }
-
-    @Override
-    public Map<String, T> next() {
-        return this.iterator.next().entrySet().stream().collect(Collectors.toMap(
-                Map.Entry::getKey,
-                entry -> {
-                    final T val = entry.getValue();
-                    if (Node.class.isAssignableFrom(val.getClass())) {
-                        return (T) new Neo4jVertex((Node) val, this.graph);
-                    } else if (Relationship.class.isAssignableFrom(val.getClass())) {
-                        return (T) new Neo4jEdge((Relationship) val, this.graph);
-                    } else {
-                        return val;
-                    }
-                }));
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java
deleted file mode 100644
index 14a1bc3..0000000
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/graph/traversal/strategy/Neo4jGraphStepStrategy.java
+++ /dev/null
@@ -1,69 +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.neo4j.process.graph.traversal.strategy;
-
-import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.step.sideEffect.Neo4jGraphStep;
-import org.apache.tinkerpop.gremlin.process.Step;
-import org.apache.tinkerpop.gremlin.process.Traversal;
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.IdentityStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.strategy.AbstractTraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-
-/**
- * @author Pieter Martin
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class Neo4jGraphStepStrategy extends AbstractTraversalStrategy {
-
-    private static final Neo4jGraphStepStrategy INSTANCE = new Neo4jGraphStepStrategy();
-
-    private Neo4jGraphStepStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getStartStep() instanceof Neo4jGraphStep) {
-            final Neo4jGraphStep neo4jGraphStep = (Neo4jGraphStep) traversal.getStartStep();
-            Step<?, ?> currentStep = neo4jGraphStep.getNextStep();
-            while (true) {
-                if (currentStep instanceof HasContainerHolder) {
-                    neo4jGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
-                    if (currentStep.getLabel().isPresent()) {
-                        final IdentityStep identityStep = new IdentityStep<>(traversal);
-                        identityStep.setLabel(currentStep.getLabel().get());
-                        TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
-                    }
-                    traversal.removeStep(currentStep);
-                } else if (currentStep instanceof IdentityStep) {
-                    // do nothing
-                } else {
-                    break;
-                }
-                currentStep = currentStep.getNextStep();
-            }
-        }
-    }
-
-    public static Neo4jGraphStepStrategy instance() {
-        return INSTANCE;
-    }
-
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
new file mode 100644
index 0000000..c89058b
--- /dev/null
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/sideEffect/Neo4jGraphStep.java
@@ -0,0 +1,238 @@
+/*
+ * 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.neo4j.process.traversal.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertexProperty;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.structure.Compare;
+import org.apache.tinkerpop.gremlin.structure.Contains;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Element;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
+import org.apache.tinkerpop.gremlin.util.StreamFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+import org.javatuples.Pair;
+import org.neo4j.graphdb.Direction;
+import org.neo4j.graphdb.DynamicLabel;
+import org.neo4j.graphdb.Node;
+import org.neo4j.graphdb.ResourceIterator;
+import org.neo4j.graphdb.index.AutoIndexer;
+import org.neo4j.graphdb.schema.IndexDefinition;
+import org.neo4j.tooling.GlobalGraphOperations;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Stream;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ * @author Pieter Martin
+ */
+public class Neo4jGraphStep<S extends Element> extends GraphStep<S> {
+
+    public final List<HasContainer> hasContainers = new ArrayList<>();
+
+    public Neo4jGraphStep(final Traversal.Admin traversal, final Class<S> returnClass, final Object... ids) {
+        super(traversal, returnClass, ids);
+        this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
+    }
+
+    private Iterator<? extends Edge> edges() {
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        graph.tx().readWrite();
+        // ids are present, filter on them first
+        if (this.ids != null && this.ids.length > 0)
+            return IteratorUtils.filter(graph.edges(this.ids), edge -> HasContainer.testAll((Edge) edge, this.hasContainers));
+        final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Edge.class);
+        return (null == hasContainer) ?
+                IteratorUtils.filter(graph.edges(), edge -> HasContainer.testAll((Edge) edge, this.hasContainers)) :
+                getEdgesUsingAutomaticIndex(hasContainer).filter(edge -> HasContainer.testAll((Edge) edge, this.hasContainers)).iterator();
+    }
+
+    private Iterator<? extends Vertex> vertices() {
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        graph.tx().readWrite();
+        // ids are present, filter on them first
+        if (this.ids != null && this.ids.length > 0)
+            return IteratorUtils.filter(graph.vertices(this.ids), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
+        // a label and a property
+        final Pair<String, HasContainer> labelHasPair = this.getHasContainerForLabelIndex();
+        if (null != labelHasPair)
+            return this.getVerticesUsingLabelAndProperty(labelHasPair.getValue0(), labelHasPair.getValue1())
+                    .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
+        // use automatic indices
+        final HasContainer hasContainer = this.getHasContainerForAutomaticIndex(Vertex.class);
+        if (null != hasContainer)
+            return this.getVerticesUsingAutomaticIndex(hasContainer)
+                    .filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
+        // only labels
+        final List<String> labels = this.getLabels();
+        if (null != labels)
+            return this.getVerticesUsingOnlyLabels(labels).filter(vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers)).iterator();
+        // linear scan
+        return IteratorUtils.filter(graph.vertices(), vertex -> HasContainer.testAll((Vertex) vertex, this.hasContainers));
+    }
+
+
+    private Stream<Neo4jVertex> getVerticesUsingLabelAndProperty(final String label, final HasContainer hasContainer) {
+        //System.out.println("labelProperty: " + label + ":" + hasContainer);
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        final ResourceIterator<Node> iterator1 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(label), hasContainer.key, hasContainer.value).iterator();
+        final ResourceIterator<Node> iterator2 = graph.getBaseGraph().findNodesByLabelAndProperty(DynamicLabel.label(hasContainer.key), T.value.getAccessor(), hasContainer.value).iterator();
+        final Stream<Neo4jVertex> stream1 = StreamFactory.stream(iterator1)
+                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+                .map(node -> new Neo4jVertex(node, graph));
+        final Stream<Neo4jVertex> stream2 = StreamFactory.stream(iterator2)
+                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+                .filter(node -> node.getProperty(T.key.getAccessor()).equals(hasContainer.key))
+                .map(node -> node.getRelationships(Direction.INCOMING).iterator().next().getStartNode())
+                .map(node -> new Neo4jVertex(node, graph));
+        return Stream.concat(stream1, stream2);
+    }
+
+    private Stream<Neo4jVertex> getVerticesUsingOnlyLabels(final List<String> labels) {
+        //System.out.println("labels: " + labels);
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        return labels.stream()
+                .filter(label -> !label.equals(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL.name()))
+                .flatMap(label -> StreamFactory.stream(GlobalGraphOperations.at(graph.getBaseGraph()).getAllNodesWithLabel(DynamicLabel.label(label)).iterator()))
+                .filter(node -> !node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL))
+                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+                .map(node -> new Neo4jVertex(node, graph));
+    }
+
+    private Stream<Neo4jVertex> getVerticesUsingAutomaticIndex(final HasContainer hasContainer) {
+        //System.out.println("automatic index: " + hasContainer);
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        return StreamFactory.stream(graph.getBaseGraph().index().getNodeAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
+                .map(node -> node.hasLabel(Neo4jVertexProperty.VERTEX_PROPERTY_LABEL) ?
+                        node.getRelationships(Direction.INCOMING).iterator().next().getStartNode() :
+                        node)
+                .filter(node -> ElementHelper.idExists(node.getId(), this.ids))
+                .map(node -> new Neo4jVertex(node, graph));
+    }
+
+    private Stream<Neo4jEdge> getEdgesUsingAutomaticIndex(final HasContainer hasContainer) {
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        return StreamFactory.stream(graph.getBaseGraph().index().getRelationshipAutoIndexer().getAutoIndex().get(hasContainer.key, hasContainer.value).iterator())
+                .filter(relationship -> ElementHelper.idExists(relationship.getId(), this.ids))
+                .filter(relationship -> !relationship.getType().name().startsWith(Neo4jVertexProperty.VERTEX_PROPERTY_PREFIX))
+                .map(relationship -> new Neo4jEdge(relationship, graph));
+    }
+
+    private Pair<String, HasContainer> getHasContainerForLabelIndex() {
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        for (final HasContainer hasContainer : this.hasContainers) {
+            if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq)) {
+                for (final IndexDefinition index : graph.getBaseGraph().schema().getIndexes(DynamicLabel.label((String) hasContainer.value))) {
+                    for (final HasContainer hasContainer1 : this.hasContainers) {
+                        if (!hasContainer1.key.equals(T.label.getAccessor()) && hasContainer1.predicate.equals(Compare.eq)) {
+                            for (final String key : index.getPropertyKeys()) {
+                                if (key.equals(hasContainer1.key))
+                                    return Pair.with((String) hasContainer.value, hasContainer1);
+                            }
+                        }
+                    }
+                }
+            }
+        }
+        return null;
+    }
+
+    private List<String> getLabels() {
+        for (final HasContainer hasContainer : this.hasContainers) {
+            if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.eq))
+                return Arrays.asList(((String) hasContainer.value));
+            else if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Contains.within))
+                return new ArrayList<>((Collection<String>) hasContainer.value);
+        }
+        return null;
+    }
+
+    private HasContainer getHasContainerForAutomaticIndex(final Class<? extends Element> elementClass) {
+        final Neo4jGraph graph = (Neo4jGraph) this.getTraversal().getGraph().get();
+        final AutoIndexer<?> indexer = elementClass.equals(Vertex.class) ?
+                graph.getBaseGraph().index().getNodeAutoIndexer() :
+                graph.getBaseGraph().index().getRelationshipAutoIndexer();
+
+        if (!indexer.isEnabled())
+            return null;
+        final Set<String> indexKeys = indexer.getAutoIndexedProperties();
+        for (final HasContainer hasContainer : this.hasContainers) {
+            if (hasContainer.predicate.equals(Compare.eq) && indexKeys.contains(hasContainer.key))
+                return hasContainer;
+        }
+        return null;
+    }
+
+    @Override
+    public String toString() {
+        if (this.hasContainers.isEmpty())
+            return super.toString();
+        else
+            return 0 == this.ids.length ?
+                    TraversalHelper.makeStepString(this, this.hasContainers) :
+                    TraversalHelper.makeStepString(this, Arrays.toString(this.ids), this.hasContainers);
+    }
+
+    /*private String makeCypherQuery() {
+        final StringBuilder builder = new StringBuilder("MATCH node WHERE ");
+        int counter = 0;
+        for (final HasContainer hasContainer : this.hasContainers) {
+            if (hasContainer.key.equals(T.label.getAccessor()) && hasContainer.predicate.equals(Compare.EQUAL)) {
+                if (counter++ > 0) builder.append(" AND ");
+                builder.append("node:").append(hasContainer.value);
+            } else {
+                if (counter++ > 0) builder.append(" AND ");
+                builder.append("node.").append(hasContainer.key).append(" ");
+                if (hasContainer.predicate instanceof Compare) {
+                    builder.append(((Compare) hasContainer.predicate).asString()).append(" ").append(toStringOfValue(hasContainer.value));
+                } else if (hasContainer.predicate.equals(Contains.IN)) {
+                    builder.append("IN [");
+                    for (Object object : (Collection) hasContainer.value) {
+                        builder.append(toStringOfValue(object)).append(",");
+                    }
+                    builder.replace(builder.length() - 1, builder.length(), "").append("]");
+                }
+            }
+
+        }
+        System.out.println(builder);
+        return builder.toString();
+    }
+
+    private String toStringOfValue(final Object value) {
+        if (value instanceof String)
+            return "'" + value + "'";
+        else return value.toString();
+    }*/
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java
new file mode 100644
index 0000000..dadf250
--- /dev/null
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/step/util/Neo4jCypherIterator.java
@@ -0,0 +1,66 @@
+/*
+ * 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.neo4j.process.traversal.step.util;
+
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jEdge;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
+import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jVertex;
+import org.neo4j.graphdb.Node;
+import org.neo4j.graphdb.Relationship;
+import org.neo4j.graphdb.ResourceIterator;
+
+import java.util.Iterator;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+/**
+ * @author Stephen Mallette (http://stephen.genoprime.com)
+ */
+public class Neo4jCypherIterator<T> implements Iterator<Map<String, T>> {
+
+    private final ResourceIterator<Map<String, T>> iterator;
+    private final Neo4jGraph graph;
+
+    public Neo4jCypherIterator(final ResourceIterator<Map<String, T>> iterator, final Neo4jGraph graph) {
+        this.iterator = iterator;
+        this.graph = graph;
+    }
+
+    @Override
+    public boolean hasNext() {
+        return this.iterator.hasNext();
+    }
+
+    @Override
+    public Map<String, T> next() {
+        return this.iterator.next().entrySet().stream().collect(Collectors.toMap(
+                Map.Entry::getKey,
+                entry -> {
+                    final T val = entry.getValue();
+                    if (Node.class.isAssignableFrom(val.getClass())) {
+                        return (T) new Neo4jVertex((Node) val, this.graph);
+                    } else if (Relationship.class.isAssignableFrom(val.getClass())) {
+                        return (T) new Neo4jEdge((Relationship) val, this.graph);
+                    } else {
+                        return val;
+                    }
+                }));
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
new file mode 100644
index 0000000..e16e34c
--- /dev/null
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
@@ -0,0 +1,68 @@
+/*
+ * 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.neo4j.process.traversal.strategy.optimization;
+
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.step.sideEffect.Neo4jGraphStep;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+/**
+ * @author Pieter Martin
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class Neo4jGraphStepStrategy extends AbstractTraversalStrategy {
+
+    private static final Neo4jGraphStepStrategy INSTANCE = new Neo4jGraphStepStrategy();
+
+    private Neo4jGraphStepStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getStartStep() instanceof Neo4jGraphStep) {
+            final Neo4jGraphStep neo4jGraphStep = (Neo4jGraphStep) traversal.getStartStep();
+            Step<?, ?> currentStep = neo4jGraphStep.getNextStep();
+            while (true) {
+                if (currentStep instanceof HasContainerHolder) {
+                    neo4jGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
+                    if (currentStep.getLabel().isPresent()) {
+                        final IdentityStep identityStep = new IdentityStep<>(traversal);
+                        identityStep.setLabel(currentStep.getLabel().get());
+                        TraversalHelper.insertAfterStep(identityStep, currentStep, traversal);
+                    }
+                    traversal.removeStep(currentStep);
+                } else if (currentStep instanceof IdentityStep) {
+                    // do nothing
+                } else {
+                    break;
+                }
+                currentStep = currentStep.getNextStep();
+            }
+        }
+    }
+
+    public static Neo4jGraphStepStrategy instance() {
+        return INSTANCE;
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
index 47acfb4..8c2b434 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraph.java
@@ -21,13 +21,13 @@ package org.apache.tinkerpop.gremlin.neo4j.structure;
 import org.apache.commons.configuration.BaseConfiguration;
 import org.apache.commons.configuration.Configuration;
 import org.apache.commons.configuration.ConfigurationConverter;
-import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.step.util.Neo4jCypherIterator;
-import org.apache.tinkerpop.gremlin.neo4j.process.graph.traversal.strategy.Neo4jGraphStepStrategy;
-import org.apache.tinkerpop.gremlin.process.TraversalStrategies;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.step.util.Neo4jCypherIterator;
+import org.apache.tinkerpop.gremlin.neo4j.process.traversal.strategy.optimization.Neo4jGraphStepStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.DefaultGraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Transaction;
@@ -70,12 +70,12 @@ import java.util.stream.Stream;
         specific = "property(single,k,v)",
         reason = "Neo4j throws a NodeNotFoundException instead of the desired IllegalStateException.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.AddVertexTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexTest$Traversals",
         method = "g_V_addVXlabel_animal_age_0X",
         reason = "Neo4j global graph operators stream created vertices created after the access to the global iterator."
 )
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.GroovyAddVertexTest$StandardTraversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyAddVertexTest$StandardTraversals",
         method = "g_V_addVXlabel_animal_age_0X",
         reason = "Neo4j global graph operators stream created vertices created after the access to the global iterator."
 )

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
index c43906c..78c532f 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertex.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.neo4j.structure;
 
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;
 import org.apache.tinkerpop.gremlin.structure.Element;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
index 21fd957..95b6455 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jVertexProperty.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.neo4j.structure;
 
-import org.apache.tinkerpop.gremlin.process.T;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Property;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
index 2cc6f03..48fbf4e 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/BaseNeo4jGraphTest.java
@@ -20,7 +20,7 @@ package org.apache.tinkerpop.gremlin.neo4j;
 
 import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.neo4j.structure.Neo4jGraph;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.After;
 import org.junit.Before;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
index 8dcb6a0..498a2d8 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/process/Neo4jCypherStartTest.java
@@ -19,7 +19,7 @@
 package org.apache.tinkerpop.gremlin.neo4j.process;
 
 import org.apache.tinkerpop.gremlin.neo4j.BaseNeo4jGraphTest;
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
index 85d6585..c7dee34 100644
--- a/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
+++ b/neo4j-gremlin/src/test/java/org/apache/tinkerpop/gremlin/neo4j/structure/Neo4jGraphTest.java
@@ -20,9 +20,9 @@ package org.apache.tinkerpop.gremlin.neo4j.structure;
 
 import org.apache.tinkerpop.gremlin.groovy.jsr223.GremlinGroovyScriptEngine;
 import org.apache.tinkerpop.gremlin.neo4j.BaseNeo4jGraphTest;
-import org.apache.tinkerpop.gremlin.process.T;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversal;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.T;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.VertexProperty;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
index 600a320..31dd121 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerGraphComputer.java
@@ -18,7 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.tinkergraph.process.computer;
 
-import org.apache.tinkerpop.gremlin.process.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
index ada39bb..790d4d0 100644
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
+++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/computer/TinkerMessenger.java
@@ -18,13 +18,13 @@
  */
 package org.apache.tinkerpop.gremlin.tinkergraph.process.computer;
 
-import org.apache.tinkerpop.gremlin.process.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.computer.MessageCombiner;
 import org.apache.tinkerpop.gremlin.process.computer.MessageScope;
 import org.apache.tinkerpop.gremlin.process.computer.Messenger;
 import org.apache.tinkerpop.gremlin.process.computer.util.VertexProgramHelper;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.map.VertexStep;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Direction;
 import org.apache.tinkerpop.gremlin.structure.Edge;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/4c97e964/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
deleted file mode 100644
index b5699a8..0000000
--- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/graph/traversal/sideEffect/TinkerGraphStep.java
+++ /dev/null
@@ -1,117 +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.tinkergraph.process.graph.traversal.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.HasContainerHolder;
-import org.apache.tinkerpop.gremlin.process.graph.traversal.step.sideEffect.GraphStep;
-import org.apache.tinkerpop.gremlin.process.graph.util.HasContainer;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.structure.Compare;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Element;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
-import org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerHelper;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public class TinkerGraphStep<S extends Element> extends GraphStep<S> implements HasContainerHolder {
-
-    public final List<HasContainer> hasContainers = new ArrayList<>();
-
-    public TinkerGraphStep(final GraphStep<S> originalGraphStep) {
-        super(originalGraphStep.getTraversal(), originalGraphStep.getReturnClass(), originalGraphStep.getIds());
-        if (originalGraphStep.getLabel().isPresent())
-            this.setLabel(originalGraphStep.getLabel().get());
-        this.setIteratorSupplier(() -> (Iterator<S>) (Vertex.class.isAssignableFrom(this.returnClass) ? this.vertices() : this.edges()));
-    }
-
-    private Iterator<? extends Edge> edges() {
-        final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
-        final HasContainer indexedContainer = getIndexKey(Edge.class);
-        // ids are present, filter on them first
-        if (this.ids != null && this.ids.length > 0)
-            return this.iteratorList(graph.edges(this.ids));
-        else
-            return null == indexedContainer ?
-                    this.iteratorList(graph.edges()) :
-                    TinkerHelper.queryEdgeIndex(graph, indexedContainer.key, indexedContainer.value).stream()
-                            .filter(edge -> HasContainer.testAll(edge, this.hasContainers))
-                            .collect(Collectors.<Edge>toList()).iterator();
-    }
-
-    private Iterator<? extends Vertex> vertices() {
-        final TinkerGraph graph = (TinkerGraph) this.getTraversal().getGraph().get();
-        final HasContainer indexedContainer = getIndexKey(Vertex.class);
-        // ids are present, filter on them first
-        if (this.ids != null && this.ids.length > 0)
-            return this.iteratorList(graph.vertices(this.ids));
-        else
-            return null == indexedContainer ?
-                    this.iteratorList(graph.vertices()) :
-                    TinkerHelper.queryVertexIndex(graph, indexedContainer.key, indexedContainer.value).stream()
-                            .filter(vertex -> HasContainer.testAll(vertex, this.hasContainers))
-                            .collect(Collectors.<Vertex>toList()).iterator();
-    }
-
-    private HasContainer getIndexKey(final Class<? extends Element> indexedClass) {
-        final Set<String> indexedKeys = ((TinkerGraph) this.getTraversal().getGraph().get()).getIndexedKeys(indexedClass);
-        return this.hasContainers.stream()
-                .filter(c -> indexedKeys.contains(c.key) && c.predicate.equals(Compare.eq))
-                .findAny()
-                .orElseGet(() -> null);
-    }
-
-    public String toString() {
-        if (this.hasContainers.isEmpty())
-            return super.toString();
-        else
-            return 0 == this.ids.length ?
-                    TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), this.hasContainers) :
-                    TraversalHelper.makeStepString(this, this.returnClass.getSimpleName().toLowerCase(), Arrays.toString(this.ids), this.hasContainers);
-    }
-
-    private final <E extends Element> Iterator<E> iteratorList(final Iterator<E> iterator) {
-        final List<E> list = new ArrayList<>();
-        while (iterator.hasNext()) {
-            final E e = iterator.next();
-            if (HasContainer.testAll(e, this.hasContainers))
-                list.add(e);
-        }
-        return list.iterator();
-    }
-
-    @Override
-    public List<HasContainer> getHasContainers() {
-        return this.hasContainers;
-    }
-
-    @Override
-    public void addHasContainer(final HasContainer hasContainer) {
-        this.hasContainers.add(hasContainer);
-    }
-}