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 21:53:26 UTC

[01/12] incubator-tinkerpop git commit: profiling overhaul.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 11a717322 -> c7111bedc


profiling overhaul.


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

Branch: refs/heads/master
Commit: e73bbc5d978432e09e0323509854bed5cb7ee08f
Parents: a50732d
Author: rjbriody <bo...@datastax.com>
Authored: Thu Mar 17 17:13:34 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Thu Mar 17 17:13:34 2016 -0400

----------------------------------------------------------------------
 .../traversal/step/map/VertexProgramStep.java   |   3 +-
 .../gremlin/process/traversal/Traversal.java    |  19 +-
 .../process/traversal/step/map/MatchStep.java   |  29 +--
 .../traversal/step/map/ProfileMarkerStep.java   |  42 ----
 .../step/sideEffect/ProfileSideEffectStep.java  | 135 ++---------
 .../traversal/step/util/ProfileStep.java        |  84 +++++++
 .../strategy/finalization/ProfileStrategy.java  |  37 +--
 .../ComputerVerificationStrategy.java           |  10 +-
 .../StandardVerificationStrategy.java           |  12 +-
 .../traversal/util/DefaultTraversalMetrics.java | 226 +++++++++++++++++++
 .../traversal/util/DependantMutableMetrics.java |  62 -----
 .../process/traversal/util/MutableMetrics.java  |   6 +-
 .../util/StandardTraversalMetrics.java          | 226 -------------------
 .../gremlin/structure/io/gryo/GryoMapper.java   |  77 +------
 .../DefaultTraversalMetricsSupplier.java        |  45 ++++
 .../StandardTraversalMetricsSupplier.java       |  45 ----
 .../process/traversal/step/map/ProfileTest.java |  18 +-
 17 files changed, 422 insertions(+), 654 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
index 50c2e30..1b561fd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.computer.traversal.step.map;
 
 import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
 import org.apache.tinkerpop.gremlin.process.computer.Memory;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.VertexComputing;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -79,7 +78,7 @@ public abstract class VertexProgramStep extends AbstractStep<ComputerResult, Com
 
     private void processMemorySideEffects(final Memory memory) {
         // unfortunately there is no easy way to test this in a test case
-        assert this.getNextStep() instanceof ComputerResultStep == memory.exists(TraversalVertexProgram.HALTED_TRAVERSERS);
+        // assert this.getNextStep() instanceof ComputerResultStep == memory.exists(TraversalVertexProgram.HALTED_TRAVERSERS);
         final TraversalSideEffects sideEffects = this.getTraversal().getSideEffects();
         for (final String key : memory.keys()) {
             if (sideEffects.exists(key)) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
index da67277..97779b7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal;
 import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
@@ -32,16 +32,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
-import java.util.Spliterator;
-import java.util.Spliterators;
+import java.util.*;
 import java.util.function.Consumer;
 import java.util.stream.Stream;
 import java.util.stream.StreamSupport;
@@ -174,12 +165,12 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
     /**
      * Profile the traversal.
      *
-     * @return the updated traversal with respective {@link ProfileMarkerStep}.
+     * @return the updated traversal with respective {@link ProfileSideEffectStep}.
      */
     public default Traversal<S, TraversalMetrics> profile() {
         return this.asAdmin()
-                .addStep(new ProfileMarkerStep(this.asAdmin()))
-                .addStep(new SideEffectCapStep<Object, TraversalMetrics>(this.asAdmin(), ProfileMarkerStep.METRICS_KEY));
+                .addStep(new ProfileSideEffectStep<>(this.asAdmin(), ProfileSideEffectStep.DEFAULT_METRICS_KEY))
+                .addStep(new SideEffectCapStep<Object, TraversalMetrics>(this.asAdmin(), ProfileSideEffectStep.DEFAULT_METRICS_KEY));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
index eb11e5a..c6e3bbe 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
@@ -18,23 +18,14 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 
-import org.apache.tinkerpop.gremlin.process.traversal.Path;
-import org.apache.tinkerpop.gremlin.process.traversal.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.*;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.*;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
@@ -45,17 +36,7 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
 import java.io.Serializable;
 import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
 import java.util.function.Function;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
@@ -513,7 +494,7 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
 
         public static Optional<String> getEndLabel(final Traversal.Admin<Object, Object> traversal) {
             final Step<?, ?> endStep = traversal.getEndStep();
-            return endStep instanceof ProfileSideEffectStep ?           // TOTAL HACK
+            return endStep instanceof ProfileStep ?           // TOTAL HACK
                     ((MatchEndStep) endStep.getPreviousStep()).getMatchKey() :
                     ((MatchEndStep) endStep).getMatchKey();
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java
deleted file mode 100644
index bfef33d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.util.NoSuchElementException;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class ProfileMarkerStep<S> extends AbstractStep<S, S> {
-    public static final String METRICS_KEY = Graph.Hidden.hide("metrics");
-
-    public ProfileMarkerStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-    @Override
-    protected Traverser.Admin<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/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 64fdbe0..7a9523e 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
@@ -18,30 +18,22 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
-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.Profiling;
 import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
-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.util.DependantMutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.util.function.StandardTraversalMetricsSupplier;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.util.function.DefaultTraversalMetricsSupplier;
 
-import java.util.List;
-import java.util.NoSuchElementException;
 import java.util.function.Supplier;
 
 /**
  * @author Bob Briody (http://bobbriody.com)
  */
-public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable<StandardTraversalMetrics, StandardTraversalMetrics>, GraphComputing {
+public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable<DefaultTraversalMetrics, DefaultTraversalMetrics>, GraphComputing {
+    public static final String DEFAULT_METRICS_KEY = Graph.Hidden.hide("metrics");
 
     private String sideEffectKey;
     private boolean onGraphComputer = false;
@@ -49,17 +41,11 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
     public ProfileSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
         super(traversal);
         this.sideEffectKey = sideEffectKey;
-        this.getTraversal().getSideEffects().registerIfAbsent(this.sideEffectKey, (Supplier) StandardTraversalMetricsSupplier.instance(), Operator.assign);
+        this.getTraversal().getSideEffects().registerIfAbsent(this.sideEffectKey, (Supplier) DefaultTraversalMetricsSupplier.instance(), Operator.assign);
     }
 
     @Override
     protected void sideEffect(Traverser.Admin<S> traverser) {
-
-    }
-
-    @Override
-    public void onGraphComputer() {
-        this.onGraphComputer = true;
     }
 
     @Override
@@ -67,122 +53,35 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
         return this.sideEffectKey;
     }
 
-    private StandardTraversalMetrics getMetrics() {
-        return this.getTraversal().getSideEffects().<StandardTraversalMetrics>get(this.sideEffectKey);
-    }
-
     @Override
     public Traverser.Admin<S> next() {
         Traverser.Admin<S> ret = null;
-        initializeIfNeeded();
-        getMetrics().start(this.getId());
         try {
             ret = super.next();
             return ret;
         } finally {
-            if (ret != null) {
-                getMetrics().finish(this.getId(), ret.bulk());
-            } else {
-                getMetrics().stop(this.getId());
+            if (ret == null) {
+                finalizeMetrics();
             }
         }
     }
 
     @Override
     public boolean hasNext() {
-        initializeIfNeeded();
-        this.getMetrics().start(this.getId());
         boolean ret = super.hasNext();
-        this.getMetrics().stop(this.getId());
+        if (!ret) {
+            finalizeMetrics();
+        }
         return ret;
     }
 
-    @Override
-    protected Traverser.Admin<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-
-    private void initializeIfNeeded() {
-        // Initialization is handled at the top-level of the traversal only.
-        if (this.getMetrics().wasInitialized() ||
-                !(this.getTraversal().getParent() instanceof TraversalVertexProgramStep) &&
-                        !(this.getTraversal().getParent() instanceof EmptyStep)) {
-            return;
-        }
-        // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
-        // once per thread if using Computer.)
-        prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
+    private void finalizeMetrics() {
+        final DefaultTraversalMetrics tm = this.getTraversal().getSideEffects().get(this.sideEffectKey);
+        tm.setMetrics(traversal, onGraphComputer);
     }
 
-    // Walk the traversal steps and initialize the Metrics timers.
-    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, MutableMetrics parentMetrics) {
-
-        DependantMutableMetrics prevMetrics = null;
-        final List<Step> steps = traversal.getSteps();
-        for (int ii = 0; ii + 1 < steps.size(); ii = ii + 2) {
-            Step step = steps.get(ii);
-            Step nextStep = steps.get(ii + 1);
-            // Do not inject profiling after ProfileStep
-            if (!(nextStep instanceof ProfileSideEffectStep)) {
-                break;
-            }
-            ProfileSideEffectStep profileSideEffectStep = (ProfileSideEffectStep) nextStep;
-
-            // Create metrics
-            MutableMetrics metrics;
-
-            // Computer metrics are "stand-alone" but Standard metrics handle double-counted upstream time.
-            if (this.onGraphComputer) {
-                metrics = new MutableMetrics(step.getId(), step.toString());
-            } else {
-                metrics = new DependantMutableMetrics(step.getId(), step.toString(), prevMetrics);
-                prevMetrics = (DependantMutableMetrics) metrics;
-            }
-
-            if (step instanceof Profiling) {
-                ((Profiling) step).setMetrics(metrics);
-            }
-
-            // Initialize counters (necessary because some steps might end up being 0)
-            metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, 0);
-            metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 0);
-
-            // Add metrics to parent, if necessary
-            if (parentMetrics != null) {
-                parentMetrics.addNested(metrics);
-            }
-
-            // The TraversalMetrics sideEffect is shared across all the steps.
-            //profileSideEffectStep.traversalMetrics = this.traversalMetrics;
-
-            // Add root metrics to traversalMetrics
-            this.getMetrics().addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileSideEffectStep.getId());
-
-            // Handle nested traversal
-            if (step instanceof TraversalParent) {
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
-                    prepTraversalForProfiling(t, metrics);
-                }
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
-                    prepTraversalForProfiling(t, metrics);
-                }
-            }
-        }
+    @Override
+    public void onGraphComputer() {
+        onGraphComputer = true;
     }
-
-    ///////////////////////////
-
-    /*public static final class ProfileBiOperator implements BinaryOperator<StandardTraversalMetrics>, Serializable {
-
-        private static final ProfileBiOperator INSTANCE = new ProfileBiOperator();
-
-        @Override
-        public StandardTraversalMetrics apply(final StandardTraversalMetrics mutatingSeed, final StandardTraversalMetrics map) {
-            return StandardTraversalMetrics.merge(IteratorUtils.of(mutatingSeed, map));
-        }
-
-        public static final ProfileBiOperator instance() {
-            return INSTANCE;
-        }
-    }*/
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/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
new file mode 100644
index 0000000..26ba878
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal.step.util;
+
+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.Profiling;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileStep<S> extends AbstractStep<S, S> {
+    private MutableMetrics metrics;
+
+    public ProfileStep(final Traversal.Admin traversal) {
+        super(traversal);
+    }
+
+    public MutableMetrics getMetrics() {
+        return metrics;
+    }
+
+    @Override
+    public Traverser.Admin<S> next() {
+        Traverser.Admin<S> ret = null;
+        initializeIfNeeded();
+        metrics.start();
+        try {
+            ret = super.next();
+            return ret;
+        } finally {
+            if (ret != null) {
+                metrics.finish(ret.bulk());
+            } else {
+                metrics.stop();
+            }
+        }
+    }
+
+    @Override
+    public boolean hasNext() {
+        initializeIfNeeded();
+        this.metrics.start();
+        boolean ret = super.hasNext();
+        this.metrics.stop();
+        return ret;
+    }
+
+    @Override
+    protected Traverser.Admin<S> processNextStart() throws NoSuchElementException {
+        return this.starts.next();
+    }
+
+    private void initializeIfNeeded() {
+        if (metrics == null) {
+            metrics = new MutableMetrics(this.getPreviousStep().getId(), this.getPreviousStep().toString());
+            final Step<?, S> previousStep = this.getPreviousStep();
+            if (previousStep instanceof Profiling) {
+                ((Profiling) previousStep).setMetrics(metrics);
+            }
+        }
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index 17f1a40..dd66e1c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -21,9 +21,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+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.util.TraversalHelper;
 
@@ -41,21 +40,13 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (TraversalHelper.hasStepOfClass(ProfileSideEffectStep.class, traversal)) {
-            prepTraversalForProfiling(traversal, TraversalHelper.getFirstStepOfAssignableClass(ProfileSideEffectStep.class, traversal).get().getSideEffectKey());
-        } else if (TraversalHelper.hasStepOfClass(ProfileMarkerStep.class, traversal)) {
-            prepTraversalForProfiling(traversal, ProfileMarkerStep.METRICS_KEY);
+        if (!TraversalHelper.getStepsOfAssignableClassRecursively(ProfileSideEffectStep.class, TraversalHelper.getRootTraversal(traversal).asAdmin()).isEmpty()) {
+            prepTraversalForProfiling(traversal);
         }
     }
 
-    // Walk the traversal steps and inject the .profile()-steps.
-    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, String sideEffectKey) {
-        // Remove user-specified ProfileSideEffectStep steps
-        final List<ProfileSideEffectStep> profileSideEffectSteps = TraversalHelper.getStepsOfClass(ProfileSideEffectStep.class, traversal);
-        for (ProfileSideEffectStep step : profileSideEffectSteps) {
-            traversal.removeStep(step);
-        }
-
+    // Iterate the traversal steps and inject the .profile()-steps.
+    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal) {
         // Add .profile() step after every pre-existing step.
         final List<Step> steps = traversal.getSteps();
         final int numSteps = steps.size();
@@ -63,24 +54,14 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
             // Get the original step
             Step step = steps.get(ii * 2);
 
-            // Do not inject profiling after ProfileStep
-            if (step instanceof ProfileMarkerStep) {
+            // Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
+            if (step instanceof ProfileSideEffectStep) {
                 break;
             }
 
             // Create and inject ProfileStep
-            ProfileSideEffectStep profileSideEffectStep = new ProfileSideEffectStep(traversal, sideEffectKey);
-            traversal.addStep((ii * 2) + 1, profileSideEffectStep);
-
-            // Handle nested traversal
-            if (step instanceof TraversalParent) {
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
-                    t.addStep(new ProfileSideEffectStep(t, sideEffectKey));
-                }
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
-                    t.addStep(new ProfileSideEffectStep(t, sideEffectKey));
-                }
-            }
+            ProfileStep profileStep = new ProfileStep(traversal);
+            traversal.addStep((ii * 2) + 1, profileStep);
         }
     }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/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 8a2b9a9..f17735f 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
@@ -23,17 +23,11 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Traversa
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.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;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.*;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
 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;
@@ -54,7 +48,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
 
     private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
     private static final Set<Class<?>> UNSUPPORTED_STEPS = new HashSet<>(Arrays.asList(
-            InjectStep.class, Mutating.class, SubgraphStep.class, ProfileMarkerStep.class, ProfileSideEffectStep.class, ComputerResultStep.class
+            InjectStep.class, Mutating.class, SubgraphStep.class, ComputerResultStep.class
     ));
 
     private ComputerVerificationStrategy() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
index ed8c881..8e9c495 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
@@ -22,7 +22,8 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.VertexComput
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -52,11 +53,14 @@ public final class StandardVerificationStrategy extends AbstractTraversalStrateg
                 throw new VerificationException("The parent of a reducing barrier can not be repeat()-step: " + step, traversal);
         });
 
