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/03/22 16:37:37 UTC

incubator-tinkerpop git commit: Profiling and local traversals now working with OLAP. This is done, done now. Have a ComputerVerificaitonStrategy that doesn't allow profiling of multi-OLAP job traversals. In the future, we will get that to work. Cleaned

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1199 781a676cc -> 42ab8bd60


Profiling and local traversals now working with OLAP. This is done, done now. Have a ComputerVerificaitonStrategy that doesn't allow profiling of multi-OLAP job traversals. In the future, we will get that to work. Cleaned up the naming of the ProfileTest methods and added some more.


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

Branch: refs/heads/TINKERPOP-1199
Commit: 42ab8bd60bdce7e8c0260ecc508a48c71816cd02
Parents: 781a676
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 09:37:25 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 09:37:25 2016 -0600

----------------------------------------------------------------------
 .../traversal/TraversalVertexProgram.java       |  14 +-
 .../step/filter/WhereTraversalStep.java         |   5 +-
 .../step/sideEffect/ProfileSideEffectStep.java  |  14 +-
 .../traversal/step/util/ProfileStep.java        |  44 ++--
 .../ComputerVerificationStrategy.java           |  11 +-
 .../traversal/util/DefaultTraversal.java        |   7 +-
 .../traversal/util/DefaultTraversalMetrics.java |   2 +-
 .../process/traversal/util/TraversalHelper.java |  12 +
 .../gremlin/structure/io/gryo/GryoMapper.java   |  45 +++-
 .../util/function/MutableMetricsSupplier.java   |  44 ++++
 .../traversal/step/map/GroovyProfileTest.groovy |  35 +--
 .../process/traversal/step/map/MatchTest.java   |   9 +-
 .../process/traversal/step/map/ProfileTest.java | 228 +++++++++----------
 .../gremlin/hadoop/structure/HadoopGraph.java   |   8 +-
 .../structure/TinkerGraphPlayTest.java          |   9 +-
 15 files changed, 279 insertions(+), 208 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/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 fbe5592..d26ef59 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
@@ -62,7 +62,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Vertex
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.PureTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -76,6 +75,7 @@ import org.apache.tinkerpop.gremlin.structure.util.Attachable;
 import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.util.function.MutableMetricsSupplier;
 import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
@@ -159,10 +159,9 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
         for (final MemoryComputing<?> memoryComputing : TraversalHelper.getStepsOfAssignableClassRecursively(MemoryComputing.class, this.traversal.get())) {
             this.memoryComputeKeys.add(memoryComputing.getMemoryComputeKey());
         }
-        // register profile steps
+        // register profile steps (TODO: try to hide this)
         for (final ProfileStep profileStep : TraversalHelper.getStepsOfAssignableClassRecursively(ProfileStep.class, this.traversal.get())) {
-            this.traversal.get().getSideEffects().register(profileStep.getId(), () -> new MutableMetrics(profileStep.getPreviousStep().getId(), profileStep.getPreviousStep().toString()), ProfileStep.ProfileBiOperator.instance());
-
+            this.traversal.get().getSideEffects().register(profileStep.getId(), new MutableMetricsSupplier(profileStep.getPreviousStep().getId(), profileStep.getPreviousStep().toString()), ProfileStep.ProfileBiOperator.instance());
         }
         // register TraversalVertexProgram specific memory compute keys
         this.memoryComputeKeys.add(MemoryComputeKey.of(HALTED_TRAVERSERS, Operator.addAll, false, this.keepDistributedHaltedTraversers)); // only keep if it will be preserved
@@ -179,7 +178,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
 
     @Override
     public void setup(final Memory memory) {
-        // memory is distributed
+        // memory is local
         ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
         memory.set(VOTE_TO_HALT, true);
         memory.set(HALTED_TRAVERSERS, new TraverserSet<>());
@@ -188,7 +187,6 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
         memory.set(COMPLETED_BARRIERS, new HashSet<>());
         final TraversalSideEffects sideEffects = ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).getSideEffects();
         sideEffects.keys().forEach(key -> memory.set(key, sideEffects.get(key)));
-
     }
 
     @Override
