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 2016/02/13 16:34:59 UTC

[05/17] incubator-tinkerpop git commit: okay. TraversalVertexProgramStep is just like any other step. Nothing 'special'. Its a TraversalParent with one global child -- the traversal to be executed on the GraphComputer. I got rid of TraversalSideEffects.o

okay. TraversalVertexProgramStep is just like any other step. Nothing 'special'. Its a TraversalParent with one global child -- the traversal to be executed on the GraphComputer. I got rid of TraversalSideEffects.onGraphComputer() as again, a traversal can now have OLTP and OLAP components. In its place, we have TraversalHelper.onGraphComputer(traversal) which will tell you if a parent of the traversal is a TraversalVertexProgramStep. this model is really really nice as it all falls within the natural construts of our Traversal API -- no new interfaces needed, no weird two sets of strategies, no weird two sets of sideEffects... Its really clean.


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

Branch: refs/heads/master
Commit: 080863a5837d94417b9f9fc17d0476defab56e63
Parents: 6cbd8a5
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Feb 10 15:23:02 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Feb 10 15:23:02 2016 -0700

----------------------------------------------------------------------
 .../GephiTraversalVisualizationStrategy.groovy  |  2 +-
 .../traversal/step/map/ComputerResultStep.java  |  4 +--
 .../step/map/TraversalVertexProgramStep.java    | 33 ++++++++++----------
 .../gremlin/process/traversal/Traversal.java    |  2 +-
 .../process/traversal/TraversalStrategies.java  |  4 ---
 .../dsl/graph/GraphTraversalSource.java         |  2 +-
 .../traversal/step/sideEffect/ProfileStep.java  |  5 +--
 .../decoration/RequirementsStrategy.java        |  6 ++++
 .../finalization/LazyBarrierStrategy.java       |  2 +-
 .../TraversalVertexProgramStrategy.java         |  7 +++--
 .../optimization/MatchPredicateStrategy.java    |  2 +-
 .../ComputerVerificationStrategy.java           | 12 ++++---
 .../traversal/util/DefaultTraversal.java        |  2 +-
 .../process/traversal/util/TraversalHelper.java | 11 +++++++
 .../ComputerVerificationStrategyTest.java       |  3 ++
 .../traversal/step/sideEffect/ProfileTest.java  |  3 +-
 .../optimization/Neo4jGraphStepStrategy.java    |  3 --
 .../optimization/TinkerGraphStepStrategy.java   |  2 +-
 .../structure/TinkerGraphPlayTest.java          |  2 +-
 19 files changed, 64 insertions(+), 43 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
----------------------------------------------------------------------
diff --git a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
index 9f3c843..319500e 100644
--- a/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
+++ b/gremlin-console/src/main/groovy/org/apache/tinkerpop/gremlin/console/plugin/GephiTraversalVisualizationStrategy.groovy
@@ -66,7 +66,7 @@ class GephiTraversalVisualizationStrategy extends AbstractTraversalStrategy<Trav
 
     @Override
     void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getStrategies().onGraphComputer())
+        if (TraversalHelper.onGraphComputer(traversal))
             return
 
         // only apply these strategies if the traversal was :submit to the acceptor - otherwise process as usual

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
index 227163d..323f9d8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/ComputerResultStep.java
@@ -32,9 +32,9 @@ import org.apache.tinkerpop.gremlin.structure.Element;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
+import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -50,7 +50,7 @@ public final class ComputerResultStep<S> extends AbstractStep<ComputerResult, S>
 
 
     private final boolean attachElements; // should be part of graph computer with "propagate properties"