-        if (TraversalHelper.hasStepOfClass(ProfileMarkerStep.class, traversal) && traversal.asAdmin().getEndStep() instanceof ProfileMarkerStep) {
-            throw new VerificationException("When specified, the .profile()-Step must be the last step.", traversal);
+        // The ProfileSideEffectStep must be the last step or the 2nd last step when accompanied by the cap step.
+        if (TraversalHelper.hasStepOfClass(ProfileSideEffectStep.class, traversal) &&
+                !(traversal.asAdmin().getEndStep() instanceof ProfileSideEffectStep) &&
+                !(traversal.asAdmin().getEndStep() instanceof SideEffectCapStep && traversal.asAdmin().getEndStep().getPreviousStep() instanceof ProfileSideEffectStep)) {
+            throw new VerificationException("When specified, the .profile()-Step must be the last step or followed only by the cap step.", traversal);
         }
 
-        if (TraversalHelper.getStepsOfClass(ProfileMarkerStep.class, traversal).size() > 1) {
+        if (TraversalHelper.getStepsOfClass(ProfileSideEffectStep.class, traversal).size() > 1) {
             throw new VerificationException("The .profile()-Step cannot be specified multiple times.", traversal);
         }
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/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
new file mode 100644
index 0000000..a2d2812
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -0,0 +1,226 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal.util;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class DefaultTraversalMetrics implements TraversalMetrics, Serializable {
+    // toString() specific headers
+    private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
+
+    private final Map<String, MutableMetrics> metrics = new HashMap<>();
+    private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
+
+    /*
+    The following are computed values upon the completion of profiling in order to report the results back to the user
+     */
+    private long totalStepDuration;
+    private Map<String, ImmutableMetrics> computedMetrics;
+
+    public DefaultTraversalMetrics() {
+    }
+
+    @Override
+    public long getDuration(final TimeUnit unit) {
+        return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
+    }
+
+    @Override
+    public Metrics getMetrics(final int index) {
+        // adjust index to account for the injected profile steps
+        return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
+    }
+
+    @Override
+    public Metrics getMetrics(final String id) {
+        return computedMetrics.get(id);
+    }
+
+    @Override
+    public Collection<ImmutableMetrics> getMetrics() {
+        return computedMetrics.values();
+    }
+
+    @Override
+    public String toString() {
+        // Build a pretty table of metrics data.
+
+        // Append headers
+        final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
+                .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
+
+        sb.append("\n=============================================================================================================");
+
+        appendMetrics(computedMetrics.values(), sb, 0);
+
+        // Append total duration
+        sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
+                ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
+
+        return sb.toString();
+    }
+
+    private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
+        // Append each StepMetric's row. indexToLabelMap values are ordered by index.
+        for (Metrics m : metrics) {
+            String rowName = m.getName();
+
+            // Handle indentation
+            for (int ii = 0; ii < indent; ii++) {
+                rowName = "  " + rowName;
+            }
+            // Abbreviate if necessary
+            rowName = StringUtils.abbreviate(rowName, 50);
+
+            // Grab the values
+            final Long itemCount = m.getCount(ELEMENT_COUNT_ID);
+            final Long traverserCount = m.getCount(TRAVERSER_COUNT_ID);
+            Double percentDur = (Double) m.getAnnotation(PERCENT_DURATION_KEY);
+
+            // Build the row string
+
+            sb.append(String.format("%n%-50s", rowName));
+
+            if (itemCount != null) {
+                sb.append(String.format(" %21d", itemCount));
+            } else {
+                sb.append(String.format(" %21s", ""));
+            }
+
+            if (traverserCount != null) {
+                sb.append(String.format(" %11d", traverserCount));
+            } else {
+                sb.append(String.format(" %11s", ""));
+            }
+
+            sb.append(String.format(" %15.3f", m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
+
+            if (percentDur != null) {
+                sb.append(String.format(" %8.2f", percentDur));
+            }
+
+            appendMetrics(m.getNested(), sb, indent + 1);
+        }
+    }
+
+    private void computeTotals() {
+        // Create temp list of ordered metrics
+        List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
+        for (String label : indexToLabelMap.values()) {
+            // The indexToLabelMap is sorted by index (key)
+            tempMetrics.add(metrics.get(label).clone());
+        }
+
+        // Calculate total duration
+        this.totalStepDuration = 0;
+        tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
+
+        // Assign %'s
+        tempMetrics.forEach(m -> {
+            double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
+            m.setAnnotation(PERCENT_DURATION_KEY, dur);
+        });
+
+        // Store immutable instances of the calculated metrics
+        computedMetrics = new LinkedHashMap<>(metrics.size());
+        tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
+    }
+
+    public static DefaultTraversalMetrics merge(final Iterator<DefaultTraversalMetrics> toMerge) {
+        final DefaultTraversalMetrics newTraversalMetrics = new DefaultTraversalMetrics();
+
+        // iterate the incoming TraversalMetrics
+        toMerge.forEachRemaining(inTraversalMetrics -> {
+            // aggregate the internal Metrics
+            inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
+
+                MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
+                if (null == aggregateMetrics) {
+                    // need to create a Metrics to aggregate into
+                    aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
+
+                    newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
+                    // Set the index of the Metrics
+                    for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
+                        if (metricsId.equals(entry.getValue())) {
+                            newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
+                            break;
+                        }
+                    }
+                }
+                aggregateMetrics.aggregate(toAggregate);
+            });
+        });
+        return newTraversalMetrics;
+    }
+
+    public void setMetrics(Traversal.Admin traversal, boolean onGraphComputer) {
+        addTopLevelMetrics(traversal);
+        handleNestedTraversals(traversal, null, onGraphComputer);
+        computeTotals();
+    }
+
+    private void addTopLevelMetrics(Traversal.Admin traversal) {
+        final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
+        for (int ii = 0; ii < profileSteps.size(); ii++) {
+            // The index is necessary to ensure that step order is preserved after a merge.
+            final MutableMetrics stepMetrics = profileSteps.get(ii).getMetrics();
+            this.indexToLabelMap.put(ii, stepMetrics.getId());
+            this.metrics.put(stepMetrics.getId(), stepMetrics);
+        }
+    }
+
+    private void handleNestedTraversals(Traversal.Admin traversal, MutableMetrics parentMetrics, boolean onGraphComputer) {
+        long prevDur = 0;
+        for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
+            Step step = (Step) traversal.getSteps().get(ii);
+            if (step instanceof ProfileStep) {
+                final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
+                if (!onGraphComputer) {
+                    // save duration before we adjust
+                    long tempDur = metrics.getDuration(TimeUnit.NANOSECONDS);
+                    // adjust duration
+                    metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
+                    prevDur = tempDur;
+                }
+                if (parentMetrics != null) {
+                    parentMetrics.addNested(metrics);
+                }
+            } else if (step instanceof TraversalParent) {
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+                }
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+                }
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
deleted file mode 100644
index bb7d50c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.util;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * This Metrics class handles a metrics chain in which durations are "double counted" by upstream metrics. Durations are
- * corrected upon retrieval by subtracting upstream durations.
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public class DependantMutableMetrics extends MutableMetrics {
-    private long prevDur = 0L;
-    private DependantMutableMetrics upStreamMetrics;
-
-    private DependantMutableMetrics() {
-        // necessary for gryo serialization
-        super();
-    }
-
-    public DependantMutableMetrics(final String id, final String name, final DependantMutableMetrics upStreamMetrics) {
-        super(id, name);
-        this.upStreamMetrics = upStreamMetrics;
-    }
-
-    /**
-     * Returns the actual duration taken by this Metrics by subtracting the duration taken by the upstream Step, if
-     * one exists.
-     */
-    @Override
-    public long getDuration(final TimeUnit unit) {
-        if (upStreamMetrics == null){
-           return unit.convert(super.durationNs, unit);
-        } else {
-           // upStreamMetrics exists. Subtract that duration since it is time not spent in this step.
-           return unit.convert(super.durationNs - upStreamMetrics.durationNs, unit);
-        }
-    }
-
-    @Override
-    protected void copyMembers(final ImmutableMetrics clone) {
-        super.copyMembers(clone);
-        clone.durationNs = this.getDuration(TimeUnit.NANOSECONDS);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
index 72c1076..a952c65 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
@@ -42,7 +42,6 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
         this.name = name;
     }
 
-
     public void addNested(MutableMetrics metrics) {
         this.nested.put(metrics.getId(), metrics);
     }
@@ -178,4 +177,9 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
         return clone;
     }
 
+    public void finish(long bulk) {
+        stop();
+        incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 1);
+        incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, bulk);
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
deleted file mode 100644
index 93d6ec7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-
-import java.io.Serializable;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class StandardTraversalMetrics implements TraversalMetrics, Serializable {
-    // toString() specific headers
-    private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
-
-    private boolean dirty = true;
-    private final Map<String, MutableMetrics> metrics = new HashMap<>();
-    private final Map<String, MutableMetrics> allMetrics = new HashMap<>();
-    private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
-
-    /*
-    The following are computed values upon the completion of profiling in order to report the results back to the user
-     */
-    private long totalStepDuration;
-    private Map<String, ImmutableMetrics> computedMetrics;
-
-    public StandardTraversalMetrics() {
-    }
-
-    public void start(final String metricsId) {
-        dirty = true;
-        allMetrics.get(metricsId).start();
-    }
-
-    public void stop(final String metricsId) {
-        dirty = true;
-        allMetrics.get(metricsId).stop();
-    }
-
-    public boolean wasInitialized() {
-        return !this.allMetrics.isEmpty();
-    }
-
-    public void finish(final String metricsId, final long bulk) {
-        dirty = true;
-        final MutableMetrics metrics = allMetrics.get(metricsId);
-        metrics.stop();
-        metrics.incrementCount(TRAVERSER_COUNT_ID, 1);
-        metrics.incrementCount(ELEMENT_COUNT_ID, bulk);
-    }
-
-    @Override
-    public long getDuration(final TimeUnit unit) {
-        computeTotals();
-        return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
-    }
-
-    @Override
-    public Metrics getMetrics(final int index) {
-        computeTotals();
-        // adjust index to account for the injected profile steps
-        return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
-    }
-
-    @Override
-    public Metrics getMetrics(final String id) {
-        computeTotals();
-        return computedMetrics.get(id);
-    }
-
-    @Override
-    public Collection<ImmutableMetrics> getMetrics() {
-        computeTotals();
-        return computedMetrics.values();
-    }
-
-    @Override
-    public String toString() {
-        computeTotals();
-
-        // Build a pretty table of metrics data.
-
-        // Append headers
-        final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
-                .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
-
-        sb.append("\n=============================================================================================================");
-
-        appendMetrics(computedMetrics.values(), sb, 0);
-
-        // Append total duration
-        sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
-                ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
-
-        return sb.toString();
-    }
-
-    private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
-        // Append each StepMetric's row. indexToLabelMap values are ordered by index.
-        for (Metrics m : metrics) {
-            String rowName = m.getName();
-
-            // Handle indentation
-            for (int ii = 0; ii < indent; ii++) {
-                rowName = "  " + rowName;
-            }
-            // Abbreviate if necessary
-            rowName = StringUtils.abbreviate(rowName, 50);
-
-            // Grab the values
-            final Long itemCount = m.getCount(ELEMENT_COUNT_ID);
-            final Long traverserCount = m.getCount(TRAVERSER_COUNT_ID);
-            Double percentDur = (Double) m.getAnnotation(PERCENT_DURATION_KEY);
-
-            // Build the row string
-
-            sb.append(String.format("%n%-50s", rowName));
-
-            if (itemCount != null) {
-                sb.append(String.format(" %21d", itemCount));
-            } else {
-                sb.append(String.format(" %21s", ""));
-            }
-
-            if (traverserCount != null) {
-                sb.append(String.format(" %11d", traverserCount));
-            } else {
-                sb.append(String.format(" %11s", ""));
-            }
-
-            sb.append(String.format(" %15.3f", m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
-
-            if (percentDur!=null){
-                sb.append(String.format(" %8.2f", percentDur ));
-            }
-
-            appendMetrics(m.getNested(), sb, indent + 1);
-        }
-    }
-
-    private void computeTotals() {
-        if (!dirty) {
-            // already good to go
-            return;
-        }
-
-        // Create temp list of ordered metrics
-        List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
-        for (String label : indexToLabelMap.values()) {
-            // The indexToLabelMap is sorted by index (key)
-            tempMetrics.add(metrics.get(label).clone());
-        }
-
-        // Calculate total duration
-        this.totalStepDuration = 0;
-        tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
-
-        // Assign %'s
-        tempMetrics.forEach(m -> {
-            double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
-            m.setAnnotation(PERCENT_DURATION_KEY, dur);
-        });
-
-        // Store immutable instances of the calculated metrics
-        computedMetrics = new LinkedHashMap<>(metrics.size());
-        tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
-
-        dirty = false;
-    }
-
-    public static StandardTraversalMetrics merge(final Iterator<StandardTraversalMetrics> toMerge) {
-        final StandardTraversalMetrics newTraversalMetrics = new StandardTraversalMetrics();
-
-        // iterate the incoming TraversalMetrics
-        toMerge.forEachRemaining(inTraversalMetrics -> {
-            // aggregate the internal Metrics
-            inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
-
-                MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
-                if (null == aggregateMetrics) {
-                    // need to create a Metrics to aggregate into
-                    aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
-
-                    newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
-                    // Set the index of the Metrics
-                    for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
-                        if (metricsId.equals(entry.getValue())) {
-                            newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
-                            break;
-                        }
-                    }
-                }
-                aggregateMetrics.aggregate(toAggregate);
-            });
-        });
-        return newTraversalMetrics;
-    }
-
-    public void addMetrics(final MutableMetrics newMetrics, final String id, final int index, final boolean isTopLevel, final String profileStepId) {
-        if (isTopLevel) {
-            // The index is necessary to ensure that step order is preserved after a merge.
-            indexToLabelMap.put(index, id);
-            metrics.put(id, newMetrics);
-        }
-        allMetrics.put(profileStepId, newMetrics);
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/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 e73f32c..4420fa6 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,48 +24,20 @@ 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.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.map.*;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-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.*;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetrics;
 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.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation;
-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.*;
 import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
 import org.apache.tinkerpop.gremlin.structure.io.Mapper;
-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.detached.*;
+import org.apache.tinkerpop.gremlin.structure.util.reference.*;
 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;
@@ -81,38 +53,8 @@ import org.javatuples.Triplet;
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.net.URI;
-import java.time.Duration;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.MonthDay;
-import java.time.OffsetDateTime;
-import java.time.OffsetTime;
-import java.time.Period;
-import java.time.Year;
-import java.time.YearMonth;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Currency;
-import java.util.Date;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.UUID;
+import java.time.*;
+import java.util.*;
 import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import java.util.function.Function;
@@ -302,11 +244,10 @@ public final class GryoMapper implements Mapper<Kryo> {
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(BulkSet.class, null, 64));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MutableMetrics.class, null, 69));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ImmutableMetrics.class, null, 115));
-            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(StandardTraversalMetrics.class, null, 70));
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(DefaultTraversalMetrics.class, null, 70));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MapMemory.class, null, 73));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MapReduce.NullObject.class, null, 74));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(AtomicLong.class, null, 79));
-            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(DependantMutableMetrics.class, null, 80));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Pair.class, kryo -> new PairSerializer(), 88));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TraversalExplanation.class, kryo -> new JavaSerializer(), 106));
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java
new file mode 100644
index 0000000..e46b668
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java
@@ -0,0 +1,45 @@
+/*
+ * 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.DefaultTraversalMetrics;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class DefaultTraversalMetricsSupplier implements Supplier<DefaultTraversalMetrics>, Serializable {
+
+    private static final DefaultTraversalMetricsSupplier INSTANCE = new DefaultTraversalMetricsSupplier();
+
+    private DefaultTraversalMetricsSupplier() {
+    }
+
+    @Override
+    public DefaultTraversalMetrics get() {
+        return new DefaultTraversalMetrics();
+    }
+
+    public static DefaultTraversalMetricsSupplier instance() {
+        return INSTANCE;
+    }
+}

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

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/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 a899689..d8d281d 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
@@ -22,14 +22,10 @@ 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.P;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.*;
 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.sideEffect.ProfileSideEffectStep;
+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.util.Metrics;
 import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
@@ -48,9 +44,7 @@ import java.util.concurrent.TimeUnit;
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
 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.*;
 
 /**
  * @author Bob Briody (http://bobbriody.com)
@@ -97,7 +91,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         // 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.", ProfileSideEffectStep.class, steps.get(ii).getClass());
+            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.
@@ -121,7 +115,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         // 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.", ProfileSideEffectStep.class, steps.get(ii).getClass());
+            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.
@@ -254,7 +248,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
         printTraversalForm(traversal);
         traversal.iterate();
-        assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
+        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);
     }


[08/12] incubator-tinkerpop git commit: Found a nasty bug in ComputerVerificationStragegy where onGraphcomputer() was not being called beyond the root traversal --- weird. EndSteps are not processed now by ProfileStrategy. Nearly done -- need to get loca

Posted by ok...@apache.org.
Found a nasty bug in ComputerVerificationStragegy where onGraphcomputer() was not being called beyond the root traversal --- weird. EndSteps are not processed now by ProfileStrategy. Nearly done -- need to get local traversals in computer working (have an idea).


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

Branch: refs/heads/master
Commit: 781a676ccd42bed1444e998051ebc8d8c1ff3bbd
Parents: 58615c0
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Mar 21 16:30:56 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Mar 21 16:30:56 2016 -0600

----------------------------------------------------------------------
 .../traversal/step/util/ProfileStep.java        | 17 +++--
 .../strategy/finalization/ProfileStrategy.java  |  6 ++
 .../ComputerVerificationStrategy.java           | 34 +++-------
 .../traversal/util/DefaultTraversalMetrics.java | 67 +++++++-------------
 .../process/traversal/step/map/ProfileTest.java | 12 ++--
 .../structure/TinkerGraphPlayTest.java          |  3 +-
 6 files changed, 61 insertions(+), 78 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/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 840fac0..89191e0 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
@@ -49,20 +49,20 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
     public Traverser.Admin<S> next() {
         Traverser.Admin<S> ret = null;
         initializeIfNeeded();
-        metrics.start();
+        this.metrics.start();
         try {
             ret = super.next();
             return ret;
         } finally {
             if (ret != null) {
-                metrics.finish(ret.bulk());
-                if(this.onGraphComputer) {
+                this.metrics.finish(ret.bulk());
+                if (this.onGraphComputer) {
                     this.getTraversal().getSideEffects().add(this.getId(), metrics);
                     this.metrics = null;
                 }
             } else {
-                metrics.stop();
-                if(this.onGraphComputer) {
+                this.metrics.stop();
+                if (this.onGraphComputer) {
                     this.getTraversal().getSideEffects().add(this.getId(), metrics);
                     this.metrics = null;
                 }
@@ -104,6 +104,13 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
         this.onGraphComputer = true;
     }
 
+    @Override
+    public ProfileStep<S> clone() {
+        final ProfileStep<S> clone = (ProfileStep<S>) super.clone();
+        clone.metrics = null;
+        return clone;
+    }
+
     /////
 
     public static class ProfileBiOperator implements BinaryOperator<MutableMetrics> {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index dd66e1c..d5e86b8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -21,7 +21,9 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
 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.util.TraversalHelper;
@@ -54,6 +56,10 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
             // Get the original step
             Step step = steps.get(ii * 2);
 
+            if (step instanceof ComputerAwareStep.EndStep || step instanceof RepeatStep.RepeatEndStep) {
+                continue;
+            }
+
             // Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
             if (step instanceof ProfileSideEffectStep) {
                 break;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/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 8199f3a..6748cd9 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
@@ -23,17 +23,19 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Traversa
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.*;
+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;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
 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.ProfileSideEffectStep;
 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;
@@ -56,36 +58,20 @@ 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) {
 
         if (!TraversalHelper.onGraphComputer(traversal) || traversal.getParent().isLocalChild(traversal))  // only process global children as local children are standard semantics
             return;
 
-        Step<?, ?> endStep = traversal.getEndStep();
-        while (endStep instanceof ComputerAwareStep.EndStep) {
-            endStep = endStep.getPreviousStep();
-        }
-
-        if (traversal.getParent() instanceof TraversalVertexProgramStep) {
-            if (traversal.getStartStep() instanceof GraphStep && traversal.getSteps().stream().filter(step -> step instanceof GraphStep).count() > 1)
-                throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
-
-            ComputerVerificationStrategy.onlyGlobalChildren(traversal);
+        if (traversal.getParent() instanceof TraversalVertexProgramStep &&
+                TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1) {
+            throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
         }
 
         for (final Step<?, ?> step : traversal.getSteps()) {
-
+            if (step instanceof GraphComputing)
+                ((GraphComputing) step).onGraphComputer();
             // you can not traverse past the local star graph with localChildren (e.g. by()-modulators).
             if (step instanceof TraversalParent) {
                 final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/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 740cec8..bfcd27f 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
@@ -215,53 +215,34 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
         long prevDur = 0;
         for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
             Step step = (Step) traversal.getSteps().get(ii);
-            if (step instanceof ProfileStep) {
-                final MutableMetrics metrics = onGraphComputer ?
-                        traversal.getSideEffects().get(step.getId()) :
-                        ((ProfileStep) step).getMetrics();
-                if (!onGraphComputer && null != metrics) {
-                    // save duration before we adjust
-                    long tempDur = metrics.getDuration(TimeUnit.NANOSECONDS);
-                    // adjust duration
-                    metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
-                    prevDur = tempDur;
-                }
-                if (parentMetrics != null && null != metrics) {
-                    parentMetrics.addNested(metrics);
-                }
-            } else if (step instanceof TraversalParent) {
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
-                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
-                }
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
-                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
-                }
+            if (!(step instanceof ProfileStep)) {
+                continue;
             }
-        }
-    }
 
-   /* private void handleNestedTraversals(Traversal.Admin traversal, MutableMetrics parentMetrics, boolean onGraphComputer) {
-        for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
-            Step step = (Step) traversal.getSteps().get(ii);
-            if (step instanceof ProfileStep) {
-                if (onGraphComputer) {
-                    if (parentMetrics != null) {
-                        parentMetrics.addNested(traversal.getSideEffects().get(step.getId()));
-                    }
-                } else {
-                    final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
-                    if (parentMetrics != null && null != metrics) {
-                        parentMetrics.addNested(metrics);
-                    }
-                }
-            } else if (step instanceof TraversalParent) {
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
-                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
+            final MutableMetrics metrics = onGraphComputer ?
+                    traversal.getSideEffects().get(step.getId()) :
+                    ((ProfileStep) step).getMetrics();
+
+            if (!onGraphComputer) {
+                // subtract upstream duration.
+                long durBeforeAdjustment = metrics.getDuration(TimeUnit.NANOSECONDS);
+                // adjust duration
+                metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
+                prevDur = durBeforeAdjustment;
+            }
+
+            if (parentMetrics != null) {
+                parentMetrics.addNested(metrics);
+            }
+
+            if (step.getPreviousStep() instanceof TraversalParent) {
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getLocalChildren()) {
+                    handleNestedTraversals(t, metrics, false);
                 }
-                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
-                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getGlobalChildren()) {
+                    handleNestedTraversals(t, metrics, onGraphComputer);
                 }
             }
         }
-    }*/
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/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 d0ce91c..4b0d6bf 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
@@ -21,10 +21,12 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 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.computer.traversal.step.map.TraversalVertexProgramStep;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
@@ -85,7 +87,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
      */
     @Test
     @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void g_V_out_out_profile_simple() {
         final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
         printTraversalForm(traversal);
@@ -237,7 +239,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @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);
@@ -248,7 +250,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    @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();
         printTraversalForm(traversal);