@@ -246,7 +244,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
 
     @Override
     public boolean terminate(final Memory memory) {
-        // memory is not distributed
+        // memory is local
         ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
         final boolean voteToHalt = memory.<Boolean>get(VOTE_TO_HALT);
         memory.set(VOTE_TO_HALT, true);
@@ -284,7 +282,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
                 }
                 // the result of a TraversalVertexProgram are the halted traversers
                 memory.set(HALTED_TRAVERSERS, haltedTraversers);
-                // finalize profile side-effect steps.
+                // finalize profile side-effect steps. (todo: try and hide this)
                 for (final ProfileSideEffectStep profileStep : TraversalHelper.getStepsOfAssignableClassRecursively(ProfileSideEffectStep.class, this.traversal.get())) {
                     this.traversal.get().getSideEffects().set(profileStep.getSideEffectKey(), profileStep.generateFinalResult(this.traversal.get().getSideEffects().get(profileStep.getSideEffectKey())));
                 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
index f630017..e5d1f35 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
@@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -121,7 +122,7 @@ public final class WhereTraversalStep<S> extends FilterStep<S> implements Traver
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
-        return TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.traversal)).stream().filter(this.scopeKeys::contains).findAny().isPresent() ?
+        return TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.getTraversal())).stream().filter(this.scopeKeys::contains).findAny().isPresent() ?
                 TYPICAL_GLOBAL_REQUIREMENTS :
                 TYPICAL_LOCAL_REQUIREMENTS;
     }
