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/05/05 17:51:27 UTC

[1/8] incubator-tinkerpop git commit: first stab at lifecycles.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 24a1e9df6 -> 80bfd8d82


first stab at lifecycles.


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

Branch: refs/heads/master
Commit: 61b8a1cb3d8a974c55ed1383b42cf88808670732
Parents: 65a1e41
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon May 4 14:25:09 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon May 4 14:25:09 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalStrategies.java  |  16 +--
 .../process/traversal/TraversalStrategy.java    |  48 +++++++-
 .../decoration/ConjunctionStrategy.java         |  83 +++++++++++++
 .../strategy/decoration/ElementIdStrategy.java  |  12 +-
 .../strategy/decoration/EventStrategy.java      |   3 +-
 .../decoration/LabeledEndStepStrategy.java      |  51 ++++++++
 .../strategy/decoration/PartitionStrategy.java  |   3 +-
 .../strategy/decoration/SubgraphStrategy.java   |   3 +-
 .../finalization/EngineDependentStrategy.java   |  46 ++++++++
 .../strategy/finalization/ProfileStrategy.java  |  91 +++++++++++++++
 .../ComparatorHolderRemovalStrategy.java        |  55 +++++++++
 .../optimization/ConjunctionStrategy.java       |  83 -------------
 .../optimization/DedupOptimizerStrategy.java    |   3 +-
 .../optimization/IdentityRemovalStrategy.java   |   3 +-
 .../optimization/MatchWhereStrategy.java        |   6 +-
 .../strategy/optimization/ProfileStrategy.java  | 115 -------------------
 .../optimization/RangeByIsCountStrategy.java    |   2 -
 .../ComparatorHolderRemovalStrategy.java        |  54 ---------
 .../verification/EngineDependentStrategy.java   |  46 --------
 .../verification/LabeledEndStepStrategy.java    |  50 --------
 .../verification/LambdaRestrictionStrategy.java |   3 +-
 .../strategy/verification/ReadOnlyStrategy.java |   3 +-
 .../TraversalVerificationStrategy.java          |   3 +-
 .../util/DefaultTraversalStrategies.java        |   5 +-
 24 files changed, 410 insertions(+), 377 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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
index 077cc9c..c8ff815 100644
--- 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
@@ -19,15 +19,15 @@
 package org.apache.tinkerpop.gremlin.process.traversal;
 
 import org.apache.tinkerpop.gremlin.process.computer.util.ShellGraph;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ConjunctionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConjunctionStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.DedupOptimizerStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy;
 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.finalization.ProfileStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComparatorHolderRemovalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.EngineDependentStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.LabeledEndStepStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ComparatorHolderRemovalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.EngineDependentStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.LabeledEndStepStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.TraversalVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