-    private Iterator<Traverser.Admin<S>> currentIterator = Collections.emptyIterator();
+    private Iterator<Traverser.Admin<S>> currentIterator = EmptyIterator.instance();
 
     public ComputerResultStep(final Traversal.Admin traversal, final boolean attachElements) {
         super(traversal);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
index dba99ef..f9eb461 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
@@ -24,41 +24,39 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-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.step.util.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.TraversalVertexProgramStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
+import java.util.Collections;
+import java.util.List;
 import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class TraversalVertexProgramStep<S> extends AbstractStep<S, ComputerResult> {
+public final class TraversalVertexProgramStep<S> extends AbstractStep<S, ComputerResult> implements TraversalParent {
 
     public Traversal.Admin<S, ?> computerTraversal;
-    private final GraphComputer graphComputer;
+    private final transient GraphComputer graphComputer;
     private boolean first = true;
 
     public TraversalVertexProgramStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> computerTraversal, final GraphComputer graphComputer) {
         super(traversal);
         this.graphComputer = graphComputer;
-        this.computerTraversal = computerTraversal;
-        this.computerTraversal.getSideEffects().mergeInto(this.getTraversal().getSideEffects());
-        this.computerTraversal.setSideEffects(this.getTraversal().getSideEffects());
-        TraversalStrategies strategies = this.getTraversal().getStrategies().clone();
-        strategies.removeStrategies(TraversalVertexProgramStrategy.class);
-        strategies.addStrategies(ComputerVerificationStrategy.instance());
-        this.computerTraversal.setStrategies(strategies);
-        this.computerTraversal.applyStrategies();
+        this.computerTraversal = this.integrateChild(computerTraversal);
+    }
+
+    public List<Traversal.Admin<?, ?>> getGlobalChildren() {
+        return Collections.singletonList(this.computerTraversal);
     }
 
     @Override
     protected Traverser<ComputerResult> processNextStart() {
+
         if (this.first) { // && previousStep EmptyStep
             try {
                 this.first = false;
@@ -73,17 +71,18 @@ public final class TraversalVertexProgramStep<S> extends AbstractStep<S, Compute
 
     @Override
     public String toString() {
-        return StringFactory.stepString(this, this.computerTraversal);
+        return StringFactory.stepString(this, this.computerTraversal, this.graphComputer);
     }
 
-    /*@Override
+    @Override
     public TraversalVertexProgramStep<S> clone() {
         final TraversalVertexProgramStep<S> clone = (TraversalVertexProgramStep<S>) super.clone();
         clone.computerTraversal = this.integrateChild(this.computerTraversal.clone());
         return clone;
-    }*/
+    }
 
+    @Override
     public Set<TraverserRequirement> getRequirements() {
-        return this.computerTraversal.getTraverserRequirements();
+        return TraversalParent.super.getSelfAndChildRequirements(TraverserRequirement.BULK);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
index c4016a7..66c3728 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -365,7 +365,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
                 requirements.add(TraverserRequirement.SIDE_EFFECTS);
             if (null != this.getSideEffects().getSackInitialValue())
                 requirements.add(TraverserRequirement.SACK);
-            if (this.getStrategies().onGraphComputer())
+            if (TraversalHelper.onGraphComputer(this))
                 requirements.add(TraverserRequirement.BULK);
             if (requirements.contains(TraverserRequirement.ONE_BULK))
                 requirements.remove(TraverserRequirement.BULK);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/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 a6c1a1e..c8eb617 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
@@ -62,10 +62,6 @@ public interface TraversalStrategies extends Serializable, Cloneable {
      */
     public List<TraversalStrategy<?>> toList();
 
-    public default boolean onGraphComputer() {
-        return toList().stream().filter(strategy -> strategy instanceof ComputerVerificationStrategy).findAny().isPresent();
-    }
-
     /**
      * Apply all the {@link TraversalStrategy} optimizers to the {@link Traversal} for the stated {@link TraversalEngine}.
      * This method must ensure that the strategies are sorted prior to application.

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/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 17207c4..97c3f19 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
@@ -99,7 +99,7 @@ public class GraphTraversalSource implements TraversalSource {
     @Override
     public GraphTraversalSource withComputer(final Function<Graph, GraphComputer> graphComputerFunction) {
         final GraphTraversalSource clone = this.clone();
-        clone.strategies.addStrategies(new TraversalVertexProgramStrategy(graphComputerFunction));
+        clone.strategies.addStrategies(new TraversalVertexProgramStrategy(graphComputerFunction), ComputerVerificationStrategy.instance());
         return clone;
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
index ab8e2ae..5b468dc 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
@@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -104,7 +105,7 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MapReduc
         if (traversalMetrics == null) {
             // look up the TraversalMetrics in the root traversal's sideEffects
             Traversal t = this.getTraversal();
-            while (!(t.asAdmin().getParent() instanceof EmptyStep)) {
+            while (!(t.asAdmin().getParent() instanceof TraversalVertexProgramStep)) {
                 t = t.asAdmin().getParent().asStep().getTraversal();
             }
             traversalMetrics = t.asAdmin().getSideEffects().<StandardTraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
@@ -117,7 +118,7 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MapReduc
             return;
         }
 
-        if (!(this.getTraversal().getParent() instanceof EmptyStep)) {
+        if (!(this.getTraversal().getParent() instanceof TraversalVertexProgramStep) && !(this.getTraversal().getParent() instanceof EmptyStep)) {
             // Initialization is handled at the top-level of the traversal only.
             return;
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
index bfd4853..efb28bf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/RequirementsStrategy.java
@@ -25,8 +25,10 @@ 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.step.util.RequirementsStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.TraversalVertexProgramStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.Set;
 
@@ -56,4 +58,8 @@ public final class RequirementsStrategy extends AbstractTraversalStrategy<Traver
             strategy.requirements.add(requirement);
         }
     }
+
+    public Set<Class<? extends DecorationStrategy>> applyPost() {
+        return Collections.singleton(TraversalVertexProgramStrategy.class);
+    }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
index c7cc700..4a9ed8a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/LazyBarrierStrategy.java
@@ -61,7 +61,7 @@ public final class LazyBarrierStrategy extends AbstractTraversalStrategy<Travers
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getStrategies().onGraphComputer())
+        if (TraversalHelper.onGraphComputer(traversal))
             return;
 
         if (traversal.getTraverserRequirements().contains(TraverserRequirement.PATH))

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/TraversalVertexProgramStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/TraversalVertexProgramStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/TraversalVertexProgramStrategy.java
index 60cfa53..29da95e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/TraversalVertexProgramStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/TraversalVertexProgramStrategy.java
@@ -30,6 +30,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversal
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
@@ -53,15 +54,17 @@ public final class TraversalVertexProgramStrategy extends AbstractTraversalStrat
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        traversal.addTraverserRequirement(TraverserRequirement.BULK); // all computer traversals require bulking
         if (traversal.getParent() instanceof EmptyStep) {
             if (null != this.graphComputerFunction) {   // if the function is null, then its been serialized and thus, already in a graph computer
                 Traversal.Admin<?, ?> newTraversal = new DefaultTraversal<>();
                 TraversalHelper.removeToTraversal(traversal.getStartStep(), EmptyStep.instance(), (Traversal.Admin) newTraversal);
                 traversal.addStep(new TraversalVertexProgramStep<>(traversal, newTraversal, this.graphComputerFunction.apply(traversal.getGraph().get())));
                 traversal.addStep(new ComputerResultStep<>(traversal, true));
-            } else {
+            } else {  // this is a total hack to trick the difference between TraversalVertexProgram via GraphComputer and via TraversalSource. :|
+                traversal.setParent(new TraversalVertexProgramStep<>(EmptyTraversal.instance(),EmptyTraversal.instance(),null));
                 ComputerVerificationStrategy.instance().apply(traversal);
+                traversal.setParent(EmptyStep.instance());
+                traversal.addTraverserRequirement(TraverserRequirement.BULK);
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategy.java
index c060ef6..f025749 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/MatchPredicateStrategy.java
@@ -80,7 +80,7 @@ public final class MatchPredicateStrategy extends AbstractTraversalStrategy<Trav
                     traversal.removeStep(nextStep);
                     matchStep.addGlobalChild(new DefaultTraversal<>().addStep(nextStep));
                     nextStep = matchStep.getNextStep();
-                } else if (nextStep instanceof DedupGlobalStep && !((DedupGlobalStep) nextStep).getScopeKeys().isEmpty() && ((DedupGlobalStep) nextStep).getLocalChildren().isEmpty() && !traversal.getStrategies().onGraphComputer()) {
+                } else if (nextStep instanceof DedupGlobalStep && !((DedupGlobalStep) nextStep).getScopeKeys().isEmpty() && ((DedupGlobalStep) nextStep).getLocalChildren().isEmpty() && !TraversalHelper.onGraphComputer(traversal)) {
                     traversal.removeStep(nextStep);
                     matchStep.setDedupLabels(((DedupGlobalStep<?>) nextStep).getScopeKeys());
                     nextStep = matchStep.getNextStep();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/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 40ceb58..b8b8be4 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.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -43,7 +44,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.VertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.SupplyingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
@@ -82,12 +83,15 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
 
-        if (traversal.getParent().isLocalChild(traversal))  // only process global children as local children are standard semantics
+        if (!TraversalHelper.onGraphComputer(traversal) || traversal.getParent().isLocalChild(traversal))  // only process global children as local children are standard semantics
             return;
 
         Step<?, ?> endStep = traversal.getEndStep();
+        while (endStep instanceof ComputerAwareStep.EndStep) {
+            endStep = endStep.getPreviousStep();
+        }
 
-        if (traversal.getParent() instanceof EmptyStep) {
+        if (traversal.getParent() instanceof TraversalVertexProgramStep) {
             if (!(traversal.getStartStep() instanceof GraphStep))
                 throw new VerificationException("GraphComputer does not support traversals starting from a non-GraphStep: " + traversal.getStartStep(), traversal);
             ///
@@ -108,7 +112,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
         }
 
         for (final Step<?, ?> step : traversal.getSteps()) {
-            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep || step instanceof OrderGlobalStep || step instanceof RangeGlobalStep || step instanceof TailGlobalStep || step instanceof DedupGlobalStep) && (step != endStep || !(traversal.getParent() instanceof EmptyStep)))
+            if ((step instanceof ReducingBarrierStep || step instanceof SupplyingBarrierStep || step instanceof OrderGlobalStep || step instanceof RangeGlobalStep || step instanceof TailGlobalStep || step instanceof DedupGlobalStep) && (step != endStep || !(traversal.getParent() instanceof TraversalVertexProgramStep)))
                 throw new VerificationException("Global traversals on GraphComputer may not contain mid-traversal barriers: " + step, traversal);
 
             if (step instanceof DedupGlobalStep && !((DedupGlobalStep) step).getLocalChildren().isEmpty())

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/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 b05089b..d783f43 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
@@ -109,7 +109,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
             requirements.add(TraverserRequirement.SIDE_EFFECTS);
         if (null != this.getSideEffects().getSackInitialValue())
             requirements.add(TraverserRequirement.SACK);
-        if (this.strategies.onGraphComputer())
+        if (TraversalHelper.onGraphComputer(this))
             requirements.add(TraverserRequirement.BULK);
         if (requirements.contains(TraverserRequirement.ONE_BULK))
             requirements.remove(TraverserRequirement.BULK);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index cd7b740..f35496a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder;
@@ -467,4 +468,14 @@ public final class TraversalHelper {
         return variables;
     }
 
+    public static boolean onGraphComputer(Traversal.Admin<?, ?> traversal) {
+        if (traversal.getParent().asStep() instanceof TraversalVertexProgramStep)
+            return true;
+        while (!((traversal.getParent()) instanceof EmptyStep)) {
+            if (traversal.getParent().asStep() instanceof TraversalVertexProgramStep)
+                return true;
+            traversal = traversal.getParent().asStep().getTraversal();
+        }
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategyTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategyTest.java
index 5b221d6..61abfd4 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategyTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategyTest.java
@@ -18,10 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
+import org.apache.tinkerpop.gremlin.process.traversal.util.EmptyTraversal;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -58,6 +60,7 @@ public class ComputerVerificationStrategyTest {
         try {
             final TraversalStrategies strategies = new DefaultTraversalStrategies();
             strategies.addStrategies(ComputerVerificationStrategy.instance());
+            traversal.asAdmin().setParent(new TraversalVertexProgramStep<>(EmptyTraversal.instance(), EmptyTraversal.instance(), null)); // trick it
             traversal.asAdmin().setStrategies(strategies);
             traversal.asAdmin().applyStrategies();
             fail("The strategy should not allow traversal: " + this.traversal);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
index 39e012d..44bb7f6 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
@@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.junit.Test;
@@ -298,7 +299,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         t.iterate();
         assertTrue(mockStep.callbackCalled);
 
-        if (!t.asAdmin().getStrategies().onGraphComputer()) {
+        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
             final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
             assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
----------------------------------------------------------------------
diff --git a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
index 71712fd..f468414 100644
--- a/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
+++ b/neo4j-gremlin/src/main/java/org/apache/tinkerpop/gremlin/neo4j/process/traversal/strategy/optimization/Neo4jGraphStepStrategy.java
@@ -40,9 +40,6 @@ public final class Neo4jGraphStepStrategy extends AbstractTraversalStrategy<Trav
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getStrategies().onGraphComputer())
-            return;
-
         TraversalHelper.getStepsOfClass(GraphStep.class, traversal).forEach(originalGraphStep -> {
             final Neo4jGraphStep<?, ?> neo4jGraphStep = new Neo4jGraphStep<>(originalGraphStep);
             TraversalHelper.replaceStep(originalGraphStep, (Step) neo4jGraphStep, traversal);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/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 6347fe7..c01dec5 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
@@ -39,7 +39,7 @@ public final class TinkerGraphStepStrategy extends AbstractTraversalStrategy<Tra
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getStrategies().onGraphComputer())
+        if (TraversalHelper.onGraphComputer(traversal))
             return;
 
         TraversalHelper.getStepsOfClass(GraphStep.class, traversal).forEach(originalGraphStep -> {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/080863a5/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index da4f357..773a5ae 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -69,7 +69,7 @@ public class TinkerGraphPlayTest {
         Graph graph = TinkerFactory.createModern();
         GraphTraversalSource g = graph.traversal().withComputer(); //GraphTraversalSource.computer());
         //System.out.println(g.V().outE("knows").identity().inV().count().is(P.eq(5)).explain());
-        System.out.println(g.V().repeat(groupCount("m").by("name").out()).times(2).cap("m").toList());
+        System.out.println(g.withBulk(false).withSack(1, Operator.sum).V().out().barrier().sack().toList());
 
     }