@@ -141,7 +142,7 @@ public final class WhereTraversalStep<S> extends FilterStep<S> implements Traver
         protected Object map(final Traverser.Admin<S> traverser) {
             if (this.getTraversal().getEndStep() instanceof WhereEndStep)
                 ((WhereEndStep) this.getTraversal().getEndStep()).processStartTraverser(traverser);
-            else if (this.getTraversal().getEndStep() instanceof ProfileSideEffectStep && this.getTraversal().getEndStep().getPreviousStep() instanceof WhereEndStep)     // TOTAL SUCKY HACK!
+            else if (this.getTraversal().getEndStep() instanceof ProfileStep && this.getTraversal().getEndStep().getPreviousStep() instanceof WhereEndStep)     // TOTAL SUCKY HACK!
                 ((WhereEndStep) this.getTraversal().getEndStep().getPreviousStep()).processStartTraverser(traverser);
             return null == this.selectKey ? traverser.get() : this.getScopeValue(Pop.last, this.selectKey, traverser);
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
index e2cf947..be60808 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
@@ -55,12 +55,12 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
 
     @Override
     public Traverser.Admin<S> next() {
-        Traverser.Admin<S> ret = null;
+        Traverser.Admin<S> start = null;
         try {
-            ret = super.next();
-            return ret;
+            start = super.next();
+            return start;
         } finally {
-            if (!this.onGraphComputer && ret == null) {
+            if (!this.onGraphComputer && start == null) {
                 ((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
             }
         }
@@ -68,11 +68,11 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
 
     @Override
     public boolean hasNext() {
-        boolean ret = super.hasNext();
-        if (!this.onGraphComputer && !ret) {
+        boolean start = super.hasNext();
+        if (!this.onGraphComputer && !start) {
             ((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
         }
-        return ret;
+        return start;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
index 89191e0..9b2276b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
@@ -22,18 +22,19 @@ import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.MemoryComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
 import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
+import java.io.Serializable;
 import java.util.NoSuchElementException;
 import java.util.function.BinaryOperator;
 
 /**
  * @author Bob Briody (http://bobbriody.com)
  */
-public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryComputing<MutableMetrics>, GraphComputing {
+public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryComputing<MutableMetrics> {  // pseudo GraphComputing but local traversals are "GraphComputing"
     private MutableMetrics metrics;
     private boolean onGraphComputer = false;
 
@@ -47,23 +48,23 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
 
     @Override
     public Traverser.Admin<S> next() {
-        Traverser.Admin<S> ret = null;
-        initializeIfNeeded();
+        Traverser.Admin<S> start = null;
+        this.initializeIfNeeded();
         this.metrics.start();
         try {
-            ret = super.next();
-            return ret;
+            start = super.next();
+            return start;
         } finally {
-            if (ret != null) {
-                this.metrics.finish(ret.bulk());
+            if (start != null) {
+                this.metrics.finish(start.bulk());
                 if (this.onGraphComputer) {
-                    this.getTraversal().getSideEffects().add(this.getId(), metrics);
+                    this.getTraversal().getSideEffects().add(this.getId(), this.metrics);
                     this.metrics = null;
                 }
             } else {
                 this.metrics.stop();
                 if (this.onGraphComputer) {
-                    this.getTraversal().getSideEffects().add(this.getId(), metrics);
+                    this.getTraversal().getSideEffects().add(this.getId(), this.metrics);
                     this.metrics = null;
                 }
             }
@@ -85,12 +86,12 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
     }
 
     private void initializeIfNeeded() {
-        if (metrics == null) {
-            metrics = new MutableMetrics(this.getPreviousStep().getId(), this.getPreviousStep().toString());
+        if (null == this.metrics) {
+            this.onGraphComputer = TraversalHelper.onGraphComputer(this.getTraversal());
+            this.metrics = new MutableMetrics(this.getPreviousStep().getId(), this.getPreviousStep().toString());
             final Step<?, S> previousStep = this.getPreviousStep();
-            if (previousStep instanceof Profiling) {
-                ((Profiling) previousStep).setMetrics(metrics);
-            }
+            if (previousStep instanceof Profiling)
+                ((Profiling) previousStep).setMetrics(this.metrics);
         }
     }
 
@@ -100,11 +101,6 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
     }
 
     @Override
-    public void onGraphComputer() {
-        this.onGraphComputer = true;
-    }
-
-    @Override
     public ProfileStep<S> clone() {
         final ProfileStep<S> clone = (ProfileStep<S>) super.clone();
         clone.metrics = null;
@@ -113,14 +109,14 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
 
     /////
 
-    public static class ProfileBiOperator implements BinaryOperator<MutableMetrics> {
+    public static class ProfileBiOperator implements BinaryOperator<MutableMetrics>, Serializable {
 
         private static final ProfileBiOperator INSTANCE = new ProfileBiOperator();
 
         @Override
-        public MutableMetrics apply(final MutableMetrics metrics, final MutableMetrics metrics2) {
-            metrics.aggregate(metrics2);
-            return metrics;
+        public MutableMetrics apply(final MutableMetrics metricsA, final MutableMetrics metricsB) {
+            metricsA.aggregate(metricsB);
+            return metricsA;
         }
 
         public static final ProfileBiOperator instance() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/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 6748cd9..b70da42 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
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
 
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.VertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -34,8 +35,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
 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.ProfileStep;
 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.TraversalHelper;
@@ -64,9 +65,11 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
         if (!TraversalHelper.onGraphComputer(traversal) || traversal.getParent().isLocalChild(traversal))  // only process global children as local children are standard semantics
             return;
 
-        if (traversal.getParent() instanceof TraversalVertexProgramStep &&
-                TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1) {
-            throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
+        if (traversal.getParent() instanceof TraversalVertexProgramStep) {
+            if (TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1)
+                throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
+            if (TraversalHelper.hasStepOfAssignableClassRecursively(ProfileStep.class, traversal) && TraversalHelper.getStepsOfAssignableClass(VertexProgramStep.class, TraversalHelper.getRootTraversal(traversal)).size() > 1)
+                throw new VerificationException("Profiling a multi-OLAP traversal is currently not supported", traversal);
         }
 
         for (final Step<?, ?> step : traversal.getSteps()) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/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 1fe0687..4a3a129 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
@@ -108,6 +108,11 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
             }
         }
         this.finalEndStep = this.getEndStep();
+        // finalize requirements
+        if (this.getParent() instanceof EmptyStep) {
+            this.requirements = null;
+            this.getTraverserRequirements();
+        }
         this.locked = true;
     }
 
@@ -116,7 +121,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
         if (null == this.requirements) {
             // if (!this.locked) this.applyStrategies();
             this.requirements = new HashSet<>();
-            for (Step<?, ?> step : this.getSteps()) {
+            for (final Step<?, ?> step : this.getSteps()) {
                 this.requirements.addAll(step.getRequirements());
             }
             if (!this.getSideEffects().keys().isEmpty())

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
index bfcd27f..1714a9e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -237,7 +237,7 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
 
             if (step.getPreviousStep() instanceof TraversalParent) {
                 for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getLocalChildren()) {
-                    handleNestedTraversals(t, metrics, false);
+                    handleNestedTraversals(t, metrics, onGraphComputer);
                 }
                 for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getGlobalChildren()) {
                     handleNestedTraversals(t, metrics, onGraphComputer);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/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 ee20147..6f442fd 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
@@ -227,6 +227,9 @@ public final class TraversalHelper {
             if (stepClass.isAssignableFrom(step.getClass()))
                 list.add((S) step);
             if (step instanceof TraversalParent) {
+                for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+                    list.addAll(TraversalHelper.getStepsOfAssignableClassRecursively(stepClass, localChild));
+                }
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
                     list.addAll(TraversalHelper.getStepsOfAssignableClassRecursively(stepClass, globalChild));
                 }
@@ -282,6 +285,9 @@ public final class TraversalHelper {
                 return true;
             }
             if (step instanceof TraversalParent) {
+                for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+                    if (hasStepOfAssignableClassRecursively(stepClass, localChild)) return true;
+                }
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
                     if (hasStepOfAssignableClassRecursively(stepClass, globalChild)) return true;
                 }
@@ -307,6 +313,9 @@ public final class TraversalHelper {
                 return true;
             }
             if (step instanceof TraversalParent) {
+                for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+                    if (hasStepOfAssignableClassRecursively(stepClasses, localChild)) return true;
+                }
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
                     if (hasStepOfAssignableClassRecursively(stepClasses, globalChild)) return true;
                 }
@@ -328,6 +337,9 @@ public final class TraversalHelper {
                 return true;
             }
             if (step instanceof TraversalParent) {
+                for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+                    if (anyStepRecursively(predicate, localChild)) return true;
+                }
                 for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
                     if (anyStepRecursively(predicate, globalChild)) return true;
                 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index 6e904ef..d510706 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
@@ -24,20 +24,48 @@ import org.apache.tinkerpop.gremlin.process.traversal.Contains;
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.Path;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.*;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.*;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.ImmutableMetrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation;
-import org.apache.tinkerpop.gremlin.structure.*;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
 import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
 import org.apache.tinkerpop.gremlin.structure.io.Mapper;
-import org.apache.tinkerpop.gremlin.structure.util.detached.*;
-import org.apache.tinkerpop.gremlin.structure.util.reference.*;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty;
 import org.apache.tinkerpop.gremlin.structure.util.star.StarGraph;
 import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphGryoSerializer;
 import org.apache.tinkerpop.shaded.kryo.ClassResolver;
@@ -318,13 +346,14 @@ public final class GryoMapper implements Mapper<Kryo> {
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Operator.class, null, 107));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(FoldStep.FoldBiOperator.class, null, 108));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupCountStep.GroupCountBiOperator.class, null, 109));
-            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStep.GroupBiOperator.class, kryo -> new JavaSerializer(), 117));
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStep.GroupBiOperator.class, kryo -> new JavaSerializer(), 117)); // because they contain traversals
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MeanGlobalStep.MeanGlobalBiOperator.class, null, 110));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MeanGlobalStep.MeanNumber.class, null, 111));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TreeStep.TreeBiOperator.class, null, 112));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStepV3d0.GroupBiOperatorV3d0.class, null, 113));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(RangeGlobalStep.RangeBiOperator.class, null, 114));
-            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(OrderGlobalStep.OrderBiOperator.class, kryo -> new JavaSerializer(), 118)); // ***LAST ID***
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(OrderGlobalStep.OrderBiOperator.class, kryo -> new JavaSerializer(), 118)); // because they contain traversals
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ProfileStep.ProfileBiOperator.class, null, 119)); // ***LAST ID***
         }};
 
         private final List<IoRegistry> registries = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