@@ -106,7 +106,7 @@ public interface TraversalStrategies extends Serializable, Cloneable {
      *
      * @param strategies the traversal strategies to sort
      */
-    public static void sortStrategies(final List<? extends TraversalStrategy> strategies) {
+    public static void sortStrategies(final List<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
@@ -115,10 +115,10 @@ public interface TraversalStrategies extends Serializable, Cloneable {
         //Initialize all the dependencies
         strategies.forEach(strategy -> {
             strategy.applyPrior().forEach(s -> {
-                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, s, strategy.getClass());
+                if (strategyClass.contains(s)) MultiMap.put((Map)dependencyMap, s, strategy.getClass());
             });
             strategy.applyPost().forEach(s -> {
-                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, strategy.getClass(), s);
+                if (strategyClass.contains(s)) MultiMap.put((Map)dependencyMap, strategy.getClass(), s);
             });
         });
         //Now, compute transitive closure until convergence

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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
index 8d8c383..caa717e 100644
--- 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
@@ -39,12 +39,56 @@ public interface TraversalStrategy extends Serializable {
 
     public void apply(final Traversal.Admin<?, ?> traversal);
 
-    public default Set<Class<? extends TraversalStrategy>> applyPrior() {
+    public default Set applyPrior() {
         return Collections.emptySet();
     }
 
-    public default Set<Class<? extends TraversalStrategy>> applyPost() {
+    public default Set applyPost() {
         return Collections.emptySet();
     }
 
+    public interface DecorationStrategy extends TraversalStrategy {
+
+        public default Set<Class<? extends DecorationStrategy>> applyPrior() {
+            return Collections.emptySet();
+        }
+
+        public default Set<Class<? extends DecorationStrategy>> applyPost() {
+            return Collections.emptySet();
+        }
+    }
+
+    public interface OptimizationStrategy extends TraversalStrategy {
+
+        public default Set<Class<? extends OptimizationStrategy>> applyPrior() {
+            return Collections.emptySet();
+        }
+
+        public default Set<Class<? extends OptimizationStrategy>> applyPost() {
+            return Collections.emptySet();
+        }
+    }
+
+    public interface VerificationStrategy extends TraversalStrategy {
+
+        public default Set<Class<? extends VerificationStrategy>> applyPrior() {
+            return Collections.emptySet();
+        }
+
+        public default Set<Class<? extends VerificationStrategy>> applyPost() {
+            return Collections.emptySet();
+        }
+    }
+
+    public interface FinalizationStrategy extends TraversalStrategy {
+
+        public default Set<Class<? extends FinalizationStrategy>> applyPrior() {
+            return Collections.emptySet();
+        }
+
+        public default Set<Class<? extends FinalizationStrategy>> applyPost() {
+            return Collections.emptySet();
+        }
+    }
+
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
new file mode 100644
index 0000000..186f063
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/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.decoration;
+
+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.DecorationStrategy {
+
+    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/61b8a1cb/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 f7b0d5e..c25652b 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,8 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
-import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 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.map.AddEdgeByPathStep;
@@ -29,12 +29,13 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.IdStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesStep;
 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.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Contains;
 import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.PropertyType;
+import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
@@ -51,12 +52,12 @@ import java.util.function.Supplier;
  * This behavior can be overriden by setting the {@link Builder#idMaker(Supplier)}.
  * <p/>
  * Unless otherwise specified the identifier is stored in the {@code __id} property.  This can be changed by setting
- * the {@link Builder#idPropertyKey(String}
+ * the {@link Builder#idPropertyKey(String)}
  *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public final class ElementIdStrategy extends AbstractTraversalStrategy {
+public final class ElementIdStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
 
     private final String idPropertyKey;
 
@@ -156,7 +157,8 @@ public final class ElementIdStrategy extends AbstractTraversalStrategy {
 
         private Supplier<Object> idMaker = () -> UUID.randomUUID().toString();
 
-        private Builder() {}
+        private Builder() {
+        }
 
         /**
          * Creates a new unique identifier for the next created {@link Element}.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
index 64725d2..3dfc123 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.Event;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.EventCallback;
@@ -44,7 +45,7 @@ import java.util.List;
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class EventStrategy extends AbstractTraversalStrategy {
+public class EventStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
     private final List<MutationListener> listeners = new ArrayList<>();
 
     private EventStrategy(final MutationListener... listeners) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java
new file mode 100644
index 0000000..1ead6ce
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.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.strategy.decoration;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+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 implements TraversalStrategy.DecorationStrategy {
+
+    private static final LabeledEndStepStrategy INSTANCE = new LabeledEndStepStrategy();
+
+    private LabeledEndStepStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (!traversal.getEndStep().getLabels().isEmpty())
+            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/61b8a1cb/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 ca07951..bc223b7 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
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
 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.HasStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep;
@@ -46,7 +47,7 @@ import java.util.stream.Stream;
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class PartitionStrategy extends AbstractTraversalStrategy {
+public class PartitionStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
     private String writePartition;
     private final String partitionKey;
     private final Set<String> readPartitions;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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 bcf9a3f..c7e049b 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
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration;
 
 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.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddEdgeByPathStep;
@@ -44,7 +45,7 @@ import java.util.stream.Collectors;
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class SubgraphStrategy extends AbstractTraversalStrategy {
+public class SubgraphStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
 
     private final Predicate<Traverser<Vertex>> vertexPredicate;
     private final Predicate<Traverser<Edge>> edgePredicate;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
new file mode 100644
index 0000000..0b31eaa
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/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.finalization;
+
+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.FinalizationStrategy {
+
+    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/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
new file mode 100644
index 0000000..cd2c409
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.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.finalization;
+
+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.TraversalParent;
+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.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+
+import java.util.List;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileStrategy extends AbstractTraversalStrategy implements TraversalStrategy.FinalizationStrategy {
+
+    private static final ProfileStrategy INSTANCE = new ProfileStrategy();
+
+    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);
+                }
+            }
+        }
+    }
+
+    public static ProfileStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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..1d9bca2
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ComparatorHolderRemovalStrategy.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.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.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 implements TraversalStrategy.OptimizationStrategy {
+
+    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/61b8a1cb/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
deleted file mode 100644
index d857121..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/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.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 {
-
-    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/61b8a1cb/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
index 1bb4a96..0e5bd85 100644
--- 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
@@ -20,6 +20,7 @@ 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.DedupGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
@@ -33,7 +34,7 @@ import java.util.List;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class DedupOptimizerStrategy extends AbstractTraversalStrategy {
+public final class DedupOptimizerStrategy extends AbstractTraversalStrategy implements TraversalStrategy.OptimizationStrategy {
 
     private static final DedupOptimizerStrategy INSTANCE = new DedupOptimizerStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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
index a66aeff..af20d9b 100644
--- 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
@@ -19,6 +19,7 @@
 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.sideEffect.IdentityStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -26,7 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class IdentityRemovalStrategy extends AbstractTraversalStrategy {
+public final class IdentityRemovalStrategy extends AbstractTraversalStrategy implements TraversalStrategy.OptimizationStrategy {
 
     private static final IdentityRemovalStrategy INSTANCE = new IdentityRemovalStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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
index 15980d9..6d9d5d7 100644
--- 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
@@ -36,10 +36,10 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class MatchWhereStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+public final class MatchWhereStrategy extends AbstractTraversalStrategy implements TraversalStrategy.OptimizationStrategy {
 
     private static final MatchWhereStrategy INSTANCE = new MatchWhereStrategy();
-    private static final Set<Class<? extends TraversalStrategy>> PRIORS = new HashSet<>();
+    private static final Set<Class<? extends OptimizationStrategy>> PRIORS = new HashSet<>();
 
     static {
         PRIORS.add(IdentityRemovalStrategy.class);
@@ -83,7 +83,7 @@ public final class MatchWhereStrategy extends AbstractTraversalStrategy implemen
     }
 
     @Override
-    public Set<Class<? extends TraversalStrategy>> applyPrior() {
+    public Set<Class<? extends OptimizationStrategy>> applyPrior() {
         return PRIORS;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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
deleted file mode 100644
index e31975e..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/ProfileStrategy.java
+++ /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.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.strategy.verification.ComparatorHolderRemovalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.EngineDependentStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.LabeledEndStepStrategy;
-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/61b8a1cb/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
index 32abcd1..ecc12c8 100644
--- 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
@@ -44,8 +44,6 @@ import java.util.function.BiPredicate;
 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);
     }};

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComparatorHolderRemovalStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComparatorHolderRemovalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComparatorHolderRemovalStrategy.java
deleted file mode 100644
index 97e282d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/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.traversal.strategy.verification;
-
-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/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/EngineDependentStrategy.java
deleted file mode 100644
index 7902cb7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/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.traversal.strategy.verification;
-
-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/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LabeledEndStepStrategy.java
deleted file mode 100644
index 8ba86f9..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/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.traversal.strategy.verification;
-
-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().getLabels().isEmpty())
-            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/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
index 9ac0758..a6c38da 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
 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.LambdaHolder;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
@@ -27,7 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversal
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class LambdaRestrictionStrategy extends AbstractTraversalStrategy {
+public final class LambdaRestrictionStrategy extends AbstractTraversalStrategy implements TraversalStrategy.VerificationStrategy {
 
     private static final LambdaRestrictionStrategy INSTANCE = new LambdaRestrictionStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
index 0718953..91c776c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
@@ -19,6 +19,7 @@
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
@@ -28,7 +29,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
  *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class ReadOnlyStrategy extends AbstractTraversalStrategy {
+public final class ReadOnlyStrategy extends AbstractTraversalStrategy implements TraversalStrategy.VerificationStrategy {
 
     private static final ReadOnlyStrategy INSTANCE = new ReadOnlyStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
index b9a7b70..9bf191a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
 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.Mutating;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
@@ -34,7 +35,7 @@ import java.util.Optional;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class TraversalVerificationStrategy extends AbstractTraversalStrategy {
+public final class TraversalVerificationStrategy extends AbstractTraversalStrategy implements TraversalStrategy.VerificationStrategy {
 
     private static final TraversalVerificationStrategy INSTANCE = new TraversalVerificationStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/61b8a1cb/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
index eca4d5d..110efcc 100644
--- 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
@@ -73,7 +73,10 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
 
     @Override
     public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
-        this.traversalStrategies.forEach(traversalStrategy -> traversalStrategy.apply(traversal));
+        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.DecorationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
+        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.OptimizationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
+        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.FinalizationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
+        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.VerificationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
     }
 
     @Override


[2/8] incubator-tinkerpop git commit: Merge branch 'master' into lifecylces

Posted by ok...@apache.org.
Merge branch 'master' into lifecylces


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

Branch: refs/heads/master
Commit: 405480d7bb1bd9fcbf1ec2346538daeb33295a27
Parents: 61b8a1c 8bfeb95
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon May 4 16:32:12 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon May 4 16:32:12 2015 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  4 +-
 docs/src/gremlin-applications.asciidoc          | 30 +++++++++-----
 .../tinkerpop/gremlin/driver/Handler.java       | 12 ++++--
 .../driver/message/ResponseStatusCode.java      | 23 ++++++-----
 .../gremlin/server/handler/IteratorHandler.java |  6 ++-
 .../handler/NioGremlinResponseEncoder.java      | 29 ++++----------
 .../handler/WsGremlinResponseEncoder.java       | 25 +++---------
 .../server/op/AbstractEvalOpProcessor.java      | 18 +++++++--
 .../server/GremlinServerIntegrateTest.java      | 42 ++++++++------------
 9 files changed, 89 insertions(+), 100 deletions(-)
----------------------------------------------------------------------



[4/8] incubator-tinkerpop git commit: bingo. TraversalEngines now can register and de-register strategies. A fully self-contained strategy model.

Posted by ok...@apache.org.
bingo. TraversalEngines now can register and de-register strategies. A fully self-contained strategy model.


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

Branch: refs/heads/master
Commit: f0157a5ff6fcf46668749472d74c6ec3d906db51
Parents: de771a0
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon May 4 18:06:20 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon May 4 18:06:20 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalEngine.java      | 12 +++++-
 .../dsl/graph/GraphTraversalSource.java         | 17 ++++----
 .../engine/ComputerTraversalEngine.java         | 45 ++++++++++++++++----
 .../engine/StandardTraversalEngine.java         |  5 ---
 .../ComputerVerificationStrategy.java           |  8 ++--
 .../traversal/util/DefaultTraversal.java        |  1 -
 6 files changed, 59 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f0157a5f/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
index 0343988..312103d 100644
--- 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
@@ -22,6 +22,8 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.io.Serializable;
+import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -31,8 +33,6 @@ public interface TraversalEngine extends Serializable {
 
     public enum Type {STANDARD, COMPUTER}
 
-    public void processTraversal(final Traversal.Admin<?, ?> traversal);
-
     public Type getType();
 
     public Optional<GraphComputer> getGraphComputer();
@@ -45,6 +45,14 @@ public interface TraversalEngine extends Serializable {
         return this.getType().equals(Type.COMPUTER);
     }
 
+    public default List<TraversalStrategy> getWithStrategies() {
+        return Collections.emptyList();
+    }
+
+    public default List<Class<? extends TraversalStrategy>> getWithoutStrategies() {
+        return Collections.emptyList();
+    }
+
     ///////////
 
     public interface Builder extends Serializable {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f0157a5f/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
index 4f04e57..ab67136 100644
--- 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
@@ -36,7 +36,6 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier;
 
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.function.Supplier;
@@ -72,6 +71,9 @@ public class GraphTraversalSource implements TraversalSource {
         this.engine = engine;
         this.withStrategies = withStrategies;
         this.withoutStrategies = withoutStrategies;
+        final TraversalEngine tempEngine = this.engine.create(this.graph);
+        this.withStrategies.addAll(tempEngine.getWithStrategies());
+        this.withoutStrategies.addAll(tempEngine.getWithoutStrategies());
         final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(TraversalStrategies.GlobalCache.getGraphClass(this.graph));
         this.strategies = withStrategies.isEmpty() && withoutStrategies.isEmpty() ?
                 tempStrategies :
@@ -82,7 +84,8 @@ public class GraphTraversalSource implements TraversalSource {
 
     private <S> GraphTraversal.Admin<S, S> generateTraversal() {
         final GraphTraversal.Admin<S, S> traversal = new DefaultGraphTraversal<>(this.graph);
-        traversal.setEngine(this.engine.create(this.graph));
+        final TraversalEngine engine = this.engine.create(this.graph);
+        traversal.setEngine(engine);
         traversal.setStrategies(this.strategies);
         return traversal;
     }
@@ -175,8 +178,8 @@ public class GraphTraversalSource implements TraversalSource {
     public static class Builder implements TraversalSource.Builder<GraphTraversalSource> {
 
         private TraversalEngine.Builder engineBuilder = StandardTraversalEngine.build();
-        private List<TraversalStrategy> withStrategies = null;
-        private List<Class<? extends TraversalStrategy>> withoutStrategies = null;
+        private List<TraversalStrategy> withStrategies = new ArrayList<>();
+        private List<Class<? extends TraversalStrategy>> withoutStrategies = new ArrayList<>();
 
         private Builder() {
         }
@@ -189,23 +192,19 @@ public class GraphTraversalSource implements TraversalSource {
 
         @Override
         public Builder with(final TraversalStrategy strategy) {
-            if (null == this.withStrategies) this.withStrategies = new ArrayList<>();
             this.withStrategies.add(strategy);
             return this;
         }
 
         @Override
         public TraversalSource.Builder without(Class<? extends TraversalStrategy> strategyClass) {
-            if (null == this.withoutStrategies) this.withoutStrategies = new ArrayList<>();
             this.withoutStrategies.add(strategyClass);
             return this;
         }
 
         @Override
         public GraphTraversalSource create(final Graph graph) {
-            return new GraphTraversalSource(graph, this.engineBuilder,
-                    null == this.withStrategies ? Collections.emptyList() : this.withStrategies,
-                    null == this.withoutStrategies ? Collections.emptyList() : this.withoutStrategies);
+            return new GraphTraversalSource(graph, this.engineBuilder, this.withStrategies, this.withoutStrategies);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f0157a5f/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 6ea0c48..ec09979 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,14 +18,18 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.engine;
 
-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.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Optional;
 
 /**
@@ -40,13 +44,7 @@ public final class ComputerTraversalEngine implements TraversalEngine {
     }
 
     @Override
-    public void processTraversal(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getParent() instanceof EmptyStep)
-            traversal.addStep(new ComputerResultStep<>(traversal, this.graphComputer, true));
-    }
-
-    @Override
-    public Type getType() {
+    public Type getType() {    // TODO: gut this
         return Type.COMPUTER;
     }
 
@@ -60,6 +58,11 @@ public final class ComputerTraversalEngine implements TraversalEngine {
         return Optional.ofNullable(this.graphComputer);
     }
 
+    @Override
+    public List<TraversalStrategy> getWithStrategies() {
+        return Collections.singletonList(ComputerResultStrategy.instance());
+    }
+
     public static Builder build() {
         return new Builder();
     }
@@ -85,4 +88,28 @@ public final class ComputerTraversalEngine implements TraversalEngine {
                     new ComputerTraversalEngine(graph.compute(this.graphComputerClass).isolation(this.isolation));
         }
     }
+
+    ////
+
+    public static class ComputerResultStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {
+
+        private static final ComputerResultStrategy INSTANCE = new ComputerResultStrategy();
+
+        private ComputerResultStrategy() {
+
+        }
+
+        @Override
+        public void apply(final Traversal.Admin<?, ?> traversal) {
+            if (traversal.getParent() instanceof EmptyStep) {
+                final TraversalEngine engine = traversal.getEngine();
+                if (engine.isComputer())
+                    traversal.addStep(new ComputerResultStep<>(traversal, engine.getGraphComputer().get(), true));
+            }
+        }
+
+        public static ComputerResultStrategy instance() {
+            return INSTANCE;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f0157a5f/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 7d66d9d..a3e4570 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
@@ -38,11 +38,6 @@ public final class StandardTraversalEngine implements TraversalEngine {
     }
 
     @Override
-    public void processTraversal(final Traversal.Admin<?, ?> traversal) {
-
-    }
-
-    @Override
     public Type getType() {
         return Type.STANDARD;
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f0157a5f/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index 62c8dc5..0fb821c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -47,9 +48,10 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
         if (traversal.getEngine().isStandard())
             return;
 
-        final Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
-                ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
-                traversal.getEndStep();
+        Step<?, ?> endStep = traversal.getEndStep();
+        while (endStep instanceof ComputerAwareStep.EndStep || endStep instanceof ComputerResultStep) {
+            endStep = endStep.getPreviousStep();
+        }
 
         for (final Step<?, ?> step : traversal.getSteps()) {
             if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep)))

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f0157a5f/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
index 6e9f653..17e779a 100644
--- 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
@@ -86,7 +86,6 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
                 }
             }
         }
-        this.traversalEngine.processTraversal(this);
         this.finalEndStep = this.getEndStep();
         this.locked = true;
     }


[3/8] incubator-tinkerpop git commit: traversal lifecycles implemented. pretty basic, nice separation. would really like to get ComputerTraversalEngine strategy in there as that would seal the deal.

Posted by ok...@apache.org.
traversal lifecycles implemented. pretty basic, nice separation. would really like to get ComputerTraversalEngine strategy in there as that would seal the deal.


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

Branch: refs/heads/master
Commit: de771a08f5a4185e759ac1595b7cf49c1266bbde
Parents: 405480d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon May 4 17:15:43 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon May 4 17:15:43 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalStrategies.java  | 35 ++++-----
 .../process/traversal/TraversalStrategy.java    | 42 ++---------
 .../strategy/AbstractTraversalStrategy.java     |  2 +-
 .../decoration/ConjunctionStrategy.java         |  2 +-
 .../strategy/decoration/ElementIdStrategy.java  |  2 +-
 .../strategy/decoration/EventStrategy.java      |  2 +-
 .../decoration/LabeledEndStepStrategy.java      |  2 +-
 .../strategy/decoration/PartitionStrategy.java  |  2 +-
 .../strategy/decoration/SubgraphStrategy.java   |  2 +-
 .../finalization/EngineDependentStrategy.java   |  2 +-
 .../strategy/finalization/ProfileStrategy.java  |  2 +-
 .../ComparatorHolderRemovalStrategy.java        |  2 +-
 .../optimization/DedupBijectionStrategy.java    | 76 ++++++++++++++++++++
 .../optimization/DedupOptimizerStrategy.java    | 76 --------------------
 .../optimization/IdentityRemovalStrategy.java   |  2 +-
 .../optimization/MatchWhereStrategy.java        |  2 +-
 .../optimization/RangeByIsCountStrategy.java    |  2 +-
 .../ComputerVerificationStrategy.java           | 73 +++++++++++++++++++
 .../verification/LambdaRestrictionStrategy.java |  2 +-
 .../strategy/verification/ReadOnlyStrategy.java |  2 +-
 .../TraversalVerificationStrategy.java          | 73 -------------------
 .../util/DefaultTraversalStrategies.java        |  4 +-
 .../process/TraversalStrategiesTest.java        | 23 +++---
 .../optimization/TinkerGraphStepStrategy.java   | 20 ++++--
 24 files changed, 216 insertions(+), 236 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index c8ff815..4737c37 100644
--- 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
@@ -20,15 +20,15 @@ package org.apache.tinkerpop.gremlin.process.traversal;
 
 import org.apache.tinkerpop.gremlin.process.computer.util.ShellGraph;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConjunctionStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.DedupOptimizerStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.LabeledEndStepStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.EngineDependentStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ComparatorHolderRemovalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.DedupBijectionStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchWhereStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ComparatorHolderRemovalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.EngineDependentStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.LabeledEndStepStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.TraversalVerificationStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -106,7 +106,7 @@ public interface TraversalStrategies extends Serializable, Cloneable {
      *
      * @param strategies the traversal strategies to sort
      */
-    public static void sortStrategies(final List<TraversalStrategy> strategies) {
+    public static void sortStrategies(final List<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
@@ -115,10 +115,10 @@ public interface TraversalStrategies extends Serializable, Cloneable {
         //Initialize all the dependencies
         strategies.forEach(strategy -> {
             strategy.applyPrior().forEach(s -> {
-                if (strategyClass.contains(s)) MultiMap.put((Map)dependencyMap, s, strategy.getClass());
+                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, s, strategy.getClass());
             });
             strategy.applyPost().forEach(s -> {
-                if (strategyClass.contains(s)) MultiMap.put((Map)dependencyMap, strategy.getClass(), s);
+                if (strategyClass.contains(s)) MultiMap.put(dependencyMap, strategy.getClass(), s);
             });
         });
         //Now, compute transitive closure until convergence
@@ -159,17 +159,18 @@ public interface TraversalStrategies extends Serializable, Cloneable {
         static {
             final TraversalStrategies coreStrategies = new DefaultTraversalStrategies();
             coreStrategies.addStrategies(
-                    DedupOptimizerStrategy.instance(),
-                    RangeByIsCountStrategy.instance(),
-                    IdentityRemovalStrategy.instance(),
-                    MatchWhereStrategy.instance(),
-                    ComparatorHolderRemovalStrategy.instance(),
+                    ConjunctionStrategy.instance(),
                     LabeledEndStepStrategy.instance(),
-                    //LambdaRestrictionStrategy.instance(),
                     EngineDependentStrategy.instance(),
                     ProfileStrategy.instance(),
-                    TraversalVerificationStrategy.instance(),
-                    ConjunctionStrategy.instance());
+                    ComparatorHolderRemovalStrategy.instance(),
+                    DedupBijectionStrategy.instance(),
+                    IdentityRemovalStrategy.instance(),
+                    MatchWhereStrategy.instance(),
+                    RangeByIsCountStrategy.instance(),
+                    ComputerVerificationStrategy.instance());
+            //LambdaRestrictionStrategy.instance(),
+
             CACHE.put(Graph.class, coreStrategies.clone());
             CACHE.put(EmptyGraph.class, new DefaultTraversalStrategies());
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index caa717e..753724c 100644
--- 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
@@ -31,7 +31,7 @@ import java.util.Set;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Matthias Broecheler (me@matthiasb.com)
  */
-public interface TraversalStrategy extends Serializable {
+public interface TraversalStrategy<S extends 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
@@ -39,56 +39,28 @@ public interface TraversalStrategy extends Serializable {
 
     public void apply(final Traversal.Admin<?, ?> traversal);
 
-    public default Set applyPrior() {
+    public default Set<Class<? extends S>> applyPrior() {
         return Collections.emptySet();
     }
 
-    public default Set applyPost() {
+    public default Set<Class<? extends S>> applyPost() {
         return Collections.emptySet();
     }
 
-    public interface DecorationStrategy extends TraversalStrategy {
+    public interface DecorationStrategy extends TraversalStrategy<DecorationStrategy> {
 
-        public default Set<Class<? extends DecorationStrategy>> applyPrior() {
-            return Collections.emptySet();
-        }
-
-        public default Set<Class<? extends DecorationStrategy>> applyPost() {
-            return Collections.emptySet();
-        }
     }
 
-    public interface OptimizationStrategy extends TraversalStrategy {
-
-        public default Set<Class<? extends OptimizationStrategy>> applyPrior() {
-            return Collections.emptySet();
-        }
+    public interface OptimizationStrategy extends TraversalStrategy<OptimizationStrategy> {
 
-        public default Set<Class<? extends OptimizationStrategy>> applyPost() {
-            return Collections.emptySet();
-        }
     }
 
-    public interface VerificationStrategy extends TraversalStrategy {
+    public interface VerificationStrategy extends TraversalStrategy<VerificationStrategy> {
 
-        public default Set<Class<? extends VerificationStrategy>> applyPrior() {
-            return Collections.emptySet();
-        }
-
-        public default Set<Class<? extends VerificationStrategy>> applyPost() {
-            return Collections.emptySet();
-        }
     }
 
-    public interface FinalizationStrategy extends TraversalStrategy {
-
-        public default Set<Class<? extends FinalizationStrategy>> applyPrior() {
-            return Collections.emptySet();
-        }
+    public interface FinalizationStrategy extends TraversalStrategy<FinalizationStrategy> {
 
-        public default Set<Class<? extends FinalizationStrategy>> applyPost() {
-            return Collections.emptySet();
-        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index 0b5fe96..23ce01b 100644
--- 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
@@ -24,7 +24,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public abstract class AbstractTraversalStrategy implements TraversalStrategy {
+public abstract class AbstractTraversalStrategy<S extends TraversalStrategy> implements TraversalStrategy<S> {
 
     @Override
     public String toString() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
index 186f063..6cbdfad 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConjunctionStrategy.java
@@ -33,7 +33,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class ConjunctionStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
+public final class ConjunctionStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
 
     private static final ConjunctionStrategy INSTANCE = new ConjunctionStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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 c25652b..afe880d 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
@@ -57,7 +57,7 @@ import java.util.function.Supplier;
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public final class ElementIdStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
+public final class ElementIdStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
 
     private final String idPropertyKey;
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
index 3dfc123..28d5bd6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/EventStrategy.java
@@ -45,7 +45,7 @@ import java.util.List;
  *
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class EventStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
+public class EventStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
     private final List<MutationListener> listeners = new ArrayList<>();
 
     private EventStrategy(final MutationListener... listeners) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java
index 1ead6ce..29205a6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/LabeledEndStepStrategy.java
@@ -27,7 +27,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class LabeledEndStepStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
+public final class LabeledEndStepStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
 
     private static final LabeledEndStepStrategy INSTANCE = new LabeledEndStepStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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 bc223b7..75dc3c5 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
@@ -47,7 +47,7 @@ import java.util.stream.Stream;
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class PartitionStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
+public class PartitionStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
     private String writePartition;
     private final String partitionKey;
     private final Set<String> readPartitions;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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 c7e049b..21a549f 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
@@ -45,7 +45,7 @@ import java.util.stream.Collectors;
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
  */
-public class SubgraphStrategy extends AbstractTraversalStrategy implements TraversalStrategy.DecorationStrategy {
+public class SubgraphStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
 
     private final Predicate<Traverser<Vertex>> vertexPredicate;
     private final Predicate<Traverser<Edge>> edgePredicate;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
index 0b31eaa..376f283 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/EngineDependentStrategy.java
@@ -26,7 +26,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversal
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class EngineDependentStrategy extends AbstractTraversalStrategy implements TraversalStrategy.FinalizationStrategy {
+public final class EngineDependentStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {
 
     private static final EngineDependentStrategy INSTANCE = new EngineDependentStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index cd2c409..da2ef6a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -32,7 +32,7 @@ import java.util.List;
 /**
  * @author Bob Briody (http://bobbriody.com)
  */
-public final class ProfileStrategy extends AbstractTraversalStrategy implements TraversalStrategy.FinalizationStrategy {
+public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {
 
     private static final ProfileStrategy INSTANCE = new ProfileStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index 1d9bca2..a30be79 100644
--- 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
@@ -28,7 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class ComparatorHolderRemovalStrategy extends AbstractTraversalStrategy implements TraversalStrategy.OptimizationStrategy {
+public final class ComparatorHolderRemovalStrategy extends AbstractTraversalStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
 
     private static final ComparatorHolderRemovalStrategy INSTANCE = new ComparatorHolderRemovalStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupBijectionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupBijectionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupBijectionStrategy.java
new file mode 100644
index 0000000..e86b8d6
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupBijectionStrategy.java
@@ -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.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.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 DedupBijectionStrategy extends AbstractTraversalStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
+
+    private static final DedupBijectionStrategy INSTANCE = new DedupBijectionStrategy();
+
+    private DedupBijectionStrategy() {
+    }
+
+    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 DedupBijectionStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
deleted file mode 100644
index 0e5bd85..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/DedupOptimizerStrategy.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either 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.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 implements TraversalStrategy.OptimizationStrategy {
-
-    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/de771a08/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
index af20d9b..07eb4e1 100644
--- 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
@@ -27,7 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class IdentityRemovalStrategy extends AbstractTraversalStrategy implements TraversalStrategy.OptimizationStrategy {
+public final class IdentityRemovalStrategy extends AbstractTraversalStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
 
     private static final IdentityRemovalStrategy INSTANCE = new IdentityRemovalStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index 6d9d5d7..679b8dd 100644
--- 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
@@ -36,7 +36,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class MatchWhereStrategy extends AbstractTraversalStrategy implements TraversalStrategy.OptimizationStrategy {
+public final class MatchWhereStrategy extends AbstractTraversalStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
 
     private static final MatchWhereStrategy INSTANCE = new MatchWhereStrategy();
     private static final Set<Class<? extends OptimizationStrategy>> PRIORS = new HashSet<>();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index ecc12c8..c040e13 100644
--- 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
@@ -41,7 +41,7 @@ import java.util.function.BiPredicate;
 /**
  * @author Daniel Kuppitz (http://gremlin.guru)
  */
-public final class RangeByIsCountStrategy extends AbstractTraversalStrategy implements TraversalStrategy {
+public final class RangeByIsCountStrategy extends AbstractTraversalStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
 
     private static final Map<BiPredicate, Long> RANGE_PREDICATES = new HashMap<BiPredicate, Long>() {{
         put(Contains.within, 1L);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
new file mode 100644
index 0000000..62c8dc5
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -0,0 +1,73 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either 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.verification;
+
+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.Mutating;
+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.step.util.EmptyStep;
+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.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 ComputerVerificationStrategy extends AbstractTraversalStrategy<TraversalStrategy.VerificationStrategy> implements TraversalStrategy.VerificationStrategy {
+
+    private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
+
+    private ComputerVerificationStrategy() {
+    }
+
+    @Override
+    public void apply(final Traversal.Admin<?, ?> traversal) {
+        if (traversal.getEngine().isStandard())
+            return;
+
+        final Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
+                ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
+                traversal.getEndStep();
+
+        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());
+            }
+            if (step instanceof Mutating)
+                throw new IllegalStateException("Muting steps are currently not supported by GraphComputer traversals");
+        }
+    }
+
+    public static ComputerVerificationStrategy instance() {
+        return INSTANCE;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
index a6c38da..f1cde80 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/LambdaRestrictionStrategy.java
@@ -28,7 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversal
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class LambdaRestrictionStrategy extends AbstractTraversalStrategy implements TraversalStrategy.VerificationStrategy {
+public final class LambdaRestrictionStrategy extends AbstractTraversalStrategy<TraversalStrategy.VerificationStrategy> implements TraversalStrategy.VerificationStrategy {
 
     private static final LambdaRestrictionStrategy INSTANCE = new LambdaRestrictionStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
index 91c776c..c8d7a17 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategy.java
@@ -29,7 +29,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
  *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class ReadOnlyStrategy extends AbstractTraversalStrategy implements TraversalStrategy.VerificationStrategy {
+public final class ReadOnlyStrategy extends AbstractTraversalStrategy<TraversalStrategy.VerificationStrategy> implements TraversalStrategy.VerificationStrategy {
 
     private static final ReadOnlyStrategy INSTANCE = new ReadOnlyStrategy();
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
deleted file mode 100644
index 9bf191a..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/TraversalVerificationStrategy.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either 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.verification;
-
-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.Mutating;
-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.step.util.EmptyStep;
-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.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 implements TraversalStrategy.VerificationStrategy {
-
-    private static final TraversalVerificationStrategy INSTANCE = new TraversalVerificationStrategy();
-
-    private TraversalVerificationStrategy() {
-    }
-
-    @Override
-    public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getEngine().isStandard())
-            return;
-
-        final Step<?, ?> endStep = traversal.getEndStep() instanceof ComputerAwareStep.EndStep ?
-                ((ComputerAwareStep.EndStep) traversal.getEndStep()).getPreviousStep() :
-                traversal.getEndStep();
-
-        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());
-            }
-            if (step instanceof Mutating)
-                throw new IllegalStateException("Muting steps are currently not supported by GraphComputer traversals");
-        }
-    }
-
-    public static TraversalVerificationStrategy instance() {
-        return INSTANCE;
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index 110efcc..41127fb 100644
--- 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
@@ -35,7 +35,7 @@ import java.util.Optional;
  */
 public class DefaultTraversalStrategies implements TraversalStrategies {
 
-    protected List<TraversalStrategy> traversalStrategies = new ArrayList<>();
+    protected List<TraversalStrategy<?>> traversalStrategies = new ArrayList<>();
     protected TraverserGeneratorFactory traverserGeneratorFactory = DefaultTraverserGeneratorFactory.instance();
 
     @Override
@@ -56,7 +56,7 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
     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();
+            final Optional<TraversalStrategy<?>> strategy = this.traversalStrategies.stream().filter(s -> s.getClass().equals(strategyClass)).findAny();
             if (strategy.isPresent()) {
                 this.traversalStrategies.remove(strategy.get());
                 removed = true;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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 6abd200..7e0db0e 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
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.junit.Test;
 
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.Set;
@@ -52,27 +53,24 @@ public class TraversalStrategiesTest {
                 e = new StrategyE(),
                 k = new StrategyK();
 
-        List<TraversalStrategy> s;
+        List<TraversalStrategy<?>> s;
 
         //Dependency well defined
-        s = Stream.of(b, a)
-                .collect(Collectors.toList());
+        s = Arrays.asList(b, a);
         TraversalStrategies.sortStrategies(s);
         assertEquals(2, s.size());
         assertEquals(a, s.get(0));
         assertEquals(b, s.get(1));
 
         //No dependency
-        s = Stream.of(c, a)
-                .collect(Collectors.toList());
+        s = Arrays.asList(c, a);
         TraversalStrategies.sortStrategies(s);
         assertEquals(2, s.size());
         assertEquals(c, s.get(0));
         assertEquals(a, s.get(1));
 
         //Dependency well defined
-        s = Stream.of(c, a, b)
-                .collect(Collectors.toList());
+        s =  Arrays.asList(c, a, b);
         TraversalStrategies.sortStrategies(s);
         assertEquals(3, s.size());
         assertEquals(a, s.get(0));
@@ -80,8 +78,7 @@ public class TraversalStrategiesTest {
         assertEquals(c, s.get(2));
 
         //Circular dependency => throws exception
-        s = Stream.of(c, k, a, b)
-                .collect(Collectors.toList());
+        s = Arrays.asList(c, k, a, b);
         try {
             TraversalStrategies.sortStrategies(s);
             fail();
@@ -90,8 +87,7 @@ public class TraversalStrategiesTest {
         }
 
         //Dependency well defined
-        s = Stream.of(d, c, a, e, b)
-                .collect(Collectors.toList());
+        s = Arrays.asList(d, c, a, e, b);
         TraversalStrategies.sortStrategies(s);
         assertEquals(5, s.size());
         assertEquals(a, s.get(0));
@@ -101,8 +97,7 @@ public class TraversalStrategiesTest {
         assertEquals(e, s.get(4));
 
         //Circular dependency => throws exception
-        s = Stream.of(d, c, k, a, e, b)
-                .collect(Collectors.toList());
+        s = Arrays.asList(d, c, k, a, e, b);
         try {
             TraversalStrategies.sortStrategies(s);
             fail();
@@ -181,7 +176,7 @@ public class TraversalStrategiesTest {
 
     }
 
-    private static class DummyStrategy extends AbstractTraversalStrategy {
+    private static class DummyStrategy extends AbstractTraversalStrategy<TraversalStrategy> {
 
         @Override
         public void apply(Traversal.Admin<?, ?> traversal) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/de771a08/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
index 4403693..53dad8d 100644
--- 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
@@ -20,19 +20,28 @@ package org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.strategy.opti
 
 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.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.strategy.optimization.IdentityRemovalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.step.sideEffect.TinkerGraphStep;
 
+import java.util.HashSet;
+import java.util.Set;
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
+public final class TinkerGraphStepStrategy extends AbstractTraversalStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
 
     private static final TinkerGraphStepStrategy INSTANCE = new TinkerGraphStepStrategy();
+    private static final Set<Class<? extends OptimizationStrategy>> PRIORS = new HashSet<>();
+
+    static {
+        PRIORS.add(IdentityRemovalStrategy.class);
+    }
 
     private TinkerGraphStepStrategy() {
     }
@@ -54,8 +63,6 @@ public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
                     tinkerGraphStep.hasContainers.addAll(((HasContainerHolder) currentStep).getHasContainers());
                     currentStep.getLabels().forEach(tinkerGraphStep::addLabel);
                     traversal.removeStep(currentStep);
-                } else if (currentStep instanceof IdentityStep) {
-                    // do nothing
                 } else {
                     break;
                 }
@@ -64,6 +71,11 @@ public class TinkerGraphStepStrategy extends AbstractTraversalStrategy {
         }
     }
 
+    @Override
+    public Set<Class<? extends OptimizationStrategy>> applyPrior() {
+        return PRIORS;
+    }
+
     public static TinkerGraphStepStrategy instance() {
         return INSTANCE;
     }


[8/8] incubator-tinkerpop git commit: Merge branch 'master' into lifecylces

Posted by ok...@apache.org.
Merge branch 'master' into lifecylces


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

Branch: refs/heads/master
Commit: 80bfd8d82313a293825e1c33a8e3a389711ea7e5
Parents: a0c4b48 24a1e9d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue May 5 09:51:07 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue May 5 09:51:07 2015 -0600

----------------------------------------------------------------------

----------------------------------------------------------------------



[7/8] incubator-tinkerpop git commit: If a user needs to provide a traversal strategy that doesn't nicely fit into the provided traversal categories, they can sort outside the category boundaries.

Posted by ok...@apache.org.
If a user needs to provide a traversal strategy that doesn't nicely fit into the provided traversal categories, they can sort outside the category boundaries.


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

Branch: refs/heads/master
Commit: a0c4b485b4720fdb479f476ece2605c3e655b57a
Parents: b24a991
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue May 5 09:50:49 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue May 5 09:50:49 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalStrategies.java  | 29 +++---
 .../process/traversal/TraversalStrategy.java    | 91 +++++++++++++++++--
 .../util/DefaultTraversalStrategies.java        | 11 ++-
 .../util/EmptyTraversalStrategies.java          |  4 +-
 .../process/TraversalStrategiesTest.java        | 92 ++++++++++++++++++--
 5 files changed, 188 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a0c4b485/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
index 4737c37..2e59d72 100644
--- 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
@@ -38,7 +38,6 @@ 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;
@@ -54,7 +53,7 @@ public interface TraversalStrategies extends Serializable, Cloneable {
     /**
      * Return all the {@link TraversalStrategy} singleton instances associated with this {@link TraversalStrategies}.
      */
-    public List<TraversalStrategy> toList();
+    public List<TraversalStrategy<?>> toList();
 
     /**
      * Apply all the {@link TraversalStrategy} optimizers to the {@link Traversal} for the stated {@link TraversalEngine}.
@@ -71,7 +70,7 @@ public interface TraversalStrategies extends Serializable, Cloneable {
      * @param strategies the traversal strategies to add
      * @return the newly updated/sorted traversal strategies collection
      */
-    public TraversalStrategies addStrategies(final TraversalStrategy... strategies);
+    public TraversalStrategies addStrategies(final TraversalStrategy<?>... strategies);
 
     /**
      * Remove all the provided {@link TraversalStrategy} classes from the current collection.
@@ -137,18 +136,18 @@ public interface TraversalStrategies extends Serializable, Cloneable {
                 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;
-            }
+        Collections.sort(strategies, (strategy1, strategy2) -> {
+            int categoryComparison = strategy1.compareTo(strategy2.getTraversalCategory());
+            if (categoryComparison != 0) return categoryComparison;
+
+            boolean s1Before = MultiMap.containsEntry(dependencyMap, strategy1.getClass(), strategy2.getClass());
+            boolean s2Before = MultiMap.containsEntry(dependencyMap, strategy2.getClass(), strategy1.getClass());
+            if (s1Before && s2Before)
+                throw new IllegalStateException("Cyclic dependency between traversal strategies: ["
+                        + strategy1.getClass().getName() + ", " + strategy2.getClass().getName() + ']');
+            if (s1Before) return -1;
+            else if (s2Before) return 1;
+            else return 0;
         });
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a0c4b485/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
index 753724c..7d16ff1 100644
--- 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
@@ -25,17 +25,12 @@ 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<S extends TraversalStrategy> extends Serializable {
+public interface TraversalStrategy<S extends TraversalStrategy> extends Serializable, Comparable<Class<? extends TraversalStrategy>> {
 
-    // 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);
 
@@ -47,20 +42,98 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ
         return Collections.emptySet();
     }
 
-    public interface DecorationStrategy extends TraversalStrategy<DecorationStrategy> {
+    public default Class<S> getTraversalCategory() {
+        return (Class) TraversalStrategy.class;
+    }
 
+    @Override
+    public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) {
+        return 0;
     }
 
-    public interface OptimizationStrategy extends TraversalStrategy<OptimizationStrategy> {
+    public interface DecorationStrategy extends TraversalStrategy<DecorationStrategy> {
 
+        @Override
+        public default Class<DecorationStrategy> getTraversalCategory() {
+            return DecorationStrategy.class;
+        }
+
+        @Override
+        public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) {
+            if (otherTraversalCategory.equals(DecorationStrategy.class))
+                return 0;
+            else if (otherTraversalCategory.equals(OptimizationStrategy.class))
+                return -1;
+            else if (otherTraversalCategory.equals(FinalizationStrategy.class))
+                return -1;
+            else if (otherTraversalCategory.equals(VerificationStrategy.class))
+                return -1;
+            else
+                return 0;
+        }
     }
 
-    public interface VerificationStrategy extends TraversalStrategy<VerificationStrategy> {
+    public interface OptimizationStrategy extends TraversalStrategy<OptimizationStrategy> {
 
+        @Override
+        public default Class<OptimizationStrategy> getTraversalCategory() {
+            return OptimizationStrategy.class;
+        }
+
+        @Override
+        public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) {
+            if (otherTraversalCategory.equals(DecorationStrategy.class))
+                return 1;
+            else if (otherTraversalCategory.equals(OptimizationStrategy.class))
+                return 0;
+            else if (otherTraversalCategory.equals(FinalizationStrategy.class))
+                return -1;
+            else if (otherTraversalCategory.equals(VerificationStrategy.class))
+                return -1;
+            else
+                return 0;
+        }
     }
 
     public interface FinalizationStrategy extends TraversalStrategy<FinalizationStrategy> {
 
+        @Override
+        public default Class<FinalizationStrategy> getTraversalCategory() {
+            return FinalizationStrategy.class;
+        }
+
+        @Override
+        public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) {
+            if (otherTraversalCategory.equals(DecorationStrategy.class))
+                return 1;
+            else if (otherTraversalCategory.equals(OptimizationStrategy.class))
+                return 1;
+            else if (otherTraversalCategory.equals(FinalizationStrategy.class))
+                return 0;
+            else if (otherTraversalCategory.equals(VerificationStrategy.class))
+                return -1;
+            else
+                return 0;
+        }
     }
 
+    public interface VerificationStrategy extends TraversalStrategy<VerificationStrategy> {
+
+        @Override
+        public default Class<VerificationStrategy> getTraversalCategory() {
+            return VerificationStrategy.class;
+        }
+
+        @Override
+        public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) {
+            if (otherTraversalCategory.equals(DecorationStrategy.class))
+                return 1;
+            else if (otherTraversalCategory.equals(OptimizationStrategy.class))
+                return 1;
+            else if (otherTraversalCategory.equals(FinalizationStrategy.class))
+                return 1;
+            else
+                return 0;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a0c4b485/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
index 41127fb..0dd0cd2 100644
--- 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
@@ -39,7 +39,7 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
     protected TraverserGeneratorFactory traverserGeneratorFactory = DefaultTraverserGeneratorFactory.instance();
 
     @Override
-    public TraversalStrategies addStrategies(final TraversalStrategy... strategies) {
+    public TraversalStrategies addStrategies(final TraversalStrategy<?>... strategies) {
         boolean added = false;
         for (final TraversalStrategy strategy : strategies) {
             if (!this.traversalStrategies.contains(strategy)) {
@@ -67,16 +67,15 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
     }
 
     @Override
-    public List<TraversalStrategy> toList() {
+    public List<TraversalStrategy<?>> toList() {
         return Collections.unmodifiableList(this.traversalStrategies);
     }
 
     @Override
     public void applyStrategies(final Traversal.Admin<?, ?> traversal) {
-        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.DecorationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
-        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.OptimizationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
-        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.FinalizationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
-        this.traversalStrategies.stream().filter(traversalStrategy -> traversalStrategy instanceof TraversalStrategy.VerificationStrategy).forEach(traversalStrategy -> traversalStrategy.apply(traversal));
+        for (final TraversalStrategy<?> traversalStrategy : this.traversalStrategies) {
+            traversalStrategy.apply(traversal);
+        }
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a0c4b485/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 c0a9175..d79015e 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
@@ -38,7 +38,7 @@ public final class EmptyTraversalStrategies implements TraversalStrategies {
     }
 
     @Override
-    public List<TraversalStrategy> toList() {
+    public List<TraversalStrategy<?>> toList() {
         return Collections.emptyList();
     }
 
@@ -48,7 +48,7 @@ public final class EmptyTraversalStrategies implements TraversalStrategies {
     }
 
     @Override
-    public TraversalStrategies addStrategies(final TraversalStrategy... strategies) {
+    public TraversalStrategies addStrategies(final TraversalStrategy<?>... strategies) {
         return this;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/a0c4b485/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 7e0db0e..0beaa37 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
@@ -70,7 +70,7 @@ public class TraversalStrategiesTest {
         assertEquals(a, s.get(1));
 
         //Dependency well defined
-        s =  Arrays.asList(c, a, b);
+        s = Arrays.asList(c, a, b);
         TraversalStrategies.sortStrategies(s);
         assertEquals(3, s.size());
         assertEquals(a, s.get(0));
@@ -110,11 +110,6 @@ public class TraversalStrategiesTest {
     public static class StrategyA extends DummyStrategy {
 
         @Override
-        public Set<Class<? extends TraversalStrategy>> applyPrior() {
-            return Collections.EMPTY_SET;
-        }
-
-        @Override
         public Set<Class<? extends TraversalStrategy>> applyPost() {
             return Stream.of(StrategyB.class).collect(Collectors.toSet());
         }
@@ -176,7 +171,7 @@ public class TraversalStrategiesTest {
 
     }
 
-    private static class DummyStrategy extends AbstractTraversalStrategy<TraversalStrategy> {
+    private static class DummyStrategy<S extends TraversalStrategy> extends AbstractTraversalStrategy<S> {
 
         @Override
         public void apply(Traversal.Admin<?, ?> traversal) {
@@ -184,4 +179,87 @@ public class TraversalStrategiesTest {
         }
     }
 
+    ////////////////////////////////////////////
+    ////////////////////////////////////////////
+    ////////////////////////////////////////////
+
+    @Test
+    public void testTraversalStrategySortingWithCategories() {
+        TraversalStrategy
+                a = new StrategyADecoration(),
+                b = new StrategyBDecoration(),
+                c = new StrategyCOptimization(),
+                d = new StrategyDOptimization(),
+                e = new StrategyEFinalization(),
+                k = new StrategyKVerification();
+
+        List<TraversalStrategy<?>> s;
+
+        //in category sorting
+        s = Arrays.asList(b, a);
+        TraversalStrategies.sortStrategies(s);
+        assertEquals(2, s.size());
+        assertEquals(a, s.get(0));
+        assertEquals(b, s.get(1));
+
+        //mixed category sorting
+        s = Arrays.asList(a, e, b, d);
+        TraversalStrategies.sortStrategies(s);
+        assertEquals(4, s.size());
+        assertEquals(a, s.get(0));
+        assertEquals(b, s.get(1));
+        assertEquals(d, s.get(2));
+        assertEquals(e, s.get(3));
+
+        //full reverse sorting
+        s = Arrays.asList(k,e,d,c,b,a);
+        TraversalStrategies.sortStrategies(s);
+        assertEquals(6, s.size());
+        assertEquals(a, s.get(0));
+        assertEquals(b, s.get(1));
+        assertEquals(c, s.get(2));
+        assertEquals(d, s.get(3));
+        assertEquals(e, s.get(4));
+        assertEquals(k, s.get(5));
+    }
+
+    public static class StrategyADecoration extends DummyStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+
+        @Override
+        public Set<Class<? extends DecorationStrategy>> applyPost() {
+            return Stream.of(StrategyBDecoration.class).collect(Collectors.toSet());
+        }
+
+    }
+
+    public static class StrategyBDecoration extends DummyStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
+
+    }
+
+    public static class StrategyCOptimization extends DummyStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
+
+        @Override
+        public Set<Class<? extends OptimizationStrategy>> applyPost() {
+            return Stream.of(StrategyDOptimization.class).collect(Collectors.toSet());
+        }
+    }
+
+    public static class StrategyDOptimization extends DummyStrategy<TraversalStrategy.OptimizationStrategy> implements TraversalStrategy.OptimizationStrategy {
+
+        @Override
+        public Set<Class<? extends OptimizationStrategy>> applyPrior() {
+            return Stream.of(StrategyCOptimization.class).collect(Collectors.toSet());
+        }
+
+    }
+
+    public static class StrategyEFinalization extends DummyStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {
+
+    }
+
+    public static class StrategyKVerification extends DummyStrategy<TraversalStrategy.VerificationStrategy> implements TraversalStrategy.VerificationStrategy {
+
+
+    }
+
 }


[6/8] incubator-tinkerpop git commit: fixed a bug in HasNextTraversal and its relation to ChooseStep. Also, fixed a similar bug in OrderGlobalStep.

Posted by ok...@apache.org.
fixed a bug in HasNextTraversal and its relation to ChooseStep. Also, fixed a similar bug in OrderGlobalStep.


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

Branch: refs/heads/master
Commit: b24a99106341ac79e83a2c27f8f9218573e365aa
Parents: cf79f64
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue May 5 08:23:38 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue May 5 08:23:38 2015 -0600

----------------------------------------------------------------------
 .../traversal/lambda/HasNextTraversal.java      |  9 +++----
 .../traversal/step/branch/BranchStep.java       |  2 +-
 .../traversal/step/map/OrderGlobalStep.java     | 25 ++++++++++++++++----
 .../step/util/TraversalComparator.java          |  4 ++++
 .../traversal/util/DefaultTraversal.java        |  5 ++--
 5 files changed, 34 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b24a9910/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 7a02e53..b8a3b75 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
@@ -26,6 +26,7 @@ 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.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.List;
@@ -60,7 +61,7 @@ public final class HasNextTraversal<S> implements Traversal.Admin<S, Boolean> {
 
     @Override
     public String toString() {
-        return "(hasNext)";
+        return TraversalHelper.makeTraversalString(this);
     }
 
     @Override
@@ -70,7 +71,7 @@ public final class HasNextTraversal<S> implements Traversal.Admin<S, Boolean> {
 
     @Override
     public TraversalStrategies getStrategies() {
-        return null;
+        return this.hasNextTraversal.getStrategies();
     }
 
     @Override
@@ -110,7 +111,7 @@ public final class HasNextTraversal<S> implements Traversal.Admin<S, Boolean> {
 
     @Override
     public <S2, E2> Traversal.Admin<S2, E2> removeStep(int index) throws IllegalStateException {
-        return null;
+        return this.hasNextTraversal.removeStep(index);
     }
 
     @Override
@@ -141,7 +142,7 @@ public final class HasNextTraversal<S> implements Traversal.Admin<S, Boolean> {
 
     @Override
     public void setEngine(final TraversalEngine engine) {
-
+        this.hasNextTraversal.setEngine(engine);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b24a9910/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
index f49103d..3b990ca 100644
--- 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
@@ -64,7 +64,7 @@ public class BranchStep<S, E, M> extends ComputerAwareStep<S, E> implements Trav
     @Override
     public List<Traversal.Admin<S, E>> getGlobalChildren() {
         return Collections.unmodifiableList(this.traversalOptions.values().stream()
-                .flatMap(list -> list.stream())
+                .flatMap(List::stream)
                 .collect(Collectors.toList()));
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b24a9910/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
index 39d98ef..92e2993 100644
--- 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
@@ -21,16 +21,17 @@ 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.TraversalParent;
 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.step.util.TraversalComparator;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 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;
@@ -40,7 +41,7 @@ import java.util.stream.Collectors;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S> {
+public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implements ComparatorHolder<S>, TraversalParent {
 
     private final List<Comparator<S>> comparators = new ArrayList<>();
 
@@ -55,12 +56,14 @@ public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implement
 
     @Override
     public void addComparator(final Comparator<S> comparator) {
+        if (comparator instanceof TraversalComparator)
+            this.integrateChild(((TraversalComparator) comparator).getTraversal());
         this.comparators.add(comparator);
     }
 
     @Override
     public List<Comparator<S>> getComparators() {
-        return this.comparators.isEmpty() ? Arrays.asList((Comparator) Order.incr) : this.comparators;
+        return this.comparators.isEmpty() ? Collections.singletonList((Comparator) Order.incr) : this.comparators;
     }
 
     @Override
@@ -73,6 +76,20 @@ public final class OrderGlobalStep<S> extends CollectingBarrierStep<S> implement
         return Collections.singleton(TraverserRequirement.OBJECT);
     }
 
+    @Override
+    public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() {
+        return Collections.unmodifiableList(this.comparators.stream()
+                .filter(comparator -> comparator instanceof TraversalComparator)
+                .map(traversalComparator -> ((TraversalComparator<S, E>) traversalComparator).getTraversal())
+                .collect(Collectors.toList()));
+    }
+
+    @Override
+    public void addLocalChild(final Traversal.Admin<?, ?> localChildTraversal) {
+        throw new UnsupportedOperationException("Use OrderGlobalStep.addComparator(" + TraversalComparator.class.getSimpleName() + ") to add a local child traversal:" + this);
+    }
+
+
     /////
 
     private static class ComparatorTraverser<S> implements Comparator<Traverser<S>>, Serializable {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b24a9910/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
index 2fe164b..046dedf 100644
--- 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
@@ -53,5 +53,9 @@ public final class TraversalComparator<S, E> implements Comparator<S>, Serializa
         clone.traversal = this.traversal.clone();
         return clone;
     }
+
+    public Traversal.Admin<S,E> getTraversal() {
+         return this.traversal;
+    }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/b24a9910/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
index 17e779a..0d18e89 100644
--- 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
@@ -25,8 +25,8 @@ 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.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.util.ArrayList;
@@ -58,8 +58,9 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
 
     public DefaultTraversal(final Graph graph) {
         this.graph = graph;
+        // necessary for anonymous traversals without a source (rethink how this works in the future)
         this.setStrategies(TraversalStrategies.GlobalCache.getStrategies(TraversalStrategies.GlobalCache.getGraphClass(this.graph)));
-        this.traversalEngine = StandardTraversalEngine.instance(); // TODO: remove and then clean up v.outE
+        this.traversalEngine = StandardTraversalEngine.instance();
     }
 
     @Override


[5/8] incubator-tinkerpop git commit: withStrategies() and withoutStrategies() is now part of the TraversalEngine.Builder. JavaDoc.

Posted by ok...@apache.org.
withStrategies() and withoutStrategies() is now part of the TraversalEngine.Builder. JavaDoc.


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

Branch: refs/heads/master
Commit: cf79f6421e82fe78de2f20e5d4b54ea0695e262c
Parents: f0157a5
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue May 5 07:52:41 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue May 5 07:52:41 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/TraversalEngine.java      | 58 +++++++++++++++++---
 .../dsl/graph/GraphTraversalSource.java         | 17 +++---
 .../engine/ComputerTraversalEngine.java         | 13 +++--
 3 files changed, 65 insertions(+), 23 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf79f642/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
index 312103d..85aee2a 100644
--- 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
@@ -27,35 +27,77 @@ import java.util.List;
 import java.util.Optional;
 
 /**
+ * A TraversalEngine is reponsible for executing a {@link Traversal}. There are two {@link Type}s of TraversalEngines.
+ * {@link Type#STANDARD} is the OLTP, iterator-based model of graph traversal.
+ * {@link Type#COMPUTER} is the OLAP, message passing model of graph traversal.
+ * Every {@link TraversalSource} should be provided a {@link TraversalEngine.Builder} so it can construct an engine each spawned {@link Traversal}.
+ *
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
 public interface TraversalEngine extends Serializable {
 
     public enum Type {STANDARD, COMPUTER}
 
+    /**
+     * Get the type of the engine: {@link Type#STANDARD} or {@link Type#COMPUTER}.
+     *
+     * @return the traversal engine type
+     */
     public Type getType();
 
+    /**
+     * If the traversal engine is of type {@link Type#COMPUTER}, then it should have the {@link GraphComputer} used for executing the traversal.
+     *
+     * @return an optional of containing the graph computer to be used for execution.
+     */
     public Optional<GraphComputer> getGraphComputer();
 
+    /**
+     * Whether or not the type is {@link Type#STANDARD}.
+     *
+     * @return whether the engine type is standard (OLTP).
+     */
     public default boolean isStandard() {
         return this.getType().equals(Type.STANDARD);
     }
 
+    /**
+     * Whether or not the type is {@link Type#COMPUTER}.
+     *
+     * @return whether the engine type is computer (OLAP).
+     */
     public default boolean isComputer() {
         return this.getType().equals(Type.COMPUTER);
     }
 
-    public default List<TraversalStrategy> getWithStrategies() {
-        return Collections.emptyList();
-    }
-
-    public default List<Class<? extends TraversalStrategy>> getWithoutStrategies() {
-        return Collections.emptyList();
-    }
-
     ///////////
 
     public interface Builder extends Serializable {
+
+        /**
+         * A list of {@link TraversalStrategy} instances that should be applied to the ultimate {@link Traversal}.
+         *
+         * @return strategies to apply (if any).
+         */
+        public default List<TraversalStrategy> getWithStrategies() {
+            return Collections.emptyList();
+        }
+
+        /**
+         * A list of {@link TraversalStrategy} classes that should not be applied to the ultimate {@link Traversal}.
+         *
+         * @return strategies to not apply (if any).
+         */
+        public default List<Class<? extends TraversalStrategy>> getWithoutStrategies() {
+            return Collections.emptyList();
+        }
+
+        /**
+         * Create the {@link TraversalEngine}.
+         *
+         * @param graph the graph to ultimately have the {@link Traversal} execute over.
+         * @return a {@link TraversalEngine} that is particular to a {@link Traversal}.
+         */
         public TraversalEngine create(final Graph graph);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf79f642/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
index ab67136..570c78c 100644
--- 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
@@ -61,19 +61,18 @@ public class GraphTraversalSource implements TraversalSource {
     ////
 
     private final transient Graph graph;
-    private final TraversalEngine.Builder engine;
+    private final TraversalEngine.Builder engineBuilder;
     private final TraversalStrategies strategies;
     private final List<TraversalStrategy> withStrategies;
     private final List<Class<? extends TraversalStrategy>> withoutStrategies;
 
-    private GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engine, final List<TraversalStrategy> withStrategies, final List<Class<? extends TraversalStrategy>> withoutStrategies) {
+    private GraphTraversalSource(final Graph graph, final TraversalEngine.Builder engineBuilder, final List<TraversalStrategy> withStrategies, final List<Class<? extends TraversalStrategy>> withoutStrategies) {
         this.graph = graph;
-        this.engine = engine;
+        this.engineBuilder = engineBuilder;
         this.withStrategies = withStrategies;
         this.withoutStrategies = withoutStrategies;
-        final TraversalEngine tempEngine = this.engine.create(this.graph);
-        this.withStrategies.addAll(tempEngine.getWithStrategies());
-        this.withoutStrategies.addAll(tempEngine.getWithoutStrategies());
+        this.withStrategies.addAll(engineBuilder.getWithStrategies());
+        this.withoutStrategies.addAll(engineBuilder.getWithoutStrategies());
         final TraversalStrategies tempStrategies = TraversalStrategies.GlobalCache.getStrategies(TraversalStrategies.GlobalCache.getGraphClass(this.graph));
         this.strategies = withStrategies.isEmpty() && withoutStrategies.isEmpty() ?
                 tempStrategies :
@@ -84,7 +83,7 @@ public class GraphTraversalSource implements TraversalSource {
 
     private <S> GraphTraversal.Admin<S, S> generateTraversal() {
         final GraphTraversal.Admin<S, S> traversal = new DefaultGraphTraversal<>(this.graph);
-        final TraversalEngine engine = this.engine.create(this.graph);
+        final TraversalEngine engine = this.engineBuilder.create(this.graph);
         traversal.setEngine(engine);
         traversal.setStrategies(this.strategies);
         return traversal;
@@ -152,7 +151,7 @@ public class GraphTraversalSource implements TraversalSource {
 
     @Override
     public Optional<GraphComputer> getGraphComputer() {
-        return this.engine.create(this.graph).getGraphComputer();
+        return this.engineBuilder.create(this.graph).getGraphComputer();
     }
 
     @Override
@@ -162,7 +161,7 @@ public class GraphTraversalSource implements TraversalSource {
 
     @Override
     public GraphTraversalSource.Builder asBuilder() {
-        final GraphTraversalSource.Builder builder = GraphTraversalSource.build().engine(this.engine);
+        final GraphTraversalSource.Builder builder = GraphTraversalSource.build().engine(this.engineBuilder);
         this.withStrategies.forEach(builder::with);
         this.withoutStrategies.forEach(builder::without);
         return builder;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/cf79f642/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 ec09979..b4aafbb 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
@@ -44,7 +44,7 @@ public final class ComputerTraversalEngine implements TraversalEngine {
     }
 
     @Override
-    public Type getType() {    // TODO: gut this
+    public Type getType() {
         return Type.COMPUTER;
     }
 
@@ -58,11 +58,6 @@ public final class ComputerTraversalEngine implements TraversalEngine {
         return Optional.ofNullable(this.graphComputer);
     }
 
-    @Override
-    public List<TraversalStrategy> getWithStrategies() {
-        return Collections.singletonList(ComputerResultStrategy.instance());
-    }
-
     public static Builder build() {
         return new Builder();
     }
@@ -71,6 +66,12 @@ public final class ComputerTraversalEngine implements TraversalEngine {
 
         private Class<? extends GraphComputer> graphComputerClass;
         private GraphComputer.Isolation isolation = GraphComputer.Isolation.BSP;
+        private static final List<TraversalStrategy> WITH_STRATEGIES = Collections.singletonList(ComputerResultStrategy.instance());
+
+        @Override
+        public List<TraversalStrategy> getWithStrategies() {
+            return WITH_STRATEGIES;
+        }
 
         public Builder computer(final Class<? extends GraphComputer> graphComputerClass) {
             this.graphComputerClass = graphComputerClass;