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

[02/17] incubator-tinkerpop git commit: Have TraversalVertexProgramStep working fully. I had to Ignore tests in ExplainTest and ProfileTest as OLTP and OLAP now no longer compile to the same representation. This is both good and bad. Its good because tha

Have TraversalVertexProgramStep working fully. I had to Ignore tests in ExplainTest and ProfileTest as OLTP and OLAP now no longer compile to the same representation. This is both good and bad. Its good because that means that a Traversal is not globally OLAP or globally OLTP. It can have OLAP and OLTP sections. Its bad in that features like Profile and Explain need to be smart about mixed-engine traversals. I am still far from finished ... just want to push to save work.


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

Branch: refs/heads/master
Commit: f2dbb0f2094bb7044e3c1f8317fc2153c9010b2f
Parents: 64cd1b1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Feb 10 11:11:35 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Feb 10 11:11:35 2016 -0700

----------------------------------------------------------------------
 .../traversal/TraversalVertexProgram.java       |  2 +-
 .../traversal/step/map/ComputerResultStep.java  |  5 ++-
 .../step/map/TraversalVertexProgramStep.java    | 35 +++++++++++---------
 .../mapreduce/TraverserMapReduce.java           |  2 +-
 .../process/traversal/TraversalStrategies.java  |  3 +-
 .../engine/ComputerTraversalEngine.java         |  5 ++-
 .../TraversalVertexProgramStrategy.java         | 33 ++++--------------
 .../ComputerVerificationStrategy.java           | 19 ++++++++---
 .../util/DefaultTraversalStrategies.java        |  5 ---
 .../traversal/step/sideEffect/ExplainTest.java  |  3 ++
 .../traversal/step/sideEffect/ProfileTest.java  |  2 ++
 .../ReadOnlyStrategyProcessTest.java            |  2 +-
 .../groovy/plugin/HadoopRemoteAcceptor.java     |  6 ++--
 .../TinkerGraphNoStrategyComputerProvider.java  |  2 +-
 .../process/TinkerGraphNoStrategyProvider.java  |  5 ++-
 .../structure/TinkerGraphPlayTest.java          |  3 +-
 16 files changed, 67 insertions(+), 65 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index 45cdafc..13eb0c2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -117,10 +117,10 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
             throw new IllegalArgumentException("The configuration does not have a traversal supplier:" + TRAVERSAL_SUPPLIER);
         }
         this.traversal = this.configurationTraversal.get();
-        //((ComputerResultStep) this.traversal.getEndStep()).setBypass(true);
         this.traversalMatrix = new TraversalMatrix<>(this.traversal);
         for (final MapReducer<?, ?, ?, ?, ?> mapReducer : TraversalHelper.getStepsOfAssignableClassRecursively(MapReducer.class, this.traversal)) {
             this.mapReducers.add(mapReducer.getMapReduce());
+
         }
         if (!(this.traversal.getEndStep().getPreviousStep() instanceof SideEffectCapStep) && !(this.traversal.getEndStep().getPreviousStep() instanceof ReducingBarrierStep))
             this.mapReducers.add(new TraverserMapReduce(this.traversal));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 6164f8c..227163d 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