@@ -279,11 +281,11 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
         assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);
 
-        final Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
+        /*final Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
         assertEquals(72, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
         assertNotEquals(0, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
         assertTrue("Count should be greater than traversers.", repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);
+        assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);*/
 
 
         double totalPercentDuration = 0;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/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 4425e65..e19dff8 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
@@ -57,7 +57,8 @@ 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());
-        final Traversal<?,?> traversal = g.V().where(__.in("created").count().is(1l)).<String>values("name").profile("m");
+        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(traversal.asAdmin().clone().toString());
        // final Traversal<?,?> clone = traversal.asAdmin().clone();


[10/12] incubator-tinkerpop git commit: EndSteps are 'ignored' in OLAP profiling cause of push-based semantics. No worries, just made the metrics toString() articulate that accordingly. This is an @rjbriody gist hand over.

Posted by ok...@apache.org.
EndSteps are 'ignored' in OLAP profiling cause of push-based semantics. No worries, just made the metrics toString() articulate that accordingly. This is an @rjbriody gist hand over.


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

Branch: refs/heads/master
Commit: 20e9ed1ef28da2c4cc3d190252391b7546369f72
Parents: 42ab8bd
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 09:48:29 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 09:48:29 2016 -0600

----------------------------------------------------------------------
 .../computer/traversal/TraversalVertexProgram.java      |  2 +-
 .../strategy/finalization/ProfileStrategy.java          |  6 +-----
 .../gremlin/util/function/MutableMetricsSupplier.java   | 12 +++++++++---
 .../tinkergraph/structure/TinkerGraphPlayTest.java      |  2 +-
 4 files changed, 12 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/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 d26ef59..666a803 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