new file mode 100644
index 0000000..c83d21e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.util.function;
+
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MutableMetricsSupplier implements Supplier<MutableMetrics>, Serializable {
+
+    private final String stepId;
+    private final String stepString;
+
+    public MutableMetricsSupplier(final String stepId, final String stepString) {
+        this.stepId = stepId;
+        this.stepString = stepString;
+    }
+
+    @Override
+    public MutableMetrics get() {
+        return new MutableMetrics(this.stepId, this.stepString);
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
index 7a3c305..0987ee5 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map
 
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal
 import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics
+import org.apache.tinkerpop.gremlin.structure.Vertex
 
 /**
  * @author Bob Briody (http://bobbriody.com
@@ -41,7 +41,7 @@ public abstract class GroovyProfileTest {
         }
 
         @Override
-        public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+        public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_name_profile() {
             new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile()");
         }
 
@@ -51,33 +51,38 @@ public abstract class GroovyProfileTest {
         }
 
         @Override
-        public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').by('name').profile()")
+        public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').profile()")
         }
 
         @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
-            g.V.out.out.profile('metrics_key') // locked traversal
+        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetricsX() {
+            g.V.out.out.profile('metrics') // locked traversal
         }
 
         @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.repeat(__.both()).times(3).profile('metrics_key')");
+        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetricsX() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.repeat(__.both()).times(3).profile('metrics')");
         }
 
         @Override
-        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile('metrics_key')");
+        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile('metrics')");
         }
 
         @Override
-        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().sideEffect{Thread.sleep(10)}.sideEffect{Thread.sleep(5)}.profile('metrics_key')")
+        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().sideEffect{Thread.sleep(10)}.sideEffect{Thread.sleep(5)}.profile('metrics')")
         }
 
         @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').by('name').profile('metrics_key')")
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').profile('metrics')")
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').pageRank.by('rank').by(bothE()).rank.profile()")
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
index d2ef074..01c8eda 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
@@ -280,9 +280,8 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     public void g_V_matchXa_knows_b__c_knows_bX() {
         final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__c_knows_bX();
-        printTraversalForm(traversal);
-
         try {
+            printTraversalForm(traversal);
             traversal.iterate();
             fail("Should have tossed an exception because match pattern is not solvable");
         } catch (Exception ex) {
@@ -307,9 +306,8 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     public void g_V_matchXa_created_b__c_created_bX_selectXa_b_cX_byXnameX() throws Exception {
         final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__c_created_bX_selectXa_b_cX_byXnameX();
-        printTraversalForm(traversal);
-
         try {
+            printTraversalForm(traversal);
             traversal.iterate();
             fail("Should have tossed an exception because match pattern is not solvable");
         } catch (Exception ex) {
@@ -321,9 +319,8 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
     @LoadGraphWith(MODERN)
     public void g_V_out_asXcX_matchXb_knows_a__c_created_eX_selectXcX() throws Exception {
         final Traversal<Vertex, String> traversal = get_g_V_out_asXcX_matchXb_knows_a__c_created_eX_selectXcX();
-        printTraversalForm(traversal);
-
         try {
+            printTraversalForm(traversal);
             traversal.iterate();
             fail("Should have tossed an exception because match pattern is not solvable");
         } catch (Exception ex) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
index 4b0d6bf..5fdb8c0 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
+import org.apache.commons.lang.exception.ExceptionUtils;
 import org.apache.tinkerpop.gremlin.LoadGraphWith;
 import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
 import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
@@ -32,6 +33,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
 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;
@@ -52,6 +54,7 @@ import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
 
 /**
  * @author Bob Briody (http://bobbriody.com)
@@ -59,7 +62,7 @@ import static org.junit.Assert.assertTrue;
  */
 @RunWith(GremlinProcessRunner.class)
 public abstract class ProfileTest extends AbstractGremlinProcessTest {
-    private static final String METRICS_KEY = "metrics_key";
+    private static final String METRICS_KEY = "metrics";
 
     public abstract Traversal<Vertex, TraversalMetrics> get_g_V_out_out_profile();
 
@@ -67,72 +70,42 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, TraversalMetrics> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
 
-    public abstract Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+    public abstract Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_name_profile();
 
-    public abstract Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile();
+    public abstract Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile();
 
-    public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX();
+    public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetricsX();
 
-    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
+    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetricsX();
 
-    public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
+    public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX();
 
-    public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
+    public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX();
 
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX();
+
+    public abstract Traversal<Vertex, TraversalMetrics> get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile();
 
-    /**
-     * Many of the tests in this class are coupled to not-totally-generic vendor behavior. However, this test is intended to provide
-     * fully generic validation.
-     */
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_out_out_profile_simple() {
+    public void modern_V_out_out_profile() {
         final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
         printTraversalForm(traversal);
+        validate_g_V_out_out_profile_modern(traversal, traversal.next());
 
-        final TraversalMetrics traversalMetrics = traversal.next();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        // Every other step should be a Profile step
-        List<Step> steps = traversal.asAdmin().getSteps();
-        for (int ii = 1; ii <= 6; ii += 2) {
-            assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
-        }
 
-        // Validate the last Metrics only, which must be consistent across vendors.
-        Metrics metrics = traversalMetrics.getMetrics(traversalMetrics.getMetrics().size() - 1);
-        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
     }
 
     @Test
     @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_out_out_profile_simpleXmetrics_keyX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+    public void modern_V_out_out_profileXmetricsX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetricsX();
         printTraversalForm(traversal);
-
         traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        // Every other step should be a Profile step
-        List<Step> steps = traversal.asAdmin().getSteps();
-        for (int ii = 1; ii < steps.size(); ii += 2) {
-            assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
-        }
-
-        // Validate the last Metrics only, which must be consistent across vendors.
-        Metrics metrics = traversalMetrics.getMetrics(traversalMetrics.getMetrics().size() - 1);
-        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        validate_g_V_out_out_profile_modern(traversal, traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY));
     }
 
-
-    private void validate_g_V_out_out_profile_modern(TraversalMetrics traversalMetrics) {
+    private void validate_g_V_out_out_profile_modern(final Traversal traversal, final TraversalMetrics traversalMetrics) {
         traversalMetrics.toString(); // ensure no exceptions are thrown
 
         Metrics metrics = traversalMetrics.getMetrics(0);
@@ -146,25 +119,35 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         metrics = traversalMetrics.getMetrics(2);
         assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
         assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+
+        if (!onGraphComputer(traversal.asAdmin())) {
+            // Every other step should be a Profile step
+            List<Step> steps = traversal.asAdmin().getSteps();
+            for (int ii = 1; ii <= 6; ii += 2) {
+                assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
+            }
+        }
     }
 
+    ////////////////////
+
     @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_profile_modern() {
+    @LoadGraphWith(GRATEFUL)
+    public void grateful_V_out_out_profile() {
         final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
         printTraversalForm(traversal);
         final TraversalMetrics traversalMetrics = traversal.next();
-        validate_g_V_out_out_profile_modern(traversalMetrics);
+        validate_g_V_out_out_profile_grateful(traversalMetrics);
     }
 
     @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_profile_modernXmetrics_keyX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+    @LoadGraphWith(GRATEFUL)
+    public void grateful_V_out_out_profileXmetricsX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetricsX();
         printTraversalForm(traversal);
         traversal.iterate();
         final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
-        validate_g_V_out_out_profile_modern(traversalMetrics);
+        validate_g_V_out_out_profile_grateful(traversalMetrics);
     }
 
     private void validate_g_V_out_out_profile_grateful(TraversalMetrics traversalMetrics) {
@@ -195,25 +178,29 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         assertEquals(100, totalPercentDuration, 0.000001);
     }
 
+    ///////////////////
+
     @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_out_out_profile_grateful() {
-        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
         printTraversalForm(traversal);
-
-        final TraversalMetrics traversalMetrics = traversal.next();
-        validate_g_V_out_out_profile_grateful(traversalMetrics);
+        TraversalMetrics traversalMetrics = traversal.next();
+        assertEquals("There should be 8 steps in this traversal (counting injected profile steps).", 8, traversal.asAdmin().getSteps().size());
+        validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
     }
 
     @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_out_out_profile_gratefulXmetrics_keyX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX();
         printTraversalForm(traversal);
-
         traversal.iterate();
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
-        validate_g_V_out_out_profile_grateful(traversalMetrics);
+        assertEquals("There should be 7 steps in this traversal (counting injected profile steps).", 7, traversal.asAdmin().getSteps().size());
+        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
+        validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
     }
 
     private void validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(TraversalMetrics traversalMetrics) {
@@ -237,27 +224,26 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         assertEquals(100, totalPercentDuration, 0.000001);
     }
 
+    ///////////////////
+
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
-        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
+    public void g_V_repeat_both_profile() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_repeatXbothX_timesX3X_profile();
         printTraversalForm(traversal);
-        TraversalMetrics traversalMetrics = traversal.next();
-        assertEquals("There should be 8 steps in this traversal (counting injected profile steps).", 8, traversal.asAdmin().getSteps().size());
-        validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
+
+        final TraversalMetrics traversalMetrics = traversal.next();
+        validate_g_V_repeat_both_modern_profile(traversalMetrics);
     }
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
+    public void g_V_repeat_both_profileXmetricsX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_profileXmetricsX();
         printTraversalForm(traversal);
         traversal.iterate();
-        assertEquals("There should be 7 steps in this traversal (counting injected profile steps).", 7, traversal.asAdmin().getSteps().size());
-        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
-        validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
+        validate_g_V_repeat_both_modern_profile(traversalMetrics);
     }
 
     private void validate_g_V_repeat_both_modern_profile(TraversalMetrics traversalMetrics) {
@@ -295,29 +281,9 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         assertEquals(100, totalPercentDuration, 0.000001);
     }
 
