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:29 UTC

[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.

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;
     }