@@ -161,7 +161,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
         }
         // 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 MutableMetricsSupplier(profileStep.getPreviousStep().getId(), profileStep.getPreviousStep().toString()), ProfileStep.ProfileBiOperator.instance());
+            this.traversal.get().getSideEffects().register(profileStep.getId(), new MutableMetricsSupplier(profileStep.getPreviousStep()), 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

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index d5e86b8..995ee18 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -54,11 +54,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
         final int numSteps = steps.size();
         for (int ii = 0; ii < numSteps; ii++) {
             // Get the original step
-            Step step = steps.get(ii * 2);
-
-            if (step instanceof ComputerAwareStep.EndStep || step instanceof RepeatStep.RepeatEndStep) {
-                continue;
-            }
+            final Step step = steps.get(ii * 2);
 
             // Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
             if (step instanceof ProfileSideEffectStep) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/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
index c83d21e..15e4420 100644
--- 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
@@ -19,6 +19,9 @@
 
 package org.apache.tinkerpop.gremlin.util.function;
 
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
 import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
 
 import java.io.Serializable;
@@ -32,9 +35,12 @@ public final class MutableMetricsSupplier implements Supplier<MutableMetrics>, S
     private final String stepId;
     private final String stepString;
 
-    public MutableMetricsSupplier(final String stepId, final String stepString) {
-        this.stepId = stepId;
-        this.stepString = stepString;
+    public MutableMetricsSupplier(final Step<?, ?> previousStep) {
+        this.stepId = previousStep.getId();
+        this.stepString =
+                previousStep instanceof RepeatStep.RepeatEndStep || previousStep instanceof ComputerAwareStep.EndStep ?
+                        previousStep.toString() + " (profiling ignored)" :
+                        previousStep.toString();
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/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 f0d77ab..be065c7 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
@@ -59,7 +59,7 @@ public class TinkerGraphPlayTest {
         //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().both().hasLabel("person").order().by("age", Order.decr).values("name");
+        final Traversal<?,?> traversal = g.V().repeat(__.union(__.<Vertex>identity().as("a"),out())).times(2).profile();
         //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();


[07/12] incubator-tinkerpop git commit: work on profile step on GraphComputer. Need @rbriody to review and discuss.

Posted by ok...@apache.org.
work on profile step on GraphComputer. Need @rbriody to review and discuss.


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

Branch: refs/heads/master
Commit: 58615c04228b3508da5141ab5a6a1bf4f050ef9f
Parents: 73b2d42
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Mar 21 12:36:00 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Mar 21 12:36:00 2016 -0600

----------------------------------------------------------------------
 .../process/computer/MemoryComputeKey.java      |  2 +-
 .../traversal/TraversalVertexProgram.java       | 22 ++++++-
 .../traversal/step/filter/DedupGlobalStep.java  |  7 ++-
 .../traversal/step/filter/RangeGlobalStep.java  |  6 +-
 .../traversal/step/filter/TailGlobalStep.java   |  2 +-
 .../traversal/step/map/OrderGlobalStep.java     | 14 ++---
 .../step/sideEffect/ProfileSideEffectStep.java  | 16 ++---
 .../step/util/CollectingBarrierStep.java        |  3 +-
 .../traversal/step/util/ProfileStep.java        | 41 ++++++++++++-
 .../step/util/SupplyingBarrierStep.java         |  3 +-
 .../ComputerVerificationStrategy.java           |  2 +-
 .../traversal/util/DefaultTraversalMetrics.java | 61 ++++++++++++++++----
 .../process/traversal/step/map/ProfileTest.java | 35 ++++++-----
 .../structure/TinkerGraphPlayTest.java          | 15 ++---
 14 files changed, 171 insertions(+), 58 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
index 61e2fd8..94ca675 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
@@ -73,7 +73,7 @@ public final class MemoryComputeKey<A> implements Serializable {
         return object instanceof MemoryComputeKey && ((MemoryComputeKey) object).key.equals(this.key);
     }
 
-    public static <A> MemoryComputeKey of(final String key, final BinaryOperator<A> reducer, final boolean isBroadcast, final boolean isTransient) {
+    public static <A> MemoryComputeKey<A> of(final String key, final BinaryOperator<A> reducer, final boolean isBroadcast, final boolean isTransient) {
         return new MemoryComputeKey<>(key, reducer, isBroadcast, isTransient);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/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 aaac518..fbe5592 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
@@ -54,12 +54,15 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyKeyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyValueStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SackStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
 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.step.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.VertexProgramStrategy;
 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;
@@ -141,6 +144,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
         // if results will be serialized out, don't save halted traversers across the cluster
         this.keepDistributedHaltedTraversers =
                 !(this.traversal.get().getParent().asStep().getNextStep() instanceof ComputerResultStep || // if its just going to stream it out, don't distribute
+                        this.traversal.get().getParent().asStep().getNextStep().getNextStep() instanceof ComputerResultStep ||
                         this.traversal.get().getParent().asStep().getNextStep() instanceof EmptyStep);  // same as above, but if using TraversalVertexProgramStep directly
         // register traversal side-effects in memory
         final TraversalSideEffects sideEffects = ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).getSideEffects();
@@ -155,6 +159,11 @@ 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
+        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());
+
+        }
         // 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
         this.memoryComputeKeys.add(MemoryComputeKey.of(ACTIVE_TRAVERSERS, Operator.addAll, true, true));
@@ -170,6 +179,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
 
     @Override
     public void setup(final Memory memory) {
+        // memory is distributed
+        ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
         memory.set(VOTE_TO_HALT, true);
         memory.set(HALTED_TRAVERSERS, new TraverserSet<>());
         memory.set(ACTIVE_TRAVERSERS, new TraverserSet<>());
@@ -177,7 +188,7 @@ 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)));
-        ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
+
     }
 
     @Override
@@ -187,7 +198,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
 
     @Override
     public void execute(final Vertex vertex, final Messenger<TraverserSet<Object>> messenger, final Memory memory) {
-        // back the traversal side-effects by the global memory
+        // memory is distributed
         ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, true);
         // if a barrier was completed in another worker, it is also completed here (ensure distributed barries are synchronized)
         final Set<String> completedBarriers = memory.get(COMPLETED_BARRIERS);
@@ -235,10 +246,11 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
 
     @Override
     public boolean terminate(final Memory memory) {
+        // memory is not distributed
+        ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
         final boolean voteToHalt = memory.<Boolean>get(VOTE_TO_HALT);
         memory.set(VOTE_TO_HALT, true);
         memory.set(ACTIVE_TRAVERSERS, new TraverserSet<>());
-        // put all side-effect memory into traversal side-effects
         if (voteToHalt) {
             final Set<String> mutatedMemoryKeys = memory.get(MUTATED_MEMORY_KEYS);
             memory.set(MUTATED_MEMORY_KEYS, new HashSet<>());
@@ -272,6 +284,10 @@ 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.
+                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())));
+                }
                 return true;
             }
         } else {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
index 649380e..546d24e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
@@ -43,6 +43,7 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.function.BinaryOperator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -120,7 +121,9 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Traversal
 
     @Override
     public Set<TraverserRequirement> getRequirements() {
-        return this.dedupLabels == null ? this.getSelfAndChildRequirements(TraverserRequirement.BULK) : this.getSelfAndChildRequirements(TraverserRequirement.LABELED_PATH, TraverserRequirement.BULK);
+        return this.dedupLabels == null ?
+                this.getSelfAndChildRequirements(TraverserRequirement.BULK) :
+                this.getSelfAndChildRequirements(TraverserRequirement.LABELED_PATH, TraverserRequirement.BULK);
     }
 
     @Override
@@ -167,7 +170,7 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Traversal
 
     @Override
     public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
-        return MemoryComputeKey.of(this.getId(), Operator.addAll, false, true);
+        return MemoryComputeKey.of(this.getId(), (BinaryOperator) Operator.addAll, false, true);
     }
 
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
index 7576cc1..9458ca9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -135,7 +135,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
 
     @Override
     public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