-    @Test
-    @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_repeat_both_modern_profile() {
-        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_repeatXbothX_timesX3X_profile();
-        printTraversalForm(traversal);
-
-        final TraversalMetrics traversalMetrics = traversal.next();
-        validate_g_V_repeat_both_modern_profile(traversalMetrics);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_repeat_both_modern_profileXmetrics_keyX() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
-        printTraversalForm(traversal);
-        traversal.iterate();
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
-        validate_g_V_repeat_both_modern_profile(traversalMetrics);
-    }
+    /////////////
 
-    private void validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(Traversal traversal, TraversalMetrics traversalMetrics) {
+    private void validate_g_V_whereXinXcreatedX_count_isX1XX_name_profile(Traversal traversal, TraversalMetrics traversalMetrics) {
         traversalMetrics.toString(); // ensure no exceptions are thrown
 
         assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
@@ -339,24 +305,21 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+    public void g_V_whereXinXcreatedX_count_isX1XX_name_profile() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_name_profile();
         printTraversalForm(traversal);
-
         final TraversalMetrics traversalMetrics = traversal.next();
-        validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(traversal, traversalMetrics);
+        validate_g_V_whereXinXcreatedX_count_isX1XX_name_profile(traversal, traversalMetrics);
     }
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
-        final Traversal<Vertex, String> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
+    public void g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX() {
+        final Traversal<Vertex, String> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX();
         printTraversalForm(traversal);
-
         traversal.iterate();
-
         final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
-        validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(traversal, traversalMetrics);
+        validate_g_V_whereXinXcreatedX_count_isX1XX_name_profile(traversal, traversalMetrics);
     }
 
     /**
@@ -389,7 +352,6 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void testProfileStrategyCallback() {
         final Traversal<Vertex, TraversalMetrics> t = get_g_V_out_out_profile();
         MockStep mockStep = new MockStep(t.asAdmin());
@@ -404,9 +366,8 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void testProfileStrategyCallbackSideEffect() {
-        final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetrics_keyX();
+        final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetricsX();
         MockStep mockStep = new MockStep(t.asAdmin());
         t.asAdmin().addStep(3, mockStep);
         t.iterate();
@@ -420,20 +381,34 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
-        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile();
+    public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile();
         printTraversalForm(traversal);
         traversal.iterate();
     }
 
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX() {
-        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
+    public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX();
         printTraversalForm(traversal);
         traversal.iterate();
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.STANDARD)
+    public void g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile();
+        //printTraversalForm(traversal);
+        try {
+            traversal.iterate();
+            fail("Should have tossed an exception because multi-OLAP is unsolvable");
+        } catch (Exception ex) {
+            assertTrue(ex instanceof VerificationException || ExceptionUtils.getRootCause(ex) instanceof VerificationException);
+        }
+    }
+
     private static boolean onGraphComputer(final Traversal.Admin<?, ?> traversal) {
         return !TraversalHelper.getStepsOfClass(TraversalVertexProgramStep.class, TraversalHelper.getRootTraversal(traversal)).isEmpty();
     }
@@ -471,27 +446,27 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         }
 
         @Override
-        public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+        public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_name_profile() {
             return g.V().where(__.in("created").count().is(1l)).<String>values("name").profile();
         }
 
         @Override
-        public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
-            return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").by("name").profile();
+        public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile() {
+            return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").profile();
         }
 
         @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
+        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetricsX() {
             return g.V().out().out().profile(METRICS_KEY);
         }
 
         @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX() {
+        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetricsX() {
             return g.V().repeat(both()).times(3).profile(METRICS_KEY);
         }
 
         @Override
-        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
+        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX() {
             return g.V().sideEffect(v -> {
                 try {
                     Thread.sleep(10);
@@ -508,13 +483,18 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         }
 
         @Override
-        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
+        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX() {
             return g.V().where(__.in("created").count().is(1l)).<String>values("name").profile(METRICS_KEY);
         }
 
         @Override
-        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX() {
-            return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").by("name").profile(METRICS_KEY);
+        public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX() {
+            return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").profile(METRICS_KEY);
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile() {
+            return g.V().hasLabel("person").pageRank().by("rank").by(__.bothE()).values("rank").profile();
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
index c8a8394..3dd0d9a 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
@@ -146,19 +146,19 @@ import java.util.stream.Stream;
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
         test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest$Traversals",
-        method = "g_V_out_out_profile_grateful",
+        method = "grateful_V_out_out_profile",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
         test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest$Traversals",
-        method = "g_V_out_out_profile_gratefulXmetrics_keyX",
+        method = "grateful_V_out_out_profileXmetricsX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
         test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyProfileTest$Traversals",
-        method = "g_V_out_out_profile_grateful",
+        method = "grateful_V_out_out_profile",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
         test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyProfileTest$Traversals",
-        method = "g_V_out_out_profile_gratefulXmetrics_keyX",
+        method = "grateful_V_out_out_profileXmetricsX",
         reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
 @Graph.OptOut(
         test = "org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest",

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/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 e19dff8..f0d77ab 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
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
 import org.apache.tinkerpop.gremlin.process.computer.bulkloading.BulkLoaderVertexProgram;
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Scope;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -57,15 +58,15 @@ public class TinkerGraphPlayTest {
         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().hasLabel("person").fold().order(Scope.local).by("age").toList());
-        System.out.println(g.V().repeat(out()).times(2).profile("m").explain());
-        final Traversal<?,?> traversal = g.V().repeat(out().union(__.<Vertex>identity().as("a"),out())).times(1).count().profile("m");
-
+        //System.out.println(g.V().repeat(out()).times(2).profile("m").explain());
+        final Traversal<?,?> traversal = g.V().both().hasLabel("person").order().by("age", Order.decr).values("name");
+        //System.out.println(g.V().hasLabel("person").pageRank().by("rank").by(bothE()).values("rank").profile("m").explain());
         //System.out.println(traversal.asAdmin().clone().toString());
        // final Traversal<?,?> clone = traversal.asAdmin().clone();
        // clone.asAdmin().applyStrategies();
        // System.out.println(clone);
         System.out.println(traversal.asAdmin().toList());
-        System.out.println(traversal.asAdmin().getSideEffects().get("m") + " ");
+        //System.out.println(traversal.asAdmin().getSideEffects().get("m") + " ");
         //System.out.println(g.V().pageRank().order().by(PageRankVertexProgram.PAGE_RANK).valueMap().toList());
     }