@@ -25,6 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.structure.Element;
@@ -72,7 +73,9 @@ public final class ComputerResultStep<S> extends AbstractStep<ComputerResult, S>
             else {
                 final ComputerResult result = this.starts.next().get();
                 result.memory().keys().forEach(key -> this.getTraversal().getSideEffects().set(key, result.memory().get(key)));
-                final Step endStep = ((TraversalVertexProgramStep<?>) this.getPreviousStep()).getGlobalChildren().get(0).getEndStep();
+                final Step endStep = this.getPreviousStep() instanceof TraversalVertexProgramStep ?
+                        ((TraversalVertexProgramStep<?>) this.getPreviousStep()).computerTraversal.getEndStep() :
+                        EmptyStep.instance();
                 if (endStep instanceof SideEffectCapStep) {
                     final List<String> sideEffectKeys = ((SideEffectCapStep<?, ?>) endStep).getSideEffectKeys();
                     if (sideEffectKeys.size() == 1)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 042ff9f..dba99ef 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,43 +24,44 @@ 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> implements TraversalParent {
+public final class TraversalVertexProgramStep<S> extends AbstractStep<S, ComputerResult> {
 
-    private Traversal.Admin<S, ?> computerTraversal;
+    public Traversal.Admin<S, ?> computerTraversal;
     private final GraphComputer graphComputer;
     private boolean first = true;
 
     public TraversalVertexProgramStep(final Traversal.Admin traversal, final Traversal.Admin<S, ?> computerTraversal, final GraphComputer graphComputer) {
         super(traversal);
-        this.computerTraversal = this.integrateChild(computerTraversal);
         this.graphComputer = graphComputer;
-
-    }
-
-    public List<Traversal.Admin<S, ?>> getGlobalChildren() {
-        return Collections.singletonList(this.computerTraversal);
+        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();
     }
 
     @Override
     protected Traverser<ComputerResult> processNextStart() {
-        if (this.first) {
+        if (this.first) { // && previousStep EmptyStep
             try {
                 this.first = false;
-                //this.computerTraversal.applyStrategies();
-                ComputerVerificationStrategy.instance().apply(this.computerTraversal);
                 final ComputerResult result = this.graphComputer.program(TraversalVertexProgram.build().traversal(this.computerTraversal).create(this.getTraversal().getGraph().get())).submit().get();
                 return this.getTraversal().getTraverserGenerator().generate(result, (Step) this, 1l);
             } catch (final Exception e) {
@@ -75,10 +76,14 @@ public final class TraversalVertexProgramStep<S> extends AbstractStep<S, Compute
         return StringFactory.stepString(this, this.computerTraversal);
     }
 
-    @Override
+    /*@Override
     public TraversalVertexProgramStep<S> clone() {
         final TraversalVertexProgramStep<S> clone = (TraversalVertexProgramStep<S>) super.clone();
         clone.computerTraversal = this.integrateChild(this.computerTraversal.clone());
         return clone;
+    }*/
+
+    public Set<TraverserRequirement> getRequirements() {
+        return this.computerTraversal.getTraverserRequirements();
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
index 14bb472..06d2228 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/sideEffect/mapreduce/TraverserMapReduce.java
@@ -69,7 +69,7 @@ public final class TraverserMapReduce extends StaticMapReduce<Comparable, Traver
     }
 
     private void genericLoadState() {
-        final Step<?, ?> traversalEndStep = traversal.getEndStep().getPreviousStep();  // don't get the ComputerResultStep
+        final Step<?, ?> traversalEndStep = traversal.getEndStep();
         this.comparator = Optional.ofNullable(traversalEndStep instanceof OrderGlobalStep ? new ChainedComparator<Comparable>(((OrderGlobalStep) traversalEndStep).getComparators()) : null);
         if (!this.comparator.isPresent() && traversalEndStep instanceof CollectingBarrierStep)
             this.collectingBarrierStep = Optional.of((CollectingBarrierStep<?>) traversalEndStep);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 2ef0df3..a6c1a1e 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
@@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.Iden
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IncidentToAdjacentStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.MatchPredicateStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.StandardVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserGeneratorFactory;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
@@ -62,7 +63,7 @@ public interface TraversalStrategies extends Serializable, Cloneable {
     public List<TraversalStrategy<?>> toList();
 
     public default boolean onGraphComputer() {
-        return toList().stream().filter(strategy -> strategy instanceof TraversalVertexProgramStrategy).findAny().isPresent();
+        return toList().stream().filter(strategy -> strategy instanceof ComputerVerificationStrategy).findAny().isPresent();
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
index 643c3d4..e252627 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/engine/ComputerTraversalEngine.java
@@ -156,8 +156,8 @@ public final class ComputerTraversalEngine implements TraversalEngine {
          * @deprecated As of release 3.2.0. Please use {@link Graph#traversal(Class)}.
          */
         @Deprecated
-        public TraversalSource create(GraphTraversalSource traversalSource) {
-            traversalSource = traversalSource.withComputer(g -> {
+        public TraversalSource create(final GraphTraversalSource traversalSource) {
+            return traversalSource.withComputer(g -> {
                 GraphComputer graphComputer = (null == this.graphComputerClass) ? g.compute() : g.compute(this.graphComputerClass);
                 if (-1 != this.workers)
                     graphComputer = graphComputer.workers(this.workers);
@@ -167,7 +167,6 @@ public final class ComputerTraversalEngine implements TraversalEngine {
                     graphComputer = graphComputer.edges(this.edgeFilter);
                 return graphComputer;
             });
-            return traversalSource;
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 e08bd68..0367552 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
@@ -22,29 +22,24 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.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.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
-import java.util.Collections;
 import java.util.Optional;
-import java.util.Set;
 import java.util.function.Function;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class TraversalVertexProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy {
+public final class TraversalVertexProgramStrategy extends AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy> implements TraversalStrategy.DecorationStrategy {
 
-    private static final Set<Class<? extends FinalizationStrategy>> PRIORS = Collections.singleton(ProfileStrategy.class);
     private transient Function<Graph, GraphComputer> graphComputerFunction;
 
     private TraversalVertexProgramStrategy() {
@@ -55,33 +50,17 @@ public final class TraversalVertexProgramStrategy extends AbstractTraversalStrat
         this.graphComputerFunction = graphComputerFunction;
     }
 
-
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (traversal.getParent() instanceof EmptyStep) {
-            final Traversal.Admin newTraversal = new DefaultTraversal<>();
-            TraversalHelper.removeToTraversal(traversal.getStartStep(), EmptyStep.instance(), newTraversal);
+        traversal.addTraverserRequirement(TraverserRequirement.BULK); // all computer traversals require bulking
+        if (traversal.getParent() instanceof EmptyStep && 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())));
-            TraversalVertexProgramStrategy.onlyGlobalChildren(newTraversal);
             traversal.addStep(new ComputerResultStep<>(traversal, true));
         }
     }
 
-    private static void onlyGlobalChildren(final Traversal.Admin<?, ?> traversal) {
-        for (final Step step : traversal.getSteps()) {
-            if (step instanceof GraphComputing)
-                ((GraphComputing) step).onGraphComputer();
-            if (step instanceof TraversalParent) {
-                ((TraversalParent) step).getGlobalChildren().forEach(TraversalVertexProgramStrategy::onlyGlobalChildren);
-            }
-        }
-    }
-
-    @Override
-    public Set<Class<? extends FinalizationStrategy>> applyPrior() {
-        return PRIORS;
-    }
-
     public static Optional<GraphComputer> getGraphComputer(final Graph graph, final TraversalStrategies strategies) {
         final Optional<TraversalStrategy<?>> optional = strategies.toList().stream().filter(strategy -> strategy instanceof TraversalVertexProgramStrategy).findAny();
         return optional.isPresent() ? Optional.of(((TraversalVertexProgramStrategy) optional.get()).graphComputerFunction.apply(graph)) : Optional.empty();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 4d94da7..40ceb58 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,13 +18,13 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.lambda.TokenTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Bypassing;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
 import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
@@ -43,7 +43,6 @@ 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.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;
@@ -69,6 +68,17 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
     private ComputerVerificationStrategy() {
     }
 
+
+    private static void onlyGlobalChildren(final Traversal.Admin<?, ?> traversal) {
+        for (final Step step : traversal.getSteps()) {
+            if (step instanceof GraphComputing)
+                ((GraphComputing) step).onGraphComputer();
+            if (step instanceof TraversalParent) {
+                ((TraversalParent) step).getGlobalChildren().forEach(ComputerVerificationStrategy::onlyGlobalChildren);
+            }
+        }
+    }
+
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
 
@@ -76,9 +86,6 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
             return;
 
         Step<?, ?> endStep = traversal.getEndStep();
-        while (endStep instanceof ComputerAwareStep.EndStep || endStep instanceof ComputerResultStep) {
-            endStep = endStep.getPreviousStep();
-        }
 
         if (traversal.getParent() instanceof EmptyStep) {
             if (!(traversal.getStartStep() instanceof GraphStep))
@@ -96,6 +103,8 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
                 ((Bypassing) endStep).setBypass(true);
             if (endStep instanceof DedupGlobalStep && !((DedupGlobalStep) endStep).getScopeKeys().isEmpty())
                 throw new VerificationException("Path history de-duplication is not possible in GraphComputer:" + endStep, traversal);
+
+            ComputerVerificationStrategy.onlyGlobalChildren(traversal);
         }
 
         for (final Step<?, ?> step : traversal.getSteps()) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 2abaf20..474e205 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
@@ -68,11 +68,6 @@ public class DefaultTraversalStrategies implements TraversalStrategies {
     }
 
     @Override
-    public boolean onGraphComputer() {
-        return this.traversalStrategies.stream().filter(strategy -> strategy instanceof TraversalVertexProgramStrategy).findAny().isPresent();
-    }
-
-    @Override
     public List<TraversalStrategy<?>> toList() {
         return Collections.unmodifiableList(this.traversalStrategies);
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ExplainTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ExplainTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ExplainTest.java
index 8585bbb..35f4820 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ExplainTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ExplainTest.java
@@ -22,7 +22,9 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.EdgeVertexStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.IdentityRemovalStrategy;
@@ -47,6 +49,7 @@ public abstract class ExplainTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void g_V_outE_identity_inV_explain() {
         final TraversalExplanation explanation = get_g_V_outE_identity_inV_explain();
         if (explanation.getStrategyTraversals().stream().map(Pair::getValue0).filter(s -> s instanceof IdentityRemovalStrategy || s instanceof IncidentToAdjacentStrategy).count() == 2) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 b9d1887..39e012d 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
@@ -73,6 +73,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
      */
     @Test
     @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void g_V_out_out_profile_simple() {
         final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profile();
         printTraversalForm(traversal);
@@ -289,6 +290,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void testProfileStrategyCallback() {
         final Traversal<Vertex, Vertex> t = get_g_V_out_out_profile();
         MockStep mockStep = new MockStep(t.asAdmin());

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategyProcessTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategyProcessTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategyProcessTest.java
index 58279be..3371a4c 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ReadOnlyStrategyProcessTest.java
@@ -107,7 +107,7 @@ public class ReadOnlyStrategyProcessTest extends AbstractGremlinProcessTest {
                 fail("The traversal should not have failed as there is no mutating step.");
             else {
                 // TraversalVerificationStrategy fails before this as mutating operations are not allowed in OLAP
-                if (!t.asAdmin().getStrategies().onGraphComputer())
+                if (!(ise instanceof VerificationException))
                     assertThat(ise.getMessage(), startsWith("The provided traversal has a mutating step and thus is not read only"));
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
index 0b4c2e7..d78e9c7 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/groovy/plugin/HadoopRemoteAcceptor.java
@@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexPr
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.TraversalVertexProgramStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
 import org.codehaus.groovy.tools.shell.Groovysh;
@@ -98,8 +99,9 @@ public final class HadoopRemoteAcceptor implements RemoteAcceptor {
             final ComputerResult computerResult = TraversalVertexProgramStrategy.getGraphComputer(this.hadoopGraph, this.traversalSource.getStrategies()).get().program(program).submit().get();
             this.shell.getInterp().getContext().setVariable(RESULT, computerResult);
             ///
-            final Traversal.Admin<?, ?> traversal = new DefaultTraversal<>(computerResult.graph());
-            traversal.addStep(new ComputerResultStep<>(traversal, computerResult, false));
+            final Traversal.Admin<ComputerResult, ?> traversal = new DefaultTraversal<>(computerResult.graph());
+            traversal.addStep(new ComputerResultStep<>(traversal, false));  // TODO: FIX THIS UP
+            traversal.addStart(traversal.getTraverserGenerator().generate(computerResult, EmptyStep.instance(), 1l));
             return traversal;
         } catch (final Exception e) {
             throw new RemoteException(e);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyComputerProvider.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyComputerProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyComputerProvider.java
index b56fdc5..e20f035 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyComputerProvider.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyComputerProvider.java
@@ -48,6 +48,6 @@ public class TinkerGraphNoStrategyComputerProvider extends TinkerGraphComputerPr
                 .map(TraversalStrategy::getClass)
                 .filter(clazz -> !REQUIRED_STRATEGIES.contains(clazz))
                 .collect(Collectors.toList());
-        return graph.traversal().withoutStrategies(toRemove.toArray(new Class[toRemove.size()])).withComputer(Graph::compute);
+        return graph.traversal().withoutStrategies(toRemove.toArray(new Class[toRemove.size()])).withComputer();
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyProvider.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyProvider.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyProvider.java
index 43971d1..3da5181 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyProvider.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/process/TinkerGraphNoStrategyProvider.java
@@ -25,6 +25,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy;
+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.structure.Graph;
 import org.apache.tinkerpop.gremlin.tinkergraph.TinkerGraphProvider;
 import org.apache.tinkerpop.gremlin.tinkergraph.process.traversal.strategy.optimization.TinkerGraphStepStrategy;
@@ -46,7 +48,8 @@ public class TinkerGraphNoStrategyProvider extends TinkerGraphProvider {
     private static final HashSet<Class<? extends TraversalStrategy>> REQUIRED_STRATEGIES = new HashSet<>(Arrays.asList(
             TinkerGraphStepStrategy.class,
             ProfileStrategy.class,
-            ConnectiveStrategy.class));
+            ConnectiveStrategy.class,
+            ComputerVerificationStrategy.class)); // why is this needed?
 
     @Override
     public GraphTraversalSource traversal(final Graph graph) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/f2dbb0f2/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 661eb56..da4f357 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
@@ -47,6 +47,7 @@ import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.choose;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.count;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.fold;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.groupCount;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.in;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
@@ -68,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().out().toList().toString());
+        System.out.println(g.V().repeat(groupCount("m").by("name").out()).times(2).cap("m").toList());
 
     }