-        return MemoryComputeKey.of(this.getId(), new RangeBiOperator(this.high), false, true);
+        return MemoryComputeKey.of(this.getId(), new RangeBiOperator<>(this.high), false, true);
     }
 
     @Override
@@ -174,7 +174,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
 
     ////////////////
 
-    public static final class RangeBiOperator implements BinaryOperator<TraverserSet>, Serializable {
+    public static final class RangeBiOperator<S> implements BinaryOperator<TraverserSet<S>>, Serializable {
 
         private final long highRange;
 
@@ -187,7 +187,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
         }
 
         @Override
-        public TraverserSet apply(final TraverserSet mutatingSeed, final TraverserSet set) {
+        public TraverserSet<S> apply(final TraverserSet<S> mutatingSeed, final TraverserSet<S> set) {
             if (mutatingSeed.size() < this.highRange)
                 mutatingSeed.addAll(set);
             return mutatingSeed;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
index 9d19cb9..096151d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
@@ -126,7 +126,7 @@ public final class TailGlobalStep<S> extends AbstractStep<S, S> implements Bypas
 
     @Override
     public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
-        return MemoryComputeKey.of(this.getId(), new RangeGlobalStep.RangeBiOperator(this.limit), false, true);
+        return MemoryComputeKey.of(this.getId(), new RangeGlobalStep.RangeBiOperator<>(this.limit), false, true);
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
index cfec540..1daa31a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
@@ -138,13 +138,13 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
     @Override
     public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
         if (null == this.chainedComparator)
-            this.chainedComparator = new ChainedComparator(true, this.comparators);
-        return MemoryComputeKey.of(this.getId(), new OrderBiOperator(this.chainedComparator, this.limit), false, true);
+            this.chainedComparator = new ChainedComparator<>(true, this.comparators);
+        return MemoryComputeKey.of(this.getId(), new OrderBiOperator<>(this.chainedComparator, this.limit), false, true);
     }
 
     ////////////////
 
-    public static final class OrderBiOperator implements BinaryOperator<TraverserSet>, Serializable {
+    public static final class OrderBiOperator<S> implements BinaryOperator<TraverserSet<S>>, Serializable {
 
         private ChainedComparator chainedComparator;
         private long limit;
@@ -153,13 +153,13 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
             // for serializers that need a no-arg constructor
         }
 
-        public OrderBiOperator(final ChainedComparator chainedComparator, final long limit) {
+        public OrderBiOperator(final ChainedComparator<S,?> chainedComparator, final long limit) {
             this.chainedComparator = chainedComparator;
             this.limit = limit;
         }
 
         @Override
-        public TraverserSet apply(final TraverserSet setA, final TraverserSet setB) {
+        public TraverserSet<S> apply(final TraverserSet<S> setA, final TraverserSet<S> setB) {
             setA.addAll(setB);
             if (Long.MAX_VALUE != this.limit && setA.bulkSize() > this.limit) {
                 if (this.chainedComparator.isShuffle())
@@ -167,9 +167,9 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
                 else
                     setA.sort(this.chainedComparator);
                 long counter = 0l;
-                final Iterator<Traverser.Admin> traversers = setA.iterator();
+                final Iterator<Traverser.Admin<S>> traversers = setA.iterator();
                 while (traversers.hasNext()) {
-                    final Traverser.Admin traverser = traversers.next();
+                    final Traverser.Admin<S> traverser = traversers.next();
                     if (counter > this.limit)
                         traversers.remove();
                     counter = counter + traverser.bulk();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/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 7a9523e..e2cf947 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
@@ -60,8 +60,8 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
             ret = super.next();
             return ret;
         } finally {
-            if (ret == null) {
-                finalizeMetrics();
+            if (!this.onGraphComputer && ret == null) {
+                ((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
             }
         }
     }
@@ -69,15 +69,17 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
     @Override
     public boolean hasNext() {
         boolean ret = super.hasNext();
-        if (!ret) {
-            finalizeMetrics();
+        if (!this.onGraphComputer && !ret) {
+            ((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
         }
         return ret;
     }
 
-    private void finalizeMetrics() {
-        final DefaultTraversalMetrics tm = this.getTraversal().getSideEffects().get(this.sideEffectKey);
-        tm.setMetrics(traversal, onGraphComputer);
+    @Override
+    public DefaultTraversalMetrics generateFinalResult(final DefaultTraversalMetrics tm) {
+        if (this.onGraphComputer)
+            tm.setMetrics(this.getTraversal(), true);
+        return tm;
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
index f3bd457..f9c85a2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
@@ -32,6 +32,7 @@ import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
 import java.util.Collections;
 import java.util.NoSuchElementException;
 import java.util.Set;
+import java.util.function.BinaryOperator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -135,6 +136,6 @@ public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> implem
 
     @Override
     public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
-        return MemoryComputeKey.of(this.getId(), Operator.addAll, false, true);
+        return MemoryComputeKey.of(this.getId(), (BinaryOperator) Operator.addAll, false, true);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/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 26ba878..840fac0 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
@@ -18,19 +18,24 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.util;
 
+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 java.util.NoSuchElementException;
+import java.util.function.BinaryOperator;
 
 /**
  * @author Bob Briody (http://bobbriody.com)
  */
-public final class ProfileStep<S> extends AbstractStep<S, S> {
+public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryComputing<MutableMetrics>, GraphComputing {
     private MutableMetrics metrics;
+    private boolean onGraphComputer = false;
 
     public ProfileStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -51,8 +56,16 @@ public final class ProfileStep<S> extends AbstractStep<S, S> {
         } finally {
             if (ret != null) {
                 metrics.finish(ret.bulk());
+                if(this.onGraphComputer) {
+                    this.getTraversal().getSideEffects().add(this.getId(), metrics);
+                    this.metrics = null;
+                }
             } else {
                 metrics.stop();
+                if(this.onGraphComputer) {
+                    this.getTraversal().getSideEffects().add(this.getId(), metrics);
+                    this.metrics = null;
+                }
             }
         }
     }
@@ -81,4 +94,30 @@ public final class ProfileStep<S> extends AbstractStep<S, S> {
         }
     }
 
+    @Override
+    public MemoryComputeKey<MutableMetrics> getMemoryComputeKey() {
+        return MemoryComputeKey.of(this.getId(), ProfileBiOperator.instance(), false, true);
+    }
+
+    @Override
+    public void onGraphComputer() {
+        this.onGraphComputer = true;
+    }
+
+    /////
+
+    public static class ProfileBiOperator implements BinaryOperator<MutableMetrics> {
+
+        private static final ProfileBiOperator INSTANCE = new ProfileBiOperator();
+
+        @Override
+        public MutableMetrics apply(final MutableMetrics metrics, final MutableMetrics metrics2) {
+            metrics.aggregate(metrics2);
+            return metrics;
+        }
+
+        public static final ProfileBiOperator instance() {
+            return INSTANCE;
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
index 9cccb67..51ae06d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementExce
 
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import java.util.function.BinaryOperator;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -107,6 +108,6 @@ public abstract class SupplyingBarrierStep<S, E> extends AbstractStep<S, E> impl
 
     @Override
     public MemoryComputeKey<Boolean> getMemoryComputeKey() {
-        return MemoryComputeKey.of(this.getId(), Operator.and, false, true);
+        return MemoryComputeKey.of(this.getId(), (BinaryOperator) Operator.and, false, true);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/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 85ce73b..8199f3a 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
@@ -50,7 +50,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
 
     private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
     private static final Set<Class<?>> UNSUPPORTED_STEPS = new HashSet<>(Arrays.asList(
-            InjectStep.class, Mutating.class, SubgraphStep.class, ProfileStep.class, ProfileSideEffectStep.class, ComputerResultStep.class
+            InjectStep.class, Mutating.class, SubgraphStep.class, ComputerResultStep.class
     ));
 
     private ComputerVerificationStrategy() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/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 a2d2812..740cec8 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
@@ -25,7 +25,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
 
 import java.io.Serializable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
 import java.util.concurrent.TimeUnit;
 
 /**
@@ -182,18 +189,25 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
     }
 
     public void setMetrics(Traversal.Admin traversal, boolean onGraphComputer) {
-        addTopLevelMetrics(traversal);
+        addTopLevelMetrics(traversal, onGraphComputer);
         handleNestedTraversals(traversal, null, onGraphComputer);
         computeTotals();
     }
 
-    private void addTopLevelMetrics(Traversal.Admin traversal) {
+    private void addTopLevelMetrics(Traversal.Admin traversal, final boolean onGraphComputer) {
         final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
         for (int ii = 0; ii < profileSteps.size(); ii++) {
             // The index is necessary to ensure that step order is preserved after a merge.
-            final MutableMetrics stepMetrics = profileSteps.get(ii).getMetrics();
-            this.indexToLabelMap.put(ii, stepMetrics.getId());
-            this.metrics.put(stepMetrics.getId(), stepMetrics);
+            final ProfileStep step = profileSteps.get(ii);
+            if (onGraphComputer) {
+                final MutableMetrics stepMetrics = traversal.getSideEffects().get(step.getId());
+                this.indexToLabelMap.put(ii, stepMetrics.getId());
+                this.metrics.put(stepMetrics.getId(), stepMetrics);
+            } else {
+                final MutableMetrics stepMetrics = step.getMetrics();
+                this.indexToLabelMap.put(ii, stepMetrics.getId());
+                this.metrics.put(stepMetrics.getId(), stepMetrics);
+            }
         }
     }
 
@@ -202,20 +216,22 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
         for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
             Step step = (Step) traversal.getSteps().get(ii);
             if (step instanceof ProfileStep) {
-                final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
-                if (!onGraphComputer) {
+                final MutableMetrics metrics = onGraphComputer ?
+                        traversal.getSideEffects().get(step.getId()) :
+                        ((ProfileStep) step).getMetrics();
+                if (!onGraphComputer && null != metrics) {
                     // save duration before we adjust
                     long tempDur = metrics.getDuration(TimeUnit.NANOSECONDS);
                     // adjust duration
                     metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
                     prevDur = tempDur;
                 }
-                if (parentMetrics != null) {
+                if (parentMetrics != null && null != metrics) {
                     parentMetrics.addNested(metrics);
                 }
             } else if (step instanceof TraversalParent) {
                 for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
-                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
                 }
                 for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
                     handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
@@ -223,4 +239,29 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
             }
         }
     }
+
+   /* private void handleNestedTraversals(Traversal.Admin traversal, MutableMetrics parentMetrics, boolean onGraphComputer) {
+        for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
+            Step step = (Step) traversal.getSteps().get(ii);
+            if (step instanceof ProfileStep) {
+                if (onGraphComputer) {
+                    if (parentMetrics != null) {
+                        parentMetrics.addNested(traversal.getSideEffects().get(step.getId()));
+                    }
+                } else {
+                    final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
+                    if (parentMetrics != null && null != metrics) {
+                        parentMetrics.addNested(metrics);
+                    }
+                }
+            } else if (step instanceof TraversalParent) {
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
+                }
+                for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+                    handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+                }
+            }
+        }
+    }*/
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/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 d8d281d..d0ce91c 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
@@ -21,8 +21,11 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
 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.*;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+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.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
@@ -44,7 +47,9 @@ import java.util.concurrent.TimeUnit;
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
 
 /**
  * @author Bob Briody (http://bobbriody.com)
@@ -80,7 +85,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
      */
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void g_V_out_out_profile_simple() {
         final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
         printTraversalForm(traversal);
@@ -102,7 +107,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@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();
         printTraversalForm(traversal);
@@ -232,7 +237,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@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);
@@ -243,7 +248,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@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();
         printTraversalForm(traversal);
@@ -290,7 +295,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@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);
@@ -301,7 +306,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@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);
@@ -382,7 +387,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void testProfileStrategyCallback() {
         final Traversal<Vertex, TraversalMetrics> t = get_g_V_out_out_profile();
         MockStep mockStep = new MockStep(t.asAdmin());
@@ -390,14 +395,14 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         TraversalMetrics traversalMetrics = t.next();
         assertTrue(mockStep.callbackCalled);
 
-        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
+        if (!onGraphComputer(t.asAdmin())) {
             assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
         }
     }
 
     @Test
     @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
     public void testProfileStrategyCallbackSideEffect() {
         final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetrics_keyX();
         MockStep mockStep = new MockStep(t.asAdmin());
@@ -405,7 +410,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         t.iterate();
         assertTrue(mockStep.callbackCalled);
 
-        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
+        if (!onGraphComputer(t.asAdmin())) {
             final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
             assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
         }
@@ -427,6 +432,10 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         traversal.iterate();
     }
 
+    private static boolean onGraphComputer(final Traversal.Admin<?, ?> traversal) {
+        return !TraversalHelper.getStepsOfClass(TraversalVertexProgramStep.class, TraversalHelper.getRootTraversal(traversal)).isEmpty();
+    }
+
     /**
      * Traversals
      */

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/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 6dbedc2..4425e65 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
@@ -57,13 +57,14 @@ 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());
-        final Traversal<?,?> traversal = g.V().out("created").group("m").by(T.label).pageRank(1.0).by("pageRank").by(__.inE()).times(1).in("created").group("m").by("pageRank").cap("m");
-
-        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().clone().toList());
+        final Traversal<?,?> traversal = g.V().where(__.in("created").count().is(1l)).<String>values("name").profile("m");
+
+        //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(g.V().pageRank().order().by(PageRankVertexProgram.PAGE_RANK).valueMap().toList());
     }
 



[06/12] incubator-tinkerpop git commit: merge master

Posted by ok...@apache.org.
merge master


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

Branch: refs/heads/master
Commit: 73b2d42a5d0ebe9091fb300db9e5ca01206f4e45
Parents: 5b6acfc 11a7173
Author: rjbriody <bo...@datastax.com>
Authored: Mon Mar 21 09:24:37 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Mon Mar 21 09:24:37 2016 -0400

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |    21 +-
 docs/src/dev/provider/index.asciidoc            |    20 +
 .../src/reference/gremlin-applications.asciidoc |    81 +
 .../reference/implementations-hadoop.asciidoc   |    79 +-
 docs/src/reference/the-graphcomputer.asciidoc   |    24 +-
 docs/src/reference/the-traversal.asciidoc       |     2 +-
 .../tutorials/getting-started/index.asciidoc    |     4 +-
 .../upgrade/release-3.2.x-incubating.asciidoc   |   113 +-
 docs/static/images/nine-inch-gremlins.png       |   Bin 0 -> 160571 bytes
 docs/static/images/remote-graph.png             |   Bin 0 -> 19299 bytes
 docs/static/images/tinkerpop3.graffle           | 31929 ++++++++++++++++-
 giraph-gremlin/pom.xml                          |    12 +-
 .../process/computer/GiraphGraphComputer.java   |     8 +-
 .../structure/io/GiraphVertexOutputFormat.java  |     4 +-
 .../giraph/structure/io/GiraphVertexWriter.java |     2 +-
 gremlin-console/conf/remote-graph.properties    |    34 +
 .../groovy/plugin/DriverGremlinPlugin.java      |     2 +
 gremlin-console/src/main/static/LICENSE         |     2 +-
 .../groovy/plugin/DriverGremlinPluginTest.java  |     9 -
 .../step/map/PageRankVertexProgramStep.java     |     5 +
 .../step/map/PeerPressureVertexProgramStep.java |     5 +
 .../step/map/TraversalVertexProgramStep.java    |     5 +
 .../process/remote/RemoteConnection.java        |    34 +
 .../remote/RemoteConnectionException.java       |    41 +
 .../gremlin/process/remote/RemoteGraph.java     |   232 +
 .../remote/traversal/step/map/RemoteStep.java   |    77 +
 .../traversal/strategy/RemoteStrategy.java      |    86 +
 .../traversal/step/map/AddVertexStartStep.java  |     1 -
 .../process/traversal/step/map/GraphStep.java   |    33 +-
 .../process/traversal/step/map/GroupStep.java   |     4 +-
 .../process/traversal/util/PureTraversal.java   |    10 +
 .../tinkerpop/gremlin/structure/io/Storage.java |    20 +-
 .../gremlin/structure/io/gryo/GryoMapper.java   |    54 +-
 .../tinkerpop/gremlin/driver/Channelizer.java   |     2 +-
 .../apache/tinkerpop/gremlin/driver/Client.java |   339 +-
 .../tinkerpop/gremlin/driver/Cluster.java       |    30 +-
 .../tinkerpop/gremlin/driver/Handler.java       |    22 +-
 .../tinkerpop/gremlin/driver/ResultQueue.java   |    11 +-
 .../tinkerpop/gremlin/driver/Settings.java      |   107 +
 .../apache/tinkerpop/gremlin/driver/Tokens.java |     1 +
 .../driver/remote/DriverRemoteConnection.java   |   227 +
 .../gremlin/driver/ResultQueueTest.java         |    17 +-
 .../tinkerpop/gremlin/driver/SettingsTest.java  |    88 +
 .../traversal/step/filter/GroovyHasTest.groovy  |    20 +
 .../step/filter/GroovyWhereTest.groovy          |     2 +-
 gremlin-groovy/pom.xml                          |    10 +-
 .../AbstractImportCustomizerProvider.java       |     2 +
 .../plugin/dsl/credential/CredentialGraph.java  |     2 +-
 gremlin-server/scripts/generate-all.groovy      |    54 +
 gremlin-server/src/assembly/distribution.xml    |     3 +-
 gremlin-server/src/assembly/standalone.xml      |     3 +
 .../server/auth/SimpleAuthenticator.java        |     2 +-
 .../server/op/AbstractEvalOpProcessor.java      |   195 +-
 .../gremlin/server/op/AbstractOpProcessor.java  |   234 +
 .../op/traversal/TraversalOpProcessor.java      |   214 +
 ....apache.tinkerpop.gremlin.server.OpProcessor |     3 +-
 gremlin-server/src/main/static/LICENSE          |     2 +-
 .../driver/remote/RemoteGraphProvider.java      |   138 +
 .../process/RemoteGraphProcessStandardTest.java |    33 +
 .../server/GremlinResultSetIntegrateTest.java   |    62 +-
 .../gremlin/server/ServerTestHelper.java        |     2 +-
 .../remote/gremlin-server-integration.yaml      |    63 +
 .../tinkerpop/gremlin/AbstractGremlinTest.java  |     3 +
 .../apache/tinkerpop/gremlin/GraphManager.java  |     6 +
 .../apache/tinkerpop/gremlin/GraphProvider.java |    19 +
 .../process/traversal/step/filter/DropTest.java |    14 +-
 .../process/traversal/step/filter/HasTest.java  |    66 +-
 .../traversal/step/filter/WhereTest.java        |     2 +-
 .../process/traversal/step/map/AddEdgeTest.java |    44 +-
 .../traversal/step/map/AddVertexTest.java       |    16 +-
 .../process/traversal/step/map/MatchTest.java   |    32 +-
 .../PartitionStrategyProcessTest.java           |    35 +-
 .../ReadOnlyStrategyProcessTest.java            |    14 +-
 hadoop-gremlin/conf/hadoop-graphson.properties  |     6 +-
 .../conf/hadoop-grateful-gryo.properties        |     4 +-
 hadoop-gremlin/conf/hadoop-gryo.properties      |     7 +-
 hadoop-gremlin/conf/hadoop-script.properties    |     4 +-
 hadoop-gremlin/pom.xml                          |    12 +-
 .../tinkerpop/gremlin/hadoop/Constants.java     |    27 +-
 .../computer/AbstractHadoopGraphComputer.java   |    13 +-
 .../computer/GraphFilterInputFormat.java        |     2 +-
 .../computer/GraphFilterRecordReader.java       |     2 +-
 .../process/computer/util/MapReduceHelper.java  |     2 +-
 .../hadoop/structure/HadoopConfiguration.java   |    54 +-
 .../gremlin/hadoop/structure/HadoopGraph.java   |    25 +-
 .../hadoop/structure/io/FileSystemStorage.java  |    12 +-
 .../structure/io/HadoopElementIterator.java     |     3 +-
 .../hadoop/structure/io/HadoopPools.java        |     5 +-
 .../hadoop/structure/io/InputOutputHelper.java  |     7 +-
 .../io/graphson/GraphSONRecordReader.java       |     2 +-
 .../io/graphson/GraphSONRecordWriter.java       |     2 +-
 .../structure/io/gryo/GryoRecordWriter.java     |     2 +-
 .../gremlin/hadoop/structure/util/ConfUtil.java |    15 +
 .../gremlin/hadoop/HadoopGraphProvider.java     |     6 +-
 .../structure/io/FileSystemStorageCheck.java    |     4 +-
 .../step/sideEffect/Neo4jGraphStep.java         |     5 +
 .../optimization/Neo4jGraphStepStrategy.java    |     5 +-
 pom.xml                                         |     7 +-
 spark-gremlin/pom.xml                           |     5 +-
 .../process/computer/SparkGraphComputer.java    |    50 +-
 .../spark/structure/io/InputFormatRDD.java      |     2 +-
 .../spark/structure/io/InputOutputHelper.java   |    19 +-
 .../spark/structure/io/InputRDDFormat.java      |     2 +-
 .../spark/structure/io/OutputFormatRDD.java     |     2 +-
 .../spark/structure/io/PersistedInputRDD.java   |     5 +-
 .../spark/structure/io/PersistedOutputRDD.java  |     2 +-
 .../spark/structure/io/SparkContextStorage.java |    26 +-
 .../process/computer/LocalPropertyTest.java     |     8 +-
 .../computer/SparkHadoopGraphProvider.java      |    15 +-
 .../gremlin/spark/structure/SparkTest.java      |     4 +-
 .../spark/structure/io/InputOutputRDDTest.java  |     4 +-
 .../spark/structure/io/InputRDDTest.java        |     9 +-
 .../spark/structure/io/OutputRDDTest.java       |     4 +-
 .../io/PersistedInputOutputRDDTest.java         |    42 +-
 .../io/gryo/GryoSerializerIntegrateTest.java    |    16 +-
 .../step/sideEffect/TinkerGraphStep.java        |     5 +
 .../optimization/TinkerGraphStepStrategy.java   |     5 +-
 117 files changed, 34926 insertions(+), 624 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/73b2d42a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------


[11/12] incubator-tinkerpop git commit: minor nothing logic tweak.

Posted by ok...@apache.org.
minor nothing logic tweak.


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

Branch: refs/heads/master
Commit: 32afb58aead3cfeb61973b0c4748c691621ad91f
Parents: 20e9ed1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 10:21:22 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 10:21:22 2016 -0600

----------------------------------------------------------------------
 .../process/computer/traversal/TraversalVertexProgram.java      | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/32afb58a/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 666a803..0cd873f 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
@@ -144,8 +144,9 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
         // if results will be serialized out, don't save halted traversers across the cluster
         this.keepDistributedHaltedTraversers =
                 !(this.traversal.get().getParent().asStep().getNextStep() instanceof ComputerResultStep || // if its just going to stream it out, don't distribute
-                        this.traversal.get().getParent().asStep().getNextStep().getNextStep() instanceof ComputerResultStep ||
-                        this.traversal.get().getParent().asStep().getNextStep() instanceof EmptyStep);  // same as above, but if using TraversalVertexProgramStep directly
+                        this.traversal.get().getParent().asStep().getNextStep() instanceof EmptyStep ||  // same as above, but if using TraversalVertexProgramStep directly
+                        (this.traversal.get().getParent().asStep().getNextStep() instanceof ProfileStep && // same as above, but needed for profiling
+                                this.traversal.get().getParent().asStep().getNextStep().getNextStep() instanceof ComputerResultStep));
         // register traversal side-effects in memory
         final TraversalSideEffects sideEffects = ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).getSideEffects();
         sideEffects.keys().forEach(key -> this.memoryComputeKeys.add(MemoryComputeKey.of(key, sideEffects.getReducer(key), true, false)));


[05/12] incubator-tinkerpop git commit: Revert "Don't profile computer steps."

Posted by ok...@apache.org.
Revert "Don't profile computer steps."

This reverts commit 3f25710b10301432ea64996330a084872d8bc78f.


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

Branch: refs/heads/master
Commit: 5b6acfc754ba7b5f50942b607786fe00bf6ef020
Parents: 581f33b
Author: rjbriody <bo...@datastax.com>
Authored: Mon Mar 21 09:07:21 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Mon Mar 21 09:07:21 2016 -0400

----------------------------------------------------------------------
 .../strategy/finalization/ProfileStrategy.java         | 13 +++----------
 1 file changed, 3 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5b6acfc7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index 5eb16eb..dd66e1c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -18,8 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
 
-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.TraversalStrategy;
@@ -52,14 +50,9 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
         // Add .profile() step after every pre-existing step.
         final List<Step> steps = traversal.getSteps();
         final int numSteps = steps.size();
-        for (int ii = 0; ii < numSteps; ii += 2) {
+        for (int ii = 0; ii < numSteps; ii++) {
             // Get the original step
-            Step step = steps.get(ii);
-            if (step instanceof TraversalVertexProgramStep || step instanceof ComputerResultStep) {
-                ii--;
-                // don't profile the computer steps
-                continue;
-            }
+            Step step = steps.get(ii * 2);
 
             // Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
             if (step instanceof ProfileSideEffectStep) {
@@ -68,7 +61,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
 
             // Create and inject ProfileStep
             ProfileStep profileStep = new ProfileStep(traversal);
-            traversal.addStep(ii + 1, profileStep);
+            traversal.addStep((ii * 2) + 1, profileStep);
         }
     }
 


[09/12] 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.

Posted by ok...@apache.org.
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/master
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());
     }
 


[12/12] incubator-tinkerpop git commit: updated CHANGELOG.

Posted by ok...@apache.org.
updated CHANGELOG.


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

Branch: refs/heads/master
Commit: c7111bedc25f265a1da859e07cf12dff4abf0dd0
Parents: 32afb58
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 14:53:12 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 14:53:12 2016 -0600

----------------------------------------------------------------------
 CHANGELOG.asciidoc | 2 ++
 1 file changed, 2 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c7111bed/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 2d7fe5f..1865936 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
 TinkerPop 3.2.0 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Fixed a bug around profiling and nested traversals.
 * Added `gremlin.hadoop.defaultGraphComputer` so users can use `graph.compute()` with `HadoopGraph`.
 * Added `gremlin.hadoop.graphReader` and `gremlin.hadoop.graphWriter` which can handled `XXXFormats` and `XXXRDDs`.
 * Deprecated `gremlin.hadoop.graphInputFormat`, `gremlin.hadoop.graphOutputFormat`, `gremlin.spark.graphInputRDD`, and `gremlin.spark.graphOuputRDD`.
@@ -128,6 +129,7 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
 TinkerPop 3.1.2 (NOT OFFICIALLY RELEASED YET)
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 
+* Renamed `StandardTraversalMetrics` to `DefaultTraversalMetrics` given the `DefaultXXX`-convention throughout. (*breaking*)
 * Bumped to Apache Hadoop 2.7.2.
 * Fixed a bug in `gremlin-driver` where a really fast call to get a `Future` to wait for a result might not register an error raised from the server.
 * Fixed a severe bug where `LP_O_OB_P_S_SE_SL_Traverser` was not registered with `GryoMapper`.


[04/12] incubator-tinkerpop git commit: Put back check to prevent profiling of computer traversals.

Posted by ok...@apache.org.
Put back check to prevent profiling of computer traversals.


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

Branch: refs/heads/master
Commit: 581f33bcb8aef7ff76e31175b0b0fcdc5059bba7
Parents: 800cf0a
Author: rjbriody <bo...@datastax.com>
Authored: Mon Mar 21 09:04:32 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Mon Mar 21 09:04:32 2016 -0400

----------------------------------------------------------------------
 .../strategy/verification/ComputerVerificationStrategy.java  | 4 +++-
 .../gremlin/tinkergraph/structure/TinkerGraphPlayTest.java   | 8 --------
 2 files changed, 3 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/581f33bc/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 f17735f..85ce73b 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
@@ -28,10 +28,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalSte
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
 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.ProfileSideEffectStep;
 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;
@@ -48,7 +50,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
 
     private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
     private static final Set<Class<?>> UNSUPPORTED_STEPS = new HashSet<>(Arrays.asList(
-            InjectStep.class, Mutating.class, SubgraphStep.class, ComputerResultStep.class
+            InjectStep.class, Mutating.class, SubgraphStep.class, ProfileStep.class, ProfileSideEffectStep.class, ComputerResultStep.class
     ));
 
     private ComputerVerificationStrategy() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/581f33bc/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 97aef31..6dbedc2 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
@@ -51,14 +51,6 @@ public class TinkerGraphPlayTest {
     private static final Logger logger = LoggerFactory.getLogger(TinkerGraphPlayTest.class);
 
     @Test
-    public void testBob() {
-        GraphTraversalSource g = TinkerFactory.createModern().traversal().withComputer();
-        final GraphTraversal<Vertex, Long> traversal = g.V().hasLabel("person").bothE().count().profile("m");
-        traversal.iterate();
-        System.out.println(traversal.asAdmin().getSideEffects().get("m").toString());
-    }
-
-    @Test
     @Ignore
     public void testPlay8() throws Exception {
         Graph graph = TinkerFactory.createModern();


[02/12] incubator-tinkerpop git commit: Don't profile computer steps.

Posted by ok...@apache.org.
Don't profile computer steps.


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

Branch: refs/heads/master
Commit: 3f25710b10301432ea64996330a084872d8bc78f
Parents: e73bbc5
Author: rjbriody <bo...@datastax.com>
Authored: Thu Mar 17 17:38:26 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Thu Mar 17 17:38:26 2016 -0400

----------------------------------------------------------------------
 .../strategy/finalization/ProfileStrategy.java         | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3f25710b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index dd66e1c..5eb16eb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -18,6 +18,8 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
 
+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.TraversalStrategy;
@@ -50,9 +52,14 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
         // Add .profile() step after every pre-existing step.
         final List<Step> steps = traversal.getSteps();
         final int numSteps = steps.size();
-        for (int ii = 0; ii < numSteps; ii++) {
+        for (int ii = 0; ii < numSteps; ii += 2) {
             // Get the original step
-            Step step = steps.get(ii * 2);
+            Step step = steps.get(ii);
+            if (step instanceof TraversalVertexProgramStep || step instanceof ComputerResultStep) {
+                ii--;
+                // don't profile the computer steps
+                continue;
+            }
 
             // Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
             if (step instanceof ProfileSideEffectStep) {
@@ -61,7 +68,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
 
             // Create and inject ProfileStep
             ProfileStep profileStep = new ProfileStep(traversal);
-            traversal.addStep((ii * 2) + 1, profileStep);
+            traversal.addStep(ii + 1, profileStep);
         }
     }
 


[03/12] incubator-tinkerpop git commit: Add play test for computer profile

Posted by ok...@apache.org.
Add play test for computer profile


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

Branch: refs/heads/master
Commit: 800cf0a46cf3d991c28aeb174f9692c0d6fa3f71
Parents: 3f25710
Author: rjbriody <bo...@datastax.com>
Authored: Thu Mar 17 17:52:31 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Thu Mar 17 17:52:31 2016 -0400

----------------------------------------------------------------------
 .../structure/TinkerGraphPlayTest.java          | 29 ++++++--------------
 1 file changed, 9 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/800cf0a4/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 b655513..97aef31 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
@@ -19,16 +19,13 @@
 package org.apache.tinkerpop.gremlin.tinkergraph.structure;
 
 import org.apache.tinkerpop.gremlin.process.computer.bulkloading.BulkLoaderVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;
 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;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.structure.Column;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.T;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -45,23 +42,7 @@ import java.util.Arrays;
 import java.util.List;
 import java.util.function.Supplier;
 
-import static org.apache.tinkerpop.gremlin.process.traversal.P.gt;
-import static org.apache.tinkerpop.gremlin.process.traversal.P.without;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
-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.__.has;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.in;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.select;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.union;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.valueMap;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.values;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
 
 /**
  * @author Stephen Mallette (http://stephen.genoprime.com)
@@ -70,6 +51,14 @@ public class TinkerGraphPlayTest {
     private static final Logger logger = LoggerFactory.getLogger(TinkerGraphPlayTest.class);
 
     @Test
+    public void testBob() {
+        GraphTraversalSource g = TinkerFactory.createModern().traversal().withComputer();
+        final GraphTraversal<Vertex, Long> traversal = g.V().hasLabel("person").bothE().count().profile("m");
+        traversal.iterate();
+        System.out.println(traversal.asAdmin().getSideEffects().get("m").toString());
+    }
+
+    @Test
     @Ignore
     public void testPlay8() throws Exception {
         Graph graph = TinkerFactory.createModern();