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/03 18:03:24 UTC

[01/12] incubator-tinkerpop git commit: TINKERPOP-958 split .profile() into ProfileSideEffectStep and ProfileStep (which is a MapStep).

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1192 08780c4b8 -> ff7f7d2b7


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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
new file mode 100644
index 0000000..1733c46
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
@@ -0,0 +1,348 @@
+/*
+ * 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.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.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.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+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;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@RunWith(GremlinProcessRunner.class)
+public abstract class ProfileTest extends AbstractGremlinProcessTest {
+    private static final String METRICS_KEY = "metrics_key";
+
+    public abstract Traversal<Vertex, TraversalMetrics> get_g_V_out_out_profile();
+
+    public abstract Traversal<Vertex, TraversalMetrics> get_g_V_repeatXbothX_timesX3X_profile();
+
+    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_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_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() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
+        printTraversalForm(traversal);
+
+        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.", ProfileSideEffectStep.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)
+    public void g_V_out_out_profile_modern() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
+        printTraversalForm(traversal);
+
+        final TraversalMetrics traversalMetrics = traversal.next();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(2);
+        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+    }
+
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_out_out_profile_grateful() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
+        printTraversalForm(traversal);
+
+        final TraversalMetrics traversalMetrics = traversal.next();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        metrics = traversalMetrics.getMetrics(2);
+        assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        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();
+        printTraversalForm(traversal);
+
+        TraversalMetrics traversalMetrics = traversal.next();
+
+        assertEquals("There should be 8 steps in this traversal (counting injected profile steps).", 8, traversal.asAdmin().getSteps().size());
+
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        // Grab the second (sideEffect{sleep}) step and check the times.
+        Metrics metrics = traversalMetrics.getMetrics(1);
+        // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation.
+        assertTrue("Duration should be at least the length of the sleep (59ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) >= 59);
+
+        // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
+        metrics = traversalMetrics.getMetrics(2);
+        assertTrue("Duration should be at least the length of the sleep (29ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) >= 29);
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        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();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        // Test the nested global metrics of the repeat step
+        final Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
+        assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        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];
+        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);
+
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+    @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();
+        printTraversalForm(traversal);
+
+        final TraversalMetrics traversalMetrics = traversal.next();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        if (traversal.asAdmin().getStrategies().toList().stream().anyMatch(s -> s instanceof RangeByIsCountStrategy)) {
+            assertEquals("Metrics 1 should have 4 nested metrics.", 4, metrics.getNested().size());
+        } else {
+            assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
+        }
+    }
+
+    /**
+     * ProfileStrategy callback test. Goal: ensure that a step that implements Profileable gets a callback to setMetrics
+     */
+
+    // Setup a "mock" step to test the strategy
+    static public class MockStep extends FlatMapStep<Vertex, Vertex> implements Profiling {
+        public static boolean callbackCalled = false;
+
+        public MockStep(final Traversal.Admin traversal) {
+            super(traversal);
+        }
+
+        @Override
+        protected Iterator<Vertex> flatMap(final Traverser.Admin<Vertex> traverser) {
+            List<Vertex> l = new ArrayList<>();
+            l.add(traverser.get());
+            return l.iterator();
+        }
+
+        @Override
+        public void setMetrics(final MutableMetrics parentMetrics) {
+            if (parentMetrics != null) {
+                callbackCalled = true;
+                parentMetrics.setCount("bogusCount", 100);
+            }
+        }
+    }
+
+    @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());
+        t.asAdmin().addStep(3, mockStep);
+        TraversalMetrics traversalMetrics = t.next();
+        assertTrue(mockStep.callbackCalled);
+
+        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
+            assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
+        }
+    }
+
+    @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();
+        printTraversalForm(traversal);
+        traversal.iterate();
+    }
+
+    /**
+     * Traversals
+     */
+    public static class Traversals extends ProfileTest {
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_out_out_profile() {
+            return g.V().out().out().profile();
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_repeatXbothX_timesX3X_profile() {
+            return g.V().repeat(both()).times(3).profile();
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
+            return g.V().sideEffect(v -> {
+                try {
+                    Thread.sleep(10);
+                } catch (final InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }).sideEffect(v -> {
+                try {
+                    Thread.sleep(5);
+                } catch (final InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }).profile();
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_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();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java
new file mode 100644
index 0000000..1e61828
--- /dev/null
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java
@@ -0,0 +1,360 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.LoadGraphWith;
+import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
+import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
+import org.apache.tinkerpop.gremlin.process.traversal.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;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+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;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+@RunWith(GremlinProcessRunner.class)
+public abstract class ProfileSideEffectTest extends AbstractGremlinProcessTest {
+    private static final String METRICS_KEY = "metrics_key";
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
+
+    /**
+     * 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() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        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.", ProfileSideEffectStep.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)
+    public void g_V_out_out_profile_modern() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(2);
+        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+    }
+
+
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_out_out_profile_grateful() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        metrics = traversalMetrics.getMetrics(2);
+        assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
+        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());
+
+        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        // Grab the second (sideEffect{sleep}) step and check the times.
+        Metrics metrics = traversalMetrics.getMetrics(1);
+        // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation.
+        assertTrue("Duration should be at least the length of the sleep (59ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) >= 59);
+
+        // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
+        metrics = traversalMetrics.getMetrics(2);
+        assertTrue("Duration should be at least the length of the sleep (29ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
+                metrics.getDuration(TimeUnit.MILLISECONDS) >= 29);
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void g_V_repeat_both_modern_profile() {
+        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).get();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
+        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
+
+        // Test the nested global metrics of the repeat step
+        final Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
+        assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+        assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        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];
+        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);
+
+
+        double totalPercentDuration = 0;
+        for (Metrics m : traversalMetrics.getMetrics()) {
+            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
+        }
+        assertEquals(100, totalPercentDuration, 0.000001);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+        final Traversal<Vertex, String> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        traversalMetrics.toString(); // ensure no exceptions are thrown
+
+        assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
+
+        Metrics metrics = traversalMetrics.getMetrics(0);
+        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        metrics = traversalMetrics.getMetrics(1);
+        assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+        assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
+
+        if (traversal.asAdmin().getStrategies().toList().stream().anyMatch(s -> s instanceof RangeByIsCountStrategy)) {
+            assertEquals("Metrics 1 should have 4 nested metrics.", 4, metrics.getNested().size());
+        } else {
+            assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
+        }
+    }
+
+    /**
+     * ProfileStrategy callback test. Goal: ensure that a step that implements Profileable gets a callback to setMetrics
+     */
+
+    // Setup a "mock" step to test the strategy
+    static public class MockStep extends FlatMapStep<Vertex, Vertex> implements Profiling {
+        public static boolean callbackCalled = false;
+
+        public MockStep(final Traversal.Admin traversal) {
+            super(traversal);
+        }
+
+        @Override
+        protected Iterator<Vertex> flatMap(final Traverser.Admin<Vertex> traverser) {
+            List<Vertex> l = new ArrayList<>();
+            l.add(traverser.get());
+            return l.iterator();
+        }
+
+        @Override
+        public void setMetrics(final MutableMetrics parentMetrics) {
+            if (parentMetrics != null) {
+                callbackCalled = true;
+                parentMetrics.setCount("bogusCount", 100);
+            }
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+    public void testProfileStrategyCallback() {
+        final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetrics_keyX();
+        MockStep mockStep = new MockStep(t.asAdmin());
+        t.asAdmin().addStep(3, mockStep);
+        t.iterate();
+        assertTrue(mockStep.callbackCalled);
+
+        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
+            final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+            assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
+        printTraversalForm(traversal);
+        traversal.iterate();
+    }
+
+    /**
+     * Traversals
+     */
+    public static class Traversals extends ProfileSideEffectTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
+            return g.V().out().out().profile(METRICS_KEY);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX() {
+            return g.V().repeat(both()).times(3).profile(METRICS_KEY);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
+            return g.V().sideEffect(v -> {
+                try {
+                    Thread.sleep(10);
+                } catch (final InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }).sideEffect(v -> {
+                try {
+                    Thread.sleep(5);
+                } catch (final InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }).profile(METRICS_KEY);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
+            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);
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
deleted file mode 100644
index 44bb7f6..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileTest.java
+++ /dev/null
@@ -1,358 +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.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.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;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-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;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-@RunWith(GremlinProcessRunner.class)
-public abstract class ProfileTest extends AbstractGremlinProcessTest {
-    public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profile();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profile();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
-
-    public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile();
-
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_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() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-        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());
-    }
-
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_out_out_profile_modern() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(2);
-        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-    }
-
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_out_out_profile_grateful() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        metrics = traversalMetrics.getMetrics(2);
-        assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
-
-        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        // Grab the second (sideEffect{sleep}) step and check the times.
-        Metrics metrics = traversalMetrics.getMetrics(1);
-        // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation.
-        assertTrue("Duration should be at least the length of the sleep (59ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) >= 59);
-
-        // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
-        metrics = traversalMetrics.getMetrics(2);
-        assertTrue("Duration should be at least the length of the sleep (29ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) >= 29);
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_repeat_both_modern_profile() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        // Test the nested global metrics of the repeat step
-        final Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
-        assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        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];
-        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);
-
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-        final Traversal<Vertex, String> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        if (traversal.asAdmin().getStrategies().toList().stream().anyMatch(s -> s instanceof RangeByIsCountStrategy)) {
-            assertEquals("Metrics 1 should have 4 nested metrics.", 4, metrics.getNested().size());
-        } else {
-            assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
-        }
-    }
-
-    /**
-     * ProfileStrategy callback test. Goal: ensure that a step that implements Profileable gets a callback to setMetrics
-     */
-
-    // Setup a "mock" step to test the strategy
-    static public class MockStep extends FlatMapStep<Vertex, Vertex> implements Profiling {
-        public static boolean callbackCalled = false;
-
-        public MockStep(final Traversal.Admin traversal) {
-            super(traversal);
-        }
-
-        @Override
-        protected Iterator<Vertex> flatMap(final Traverser.Admin<Vertex> traverser) {
-            List<Vertex> l = new ArrayList<>();
-            l.add(traverser.get());
-            return l.iterator();
-        }
-
-        @Override
-        public void setMetrics(final MutableMetrics parentMetrics) {
-            if (parentMetrics != null) {
-                callbackCalled = true;
-                parentMetrics.setCount("bogusCount", 100);
-            }
-        }
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void testProfileStrategyCallback() {
-        final Traversal<Vertex, Vertex> t = get_g_V_out_out_profile();
-        MockStep mockStep = new MockStep(t.asAdmin());
-        t.asAdmin().addStep(3, mockStep);
-        t.iterate();
-        assertTrue(mockStep.callbackCalled);
-
-        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
-            final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().<TraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-            assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
-        }
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
-        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile();
-        printTraversalForm(traversal);
-        traversal.iterate();
-    }
-
-    /**
-     * Traversals
-     */
-    public static class Traversals extends ProfileTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out_profile() {
-            return g.V().out().out().profile();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profile() {
-            return g.V().repeat(both()).times(3).profile();
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
-            return g.V().sideEffect(v -> {
-                try {
-                    Thread.sleep(10);
-                } catch (final InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }).sideEffect(v -> {
-                try {
-                    Thread.sleep(5);
-                } catch (final InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }).profile();
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-            return g.V().where(__.in("created").count().is(1l)).<String>values("name").profile();
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> 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();
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
index c7bf8b4..8079343 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/SerializationTest.java
@@ -211,7 +211,7 @@ public class SerializationTest {
             final GryoWriter gryoWriter = gryoIo.writer().create();
             final GryoReader gryoReader = gryoIo.reader().create();
 
-            final TraversalMetrics before = (TraversalMetrics) g.V().both().profile().cap(TraversalMetrics.METRICS_KEY).next();
+            final TraversalMetrics before = (TraversalMetrics) g.V().both().profile().next();
             final ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
             gryoWriter.writeObject(outputStream, before);
 
@@ -333,7 +333,7 @@ public class SerializationTest {
         @LoadGraphWith(LoadGraphWith.GraphData.MODERN)
         public void shouldSerializeTraversalMetrics() throws Exception {
             final ObjectMapper mapper = graph.io(GraphSONIo.build()).mapper().create().createMapper();
-            final TraversalMetrics tm = (TraversalMetrics) g.V().both().profile().cap(TraversalMetrics.METRICS_KEY).next();
+            final TraversalMetrics tm = (TraversalMetrics) g.V().both().profile().next();
             final String json = mapper.writeValueAsString(tm);
             final Map<String, Object> m = mapper.readValue(json, mapTypeReference);
 
@@ -341,7 +341,7 @@ public class SerializationTest {
             assertTrue(m.containsKey(GraphSONTokens.METRICS));
 
             final List<Map<String, Object>> metrics = (List<Map<String, Object>>) m.get(GraphSONTokens.METRICS);
-            assertEquals(3, metrics.size());
+            assertEquals(2, metrics.size());
 
             final Map<String, Object> metrics0 = metrics.get(0);
             assertTrue(metrics0.containsKey(GraphSONTokens.ID));

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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 66f909c..73106a0 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
@@ -148,11 +148,19 @@ import java.util.stream.Stream;
         method = "g_V_repeatXoutX_timesX5X_asXaX_outXwrittenByX_asXbX_selectXa_bX_count",
         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.ProfileTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest$Traversals",
         method = "g_V_out_out_profile_grateful",
         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.GroovyProfileTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectTest$Traversals",
+        method = "g_V_out_out_profile_grateful",
+        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",
+        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.GroovyProfileSideEffectTest$Traversals",
         method = "g_V_out_out_profile_grateful",
         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(


[05/12] incubator-tinkerpop git commit: Update traversal docs for Profile step changes.

Posted by ok...@apache.org.
Update traversal docs for Profile step changes.


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

Branch: refs/heads/TINKERPOP-1192
Commit: 86941ee5c6ff37f2bc4f88ea520a530e9372ba79
Parents: 7374ee4
Author: rjbriody <bo...@datastax.com>
Authored: Tue Mar 1 08:35:45 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Tue Mar 1 08:35:45 2016 -0500

----------------------------------------------------------------------
 docs/src/reference/the-traversal.asciidoc | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/86941ee5/docs/src/reference/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc
index 410018e..d5d151d 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -1346,7 +1346,7 @@ profile results, but durations are not exact. Thus, durations are best considere
 
 [gremlin-groovy,modern]
 ----
-g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile().cap(TraversalMetrics.METRICS_KEY)
+g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile()
 ----
 
 The `profile()`-step generates a `TraversalMetrics` sideEffect object that contains the following information:
@@ -1363,6 +1363,15 @@ into a single traverser. That new traverser has a `Traverser.bulk()` that is the
 bulks. On the other hand, the `Count` represents the sum of all `Traverser.bulk()` results and thus, expresses the
 number of "represented" (not enumerated) traversers. `Traversers` will always be less than or equal to `Count`.
 
+A side effect key can also be passed to the `profile()`-step for situations when it is important to iterate the normal
+results of the Traversal and retrieve the `TraversalMetrics` afterwards, as shown here:
+
+---
+t = g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile('metrics')
+t.iterate()
+metrics = t.asAdmin().getSideEffects().get('metrics')
+---
+
 For traversal compilation information, please see <<explain-step,`explain()`>>-step.
 
 [[range-step]]


[06/12] incubator-tinkerpop git commit: Update traversal docs for Profile step changes.

Posted by ok...@apache.org.
Update traversal docs for Profile step changes.


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

Branch: refs/heads/TINKERPOP-1192
Commit: 06cdff86c21a9d2c20f528d9c620604dde1b6a07
Parents: 86941ee
Author: rjbriody <bo...@datastax.com>
Authored: Tue Mar 1 08:39:34 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Tue Mar 1 08:39:34 2016 -0500

----------------------------------------------------------------------
 docs/src/reference/the-traversal.asciidoc | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/06cdff86/docs/src/reference/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc
index d5d151d..cd6b8af 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -1366,8 +1366,9 @@ number of "represented" (not enumerated) traversers. `Traversers` will always be
 A side effect key can also be passed to the `profile()`-step for situations when it is important to iterate the normal
 results of the Traversal and retrieve the `TraversalMetrics` afterwards, as shown here:
 
+[gremlin-groovy,modern]
 ---
-t = g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile('metrics')
+t = g.V().out('created').profile('metrics')
 t.iterate()
 metrics = t.asAdmin().getSideEffects().get('metrics')
 ---


[12/12] incubator-tinkerpop git commit: added @rjbriody ProfileStep updates.

Posted by ok...@apache.org.
added @rjbriody ProfileStep updates.


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

Branch: refs/heads/TINKERPOP-1192
Commit: ff7f7d2b74a42d7c9574a0ebbb8cc4a6897195f5
Parents: e4ea173
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Mar 3 10:03:09 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Mar 3 10:03:09 2016 -0700

----------------------------------------------------------------------
 .../step/sideEffect/ProfileSideEffectStep.java  | 132 +++++--------------
 .../ComputerVerificationStrategy.java           |   5 +-
 .../util/StandardTraversalMetrics.java          |   5 +
 .../StandardTraversalMetricsSupplier.java       |  45 +++++++
 4 files changed, 85 insertions(+), 102 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/ff7f7d2b/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 714e330..59778b7 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,16 +18,12 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 
-import org.apache.commons.configuration.Configuration;
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.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.MapReducer;
 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;
@@ -36,36 +32,34 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetri
 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.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.function.StandardTraversalMetricsSupplier;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
-import java.util.Iterator;
+import java.io.Serializable;
 import java.util.List;
 import java.util.NoSuchElementException;
+import java.util.function.BinaryOperator;
+import java.util.function.Supplier;
 
 /**
  * @author Bob Briody (http://bobbriody.com)
  */
-public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable, MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics>, GraphComputing {
+public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable<StandardTraversalMetrics, StandardTraversalMetrics>, GraphComputing {
 
     private String sideEffectKey;
     // Stored in the Traversal sideEffects but kept here as a reference for convenience.
-    private StandardTraversalMetrics traversalMetrics;
+    //private StandardTraversalMetrics traversalMetrics;
     private boolean onGraphComputer = false;
 
     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);
     }
 
     @Override
     protected void sideEffect(Traverser.Admin<S> traverser) {
-    }
 
-    @Override
-    public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
-        return new ProfileMapReduce(this);
     }
 
     @Override
@@ -78,19 +72,23 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
         return this.sideEffectKey;
     }
 
+    private StandardTraversalMetrics getMetrics() {
+        return this.getTraversal().getSideEffects().<StandardTraversalMetrics>get(this.sideEffectKey).get();
+    }
+
     @Override
     public Traverser<S> next() {
         Traverser<S> ret = null;
         initializeIfNeeded();
-        traversalMetrics.start(this.getId());
+        getMetrics().start(this.getId());
         try {
             ret = super.next();
             return ret;
         } finally {
             if (ret != null) {
-                traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
+                getMetrics().finish(this.getId(), ret.asAdmin().bulk());
             } else {
-                traversalMetrics.stop(this.getId());
+                getMetrics().stop(this.getId());
             }
         }
     }
@@ -98,9 +96,9 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
     @Override
     public boolean hasNext() {
         initializeIfNeeded();
-        traversalMetrics.start(this.getId());
+        this.getMetrics().start(this.getId());
         boolean ret = super.hasNext();
-        traversalMetrics.stop(this.getId());
+        this.getMetrics().stop(this.getId());
         return ret;
     }
 
@@ -110,39 +108,14 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
     }
 
     private void initializeIfNeeded() {
-        if (traversalMetrics != null) {
-            return;
-        }
-
-        createTraversalMetricsSideEffectIfNecessary();
-
-        // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
-        // sideEffects after serialization.
-        if (traversalMetrics == null) {
-            // look up the TraversalMetrics in the root traversal's sideEffects
-            Traversal t = this.getTraversal();
-            while (!(t.asAdmin().getParent() instanceof TraversalVertexProgramStep)) {
-                t = t.asAdmin().getParent().asStep().getTraversal();
-            }
-            traversalMetrics = t.asAdmin().getSideEffects().<StandardTraversalMetrics>get(this.sideEffectKey).get();
-        }
-    }
-
-    private void createTraversalMetricsSideEffectIfNecessary() {
-        if (this.getTraversal().getSideEffects().get(this.sideEffectKey).isPresent()) {
-            // Already initialized
-            return;
-        }
-
-        if (!(this.getTraversal().getParent() instanceof TraversalVertexProgramStep) && !(this.getTraversal().getParent() instanceof EmptyStep)) {
-            // Initialization is handled at the top-level of the traversal only.
+        // 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.)
-
-        traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(this.sideEffectKey, StandardTraversalMetrics::new);
         prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
     }
 
@@ -153,7 +126,7 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
         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);
+            Step nextStep = steps.get(ii + 1);
             // Do not inject profiling after ProfileStep
             if (!(nextStep instanceof ProfileSideEffectStep)) {
                 break;
@@ -185,10 +158,10 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
             }
 
             // The TraversalMetrics sideEffect is shared across all the steps.
-            profileSideEffectStep.traversalMetrics = this.traversalMetrics;
+            //profileSideEffectStep.traversalMetrics = this.traversalMetrics;
 
             // Add root metrics to traversalMetrics
-            this.traversalMetrics.addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileSideEffectStep.getId());
+            this.getMetrics().addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileSideEffectStep.getId());
 
             // Handle nested traversal
             if (step instanceof TraversalParent) {
@@ -202,60 +175,19 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
         }
     }
 
-    //////////////////
+    ///////////////////////////
 
-    public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
+    /*public static final class ProfileBiOperator implements BinaryOperator<StandardTraversalMetrics>, Serializable {
 
-        public static final String PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.profileSideEffectStep.sideEffectKey";
-
-        private String sideEffectKey;
-
-        private ProfileMapReduce() {
-        }
-
-        private ProfileMapReduce(final ProfileSideEffectStep step) {
-            this.sideEffectKey = step.getSideEffectKey();
-        }
+        private static final ProfileBiOperator INSTANCE = new ProfileBiOperator();
 
         @Override
-        public void storeState(final Configuration configuration) {
-            super.storeState(configuration);
-            configuration.setProperty(PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+        public StandardTraversalMetrics apply(final StandardTraversalMetrics mutatingSeed, final StandardTraversalMetrics map) {
+            return StandardTraversalMetrics.merge(IteratorUtils.of(mutatingSeed, map));
         }
 
-        @Override
-        public void loadState(final Graph graph, final Configuration configuration) {
-            this.sideEffectKey = configuration.getString(PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return true;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return this.sideEffectKey;
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
-
+        public static final ProfileBiOperator instance() {
+            return INSTANCE;
         }
-
-        @Override
-        public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            reduce(key, values, emitter);
-        }
-
-        @Override
-        public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            emitter.emit(StandardTraversalMetrics.merge(values));
-        }
-
-        @Override
-        public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
-            return StandardTraversalMetrics.merge(IteratorUtils.map(keyValues, KeyValue::getValue));
-        }
-    }
+    }*/
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/ff7f7d2b/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 9cde2de..27ad118 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
@@ -29,10 +29,11 @@ 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.WherePredicateStep;
 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;
@@ -53,7 +54,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, ProfileMarkerStep.class, ProfileSideEffectStep.class, ComputerResultStep.class
     ));
 
     private ComputerVerificationStrategy() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/ff7f7d2b/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
index 6aabea4..93d6ec7 100644
--- 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
@@ -19,6 +19,7 @@
 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.*;
@@ -55,6 +56,10 @@ public final class StandardTraversalMetrics implements TraversalMetrics, Seriali
         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);

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/ff7f7d2b/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
new file mode 100644
index 0000000..63c94fa
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/StandardTraversalMetricsSupplier.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.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;
+    }
+}


[11/12] incubator-tinkerpop git commit: Merge branch 'TINKERPOP-958' of https://github.com/rjbriody/incubator-tinkerpop into TINKERPOP-1192

Posted by ok...@apache.org.
Merge branch 'TINKERPOP-958' of https://github.com/rjbriody/incubator-tinkerpop into TINKERPOP-1192

Conflicts:
	gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
	gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
	gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
	gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java


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

Branch: refs/heads/TINKERPOP-1192
Commit: e4ea17395478132e7f78bd53a9921ef803ab6a96
Parents: 08780c4 7013a97
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Mar 3 07:28:44 2016 -0700
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Mar 3 07:28:44 2016 -0700

----------------------------------------------------------------------
 docs/src/reference/the-traversal.asciidoc       |  14 +-
 .../gremlin/process/traversal/Traversal.java    |  12 +-
 .../traversal/dsl/graph/GraphTraversal.java     |   6 +-
 .../step/filter/WhereTraversalStep.java         |   4 +-
 .../process/traversal/step/map/MatchStep.java   |   4 +-
 .../traversal/step/map/ProfileMarkerStep.java   |  42 ++
 .../step/sideEffect/ProfileSideEffectStep.java  | 261 ++++++++++
 .../traversal/step/sideEffect/ProfileStep.java  | 232 ---------
 .../strategy/decoration/ConnectiveStrategy.java |   4 +-
 .../strategy/finalization/ProfileStrategy.java  |  33 +-
 .../StandardVerificationStrategy.java           |   9 +
 .../traversal/util/ImmutableMetrics.java        |   1 +
 .../traversal/util/TraversalMetrics.java        |   6 -
 .../gremlin/structure/io/gryo/GryoMapper.java   |   5 +-
 .../sideEffect/ProfileSideEffectStepTest.java   |  37 ++
 .../step/sideEffect/ProfileStepTest.java        |  37 --
 .../traversal/step/map/GroovyProfileTest.groovy |  84 +++
 .../step/sideEffect/GroovyProfileTest.groovy    |  58 ---
 .../process/GroovyProcessComputerSuite.java     |   5 +-
 .../process/GroovyProcessStandardSuite.java     |   4 +-
 .../gremlin/process/ProcessComputerSuite.java   |   7 +-
 .../gremlin/process/ProcessStandardSuite.java   |   5 +-
 .../process/traversal/step/map/ProfileTest.java | 515 +++++++++++++++++++
 .../traversal/step/sideEffect/ProfileTest.java  | 358 -------------
 .../gremlin/structure/SerializationTest.java    |   6 +-
 .../gremlin/hadoop/structure/HadoopGraph.java   |  12 +-
 26 files changed, 1024 insertions(+), 737 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
----------------------------------------------------------------------
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
index 0000000,14d08a0..714e330
mode 000000,100644..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
@@@ -1,0 -1,262 +1,261 @@@
+ /*
+  * 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.sideEffect;
+ 
+ import org.apache.commons.configuration.Configuration;
+ import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+ import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 -import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+ import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+ import org.apache.tinkerpop.gremlin.process.traversal.Step;
+ import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+ 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.MapReducer;
+ 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.structure.Graph;
+ import org.apache.tinkerpop.gremlin.structure.Vertex;
+ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+ 
+ import java.util.Iterator;
+ import java.util.List;
+ import java.util.NoSuchElementException;
+ 
+ /**
+  * @author Bob Briody (http://bobbriody.com)
+  */
+ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable, MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics>, GraphComputing {
+ 
+     private String sideEffectKey;
+     // Stored in the Traversal sideEffects but kept here as a reference for convenience.
+     private StandardTraversalMetrics traversalMetrics;
+     private boolean onGraphComputer = false;
+ 
+     public ProfileSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
+         super(traversal);
+         this.sideEffectKey = sideEffectKey;
+     }
+ 
+     @Override
+     protected void sideEffect(Traverser.Admin<S> traverser) {
+     }
+ 
+     @Override
+     public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
+         return new ProfileMapReduce(this);
+     }
+ 
+     @Override
+     public void onGraphComputer() {
+         this.onGraphComputer = true;
+     }
+ 
+     @Override
+     public String getSideEffectKey() {
+         return this.sideEffectKey;
+     }
+ 
+     @Override
+     public Traverser<S> next() {
+         Traverser<S> ret = null;
+         initializeIfNeeded();
+         traversalMetrics.start(this.getId());
+         try {
+             ret = super.next();
+             return ret;
+         } finally {
+             if (ret != null) {
+                 traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
+             } else {
+                 traversalMetrics.stop(this.getId());
+             }
+         }
+     }
+ 
+     @Override
+     public boolean hasNext() {
+         initializeIfNeeded();
+         traversalMetrics.start(this.getId());
+         boolean ret = super.hasNext();
+         traversalMetrics.stop(this.getId());
+         return ret;
+     }
+ 
+     @Override
+     protected Traverser<S> processNextStart() throws NoSuchElementException {
+         return this.starts.next();
+     }
+ 
+     private void initializeIfNeeded() {
+         if (traversalMetrics != null) {
+             return;
+         }
+ 
+         createTraversalMetricsSideEffectIfNecessary();
+ 
+         // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
+         // sideEffects after serialization.
+         if (traversalMetrics == null) {
+             // look up the TraversalMetrics in the root traversal's sideEffects
+             Traversal t = this.getTraversal();
+             while (!(t.asAdmin().getParent() instanceof TraversalVertexProgramStep)) {
+                 t = t.asAdmin().getParent().asStep().getTraversal();
+             }
+             traversalMetrics = t.asAdmin().getSideEffects().<StandardTraversalMetrics>get(this.sideEffectKey).get();
+         }
+     }
+ 
+     private void createTraversalMetricsSideEffectIfNecessary() {
+         if (this.getTraversal().getSideEffects().get(this.sideEffectKey).isPresent()) {
+             // Already initialized
+             return;
+         }
+ 
+         if (!(this.getTraversal().getParent() instanceof TraversalVertexProgramStep) && !(this.getTraversal().getParent() instanceof EmptyStep)) {
+             // Initialization is handled at the top-level of the traversal only.
+             return;
+         }
+ 
+         // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
+         // once per thread if using Computer.)
+ 
+         traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(this.sideEffectKey, StandardTraversalMetrics::new);
+         prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
+     }
+ 
+     // 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.traversalMetrics.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);
+                 }
+             }
+         }
+     }
+ 
+     //////////////////
+ 
+     public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
+ 
+         public static final String PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.profileSideEffectStep.sideEffectKey";
+ 
+         private String sideEffectKey;
+ 
+         private ProfileMapReduce() {
+         }
+ 
+         private ProfileMapReduce(final ProfileSideEffectStep step) {
+             this.sideEffectKey = step.getSideEffectKey();
+         }
+ 
+         @Override
+         public void storeState(final Configuration configuration) {
+             super.storeState(configuration);
+             configuration.setProperty(PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+         }
+ 
+         @Override
+         public void loadState(final Graph graph, final Configuration configuration) {
+             this.sideEffectKey = configuration.getString(PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+         }
+ 
+         @Override
+         public boolean doStage(final Stage stage) {
+             return true;
+         }
+ 
+         @Override
+         public String getMemoryKey() {
+             return this.sideEffectKey;
+         }
+ 
+         @Override
+         public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
 -            VertexTraversalSideEffects.of(vertex).<StandardTraversalMetrics>get(this.sideEffectKey).ifPresent(emitter::emit);
++
+         }
+ 
+         @Override
+         public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+             reduce(key, values, emitter);
+         }
+ 
+         @Override
+         public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+             emitter.emit(StandardTraversalMetrics.merge(values));
+         }
+ 
+         @Override
+         public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
+             return StandardTraversalMetrics.merge(IteratorUtils.map(keyValues, KeyValue::getValue));
+         }
+     }
+ }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
----------------------------------------------------------------------
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
index cceecf2,1889fe5..385c9be
--- 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
@@@ -21,8 -21,8 +21,9 @@@ package org.apache.tinkerpop.gremlin.pr
  import org.apache.tinkerpop.gremlin.process.computer.traversal.step.VertexComputing;
  import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
  import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 +import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier;
  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.util.ReducingBarrierStep;
  import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
  import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@@ -46,8 -46,16 +47,16 @@@ public final class StandardVerification
  
          traversal.getSteps().forEach(step -> {
              if (step instanceof ReducingBarrierStep && step.getTraversal().getParent() instanceof RepeatStep && step.getTraversal().getParent().getGlobalChildren().get(0).getSteps().contains(step))
 -                throw new VerificationException("The direct parent of a ReducingBarrierStep can not be a RepeatStep: " + step, traversal);
 +                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);
+         }
+ 
+         if (TraversalHelper.getStepsOfClass(ProfileMarkerStep.class, traversal).size() > 1) {
+             throw new VerificationException("The .profile()-Step cannot be specified multiple times.", traversal);
+         }
      }
  
      public static StandardVerificationStrategy instance() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index 50335b7,8b89446..acd66cf
--- 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
@@@ -299,6 -292,6 +300,7 @@@ public final class GryoMapper implement
              add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(HashSet.class, null, 62));
              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)); // ***LAST ID***
              add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(StandardTraversalMetrics.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));
@@@ -320,17 -313,7 +322,16 @@@
              add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(YearMonth.class, kryo -> new JavaTimeSerializers.YearMonthSerializer(), 103));
              add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ZonedDateTime.class, kryo -> new JavaTimeSerializers.ZonedDateTimeSerializer(), 104));
              add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ZoneOffset.class, kryo -> new JavaTimeSerializers.ZoneOffsetSerializer(), 105));
 -            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ImmutableMetrics.class, null, 107)); // ***LAST ID***
 +
 +            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, null, 116));
 +            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)); // ***LAST ID**
- 
++            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(RangeGlobalStep.RangeBiOperator.class, null, 114));
          }};
  
          private final List<IoRegistry> registries = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
----------------------------------------------------------------------
diff --cc gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
index f9186f6,25e6c8a..496083f
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
@@@ -160,7 -161,6 +161,7 @@@ public class GroovyProcessComputerSuit
              GroovyGroupTestV3d0.Traversals.class,
              GroovyGroupCountTest.Traversals.class,
              GroovyInjectTest.Traversals.class,
-             // GroovyProfileTest.Traversals.class,
++            GroovyProfileTest.Traversals.class,
              GroovySackTest.Traversals.class,
              GroovySideEffectCapTest.Traversals.class,
              GroovySideEffectTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
----------------------------------------------------------------------
diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
index c45f12a,2be30bd..82436c2
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
@@@ -167,7 -169,6 +168,7 @@@ public class ProcessComputerSuite exten
              GroupTestV3d0.Traversals.class,
              GroupCountTest.Traversals.class,
              InjectTest.Traversals.class,
-             //ProfileTest.Traversals.class,
++            ProfileTest.Traversals.class,
              SackTest.Traversals.class,
              SideEffectCapTest.Traversals.class,
              SideEffectTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e4ea1739/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------


[09/12] incubator-tinkerpop git commit: Update traversal docs for Profile step changes.

Posted by ok...@apache.org.
Update traversal docs for Profile step changes.


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

Branch: refs/heads/TINKERPOP-1192
Commit: 50c56563157337e71f74a940b9f6c17718860dd3
Parents: ebb6143
Author: rjbriody <bo...@datastax.com>
Authored: Tue Mar 1 08:49:22 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Tue Mar 1 08:49:22 2016 -0500

----------------------------------------------------------------------
 docs/src/reference/the-traversal.asciidoc | 14 ++++++++++++--
 1 file changed, 12 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/50c56563/docs/src/reference/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc
index 410018e..f9cbcf7 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -1334,7 +1334,7 @@ g.V().hasLabel('person').
   group().by('cluster').by('name')
 ----
 
-[[profile-step]]
+[profile-step]]
 Profile Step
 ~~~~~~~~~~~~
 
@@ -1346,7 +1346,7 @@ profile results, but durations are not exact. Thus, durations are best considere
 
 [gremlin-groovy,modern]
 ----
-g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile().cap(TraversalMetrics.METRICS_KEY)
+g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile()
 ----
 
 The `profile()`-step generates a `TraversalMetrics` sideEffect object that contains the following information:
@@ -1363,6 +1363,16 @@ into a single traverser. That new traverser has a `Traverser.bulk()` that is the
 bulks. On the other hand, the `Count` represents the sum of all `Traverser.bulk()` results and thus, expresses the
 number of "represented" (not enumerated) traversers. `Traversers` will always be less than or equal to `Count`.
 
+A side effect key can also be passed to the `profile()`-step for situations when it is important to iterate the normal
+results of the Traversal and retrieve the `TraversalMetrics` afterwards, as shown here:
+
+[gremlin-groovy,modern]
+---
+t = g.V().out('created').profile('metrics')
+t.iterate()
+metrics = t.asAdmin().getSideEffects().get('metrics')
+---
+
 For traversal compilation information, please see <<explain-step,`explain()`>>-step.
 
 [[range-step]]


[07/12] incubator-tinkerpop git commit: Revert "Update traversal docs for Profile step changes."

Posted by ok...@apache.org.
Revert "Update traversal docs for Profile step changes."

This reverts commit 06cdff86c21a9d2c20f528d9c620604dde1b6a07.


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

Branch: refs/heads/TINKERPOP-1192
Commit: 6f6c9a5698373291c51e9b12af86a5dc3e09ff0e
Parents: 06cdff8
Author: rjbriody <bo...@datastax.com>
Authored: Tue Mar 1 08:45:38 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Tue Mar 1 08:45:38 2016 -0500

----------------------------------------------------------------------
 docs/src/reference/the-traversal.asciidoc | 3 +--
 1 file changed, 1 insertion(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/6f6c9a56/docs/src/reference/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc
index cd6b8af..d5d151d 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -1366,9 +1366,8 @@ number of "represented" (not enumerated) traversers. `Traversers` will always be
 A side effect key can also be passed to the `profile()`-step for situations when it is important to iterate the normal
 results of the Traversal and retrieve the `TraversalMetrics` afterwards, as shown here:
 
-[gremlin-groovy,modern]
 ---
-t = g.V().out('created').profile('metrics')
+t = g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile('metrics')
 t.iterate()
 metrics = t.asAdmin().getSideEffects().get('metrics')
 ---


[04/12] incubator-tinkerpop git commit: Fix computer issues for profile step.

Posted by ok...@apache.org.
Fix computer issues for profile step.


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

Branch: refs/heads/TINKERPOP-1192
Commit: 7374ee45cd918f0770df3966476e98fac10794ae
Parents: 856bb56
Author: rjbriody <bo...@datastax.com>
Authored: Fri Feb 26 09:52:20 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Fri Feb 26 09:52:20 2016 -0500

----------------------------------------------------------------------
 .../step/sideEffect/ProfileSideEffectStep.java       | 15 +++++++++++++++
 .../process/traversal/util/ImmutableMetrics.java     |  1 +
 .../gremlin/structure/io/gryo/GryoMapper.java        |  4 +++-
 3 files changed, 19 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7374ee45/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 cb3e7f8..14d08a0 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,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 
+import org.apache.commons.configuration.Configuration;
 import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
 import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
@@ -36,6 +37,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetri
 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.structure.Graph;
 import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 
@@ -205,6 +207,8 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
 
     public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
 
+        public static final String PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY = "gremlin.profileSideEffectStep.sideEffectKey";
+
         private String sideEffectKey;
 
         private ProfileMapReduce() {
@@ -215,6 +219,17 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
         }
 
         @Override
+        public void storeState(final Configuration configuration) {
+            super.storeState(configuration);
+            configuration.setProperty(PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY, this.sideEffectKey);
+        }
+
+        @Override
+        public void loadState(final Graph graph, final Configuration configuration) {
+            this.sideEffectKey = configuration.getString(PROFILE_SIDE_EFFECT_STEP_SIDE_EFFECT_KEY);
+        }
+
+        @Override
         public boolean doStage(final Stage stage) {
             return true;
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7374ee45/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
index 8fae2b0..b02c26d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ImmutableMetrics.java
@@ -41,6 +41,7 @@ public class ImmutableMetrics implements Metrics, Serializable {
     protected final Map<String, ImmutableMetrics> nested = new LinkedHashMap<>();
 
     protected ImmutableMetrics() {
+        // necessary for gryo serialization
     }
 
     @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7374ee45/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 9a6f636..a722497 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
@@ -34,6 +34,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Tra
 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.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.TraversalExplanation;
@@ -296,7 +297,7 @@ public final class GryoMapper implements Mapper<Kryo> {
             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, null, 106)); // ***LAST ID**
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TraversalExplanation.class, null, 106));
 
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Duration.class, kryo -> new JavaTimeSerializers.DurationSerializer(), 93));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Instant.class, kryo -> new JavaTimeSerializers.InstantSerializer(), 94));
@@ -311,6 +312,7 @@ public final class GryoMapper implements Mapper<Kryo> {
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(YearMonth.class, kryo -> new JavaTimeSerializers.YearMonthSerializer(), 103));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ZonedDateTime.class, kryo -> new JavaTimeSerializers.ZonedDateTimeSerializer(), 104));
             add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ZoneOffset.class, kryo -> new JavaTimeSerializers.ZoneOffsetSerializer(), 105));
+            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ImmutableMetrics.class, null, 107)); // ***LAST ID***
         }};
 
         private final List<IoRegistry> registries = new ArrayList<>();


[10/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/7013a974
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/7013a974
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/7013a974

Branch: refs/heads/TINKERPOP-1192
Commit: 7013a9746cc04da32bb63fe0e6932a468c47ff0d
Parents: 50c5656 d23c960
Author: rjbriody <bo...@datastax.com>
Authored: Tue Mar 1 08:50:37 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Tue Mar 1 08:50:37 2016 -0500

----------------------------------------------------------------------
 CHANGELOG.asciidoc                              |  11 +-
 appveyor.yml                                    |   2 +-
 docs/src/dev/developer/contributing.asciidoc    |  22 +-
 docs/src/dev/provider/index.asciidoc            | 911 +++++++++++++++++++
 .../src/reference/gremlin-applications.asciidoc | 369 +-------
 .../reference/implementations-intro.asciidoc    | 528 +----------
 .../tutorials/getting-started/index.asciidoc    |   2 +-
 .../the-gremlin-console/index.asciidoc          |   2 +-
 .../upgrade/release-3.1.x-incubating.asciidoc   |  27 +-
 .../gremlin-archetype-server/pom.xml            |  59 ++
 .../META-INF/maven/archetype-metadata.xml       |  47 +
 .../archetype-resources/README.asciidoc         |  71 ++
 .../conf/log4j-test.properties                  |  21 +
 .../archetype-resources/conf/log4j.properties   |  21 +
 .../conf/tinkergraph-empty.properties           |  18 +
 .../main/resources/archetype-resources/pom.xml  |  79 ++
 .../scripts/generate-modern.groovy              |  33 +
 .../archetype-resources/src/main/java/App.java  |  42 +
 .../src/main/java/Service.java                  |  70 ++
 .../src/test/java/ServiceTest.java              |  84 ++
 .../src/test/resources/gremlin-server.yaml      |  45 +
 .../projects/standard/archetype.properties      |  21 +
 .../test/resources/projects/standard/goal.txt   |   1 +
 .../gremlin-archetype-tinkergraph/pom.xml       |  59 ++
 .../META-INF/maven/archetype-metadata.xml       |  38 +
 .../archetype-resources/README.asciidoc         |  35 +
 .../main/resources/archetype-resources/pom.xml  |  58 ++
 .../archetype-resources/src/main/java/App.java  |  78 ++
 .../src/test/java/AppTest.java                  |  40 +
 .../projects/standard/archetype.properties      |  21 +
 .../test/resources/projects/standard/goal.txt   |   1 +
 gremlin-archetype/pom.xml                       |  70 ++
 gremlin-console/src/main/static/NOTICE          |   3 -
 .../traversal/util/TraversalExplanation.java    |  12 +-
 .../structure/io/graphson/GraphSONModule.java   |   2 +
 .../io/graphson/GraphSONSerializers.java        |  52 ++
 .../structure/io/graphson/GraphSONTokens.java   |   9 +
 .../gremlin/structure/io/gryo/GryoMapper.java   |   3 +-
 .../structure/io/gryo/GryoSerializers.java      |   1 -
 .../util/TraversalExplanationTest.java          |  38 +
 .../io/graphson/GraphSONMapperTest.java         |   9 +
 .../structure/io/gryo/GryoMapperTest.java       |   8 +
 gremlin-driver/pom.xml                          |   2 +-
 .../gremlin/driver/ConnectionPool.java          |   7 +-
 .../gremlin/driver/LoadBalancingStrategy.java   |  10 +-
 .../groovy/jsr223/ast/InterpreterMode.groovy    |  30 +
 .../ast/InterpreterModeASTTransformation.groovy | 115 +++
 .../gremlin/groovy/engine/ScriptEngines.java    |   2 +-
 .../jsr223/GremlinGroovyScriptEngine.java       |  41 +-
 .../InterpreterModeCustomizerProvider.java      |  37 +
 .../groovy/engine/GremlinExecutorTest.java      |  10 +-
 .../jsr223/GremlinGroovyScriptEngineTest.java   |  52 ++
 .../handler/HttpGremlinEndpointHandler.java     |   2 +-
 gremlin-server/src/main/static/NOTICE           |   3 -
 .../server/GremlinDriverIntegrateTest.java      | 114 ++-
 .../server/GremlinResultSetIntegrateTest.java   |  13 +-
 .../server/GremlinServerIntegrateTest.java      |  57 ++
 .../util/detached/DetachedVertexTest.java       |  24 +-
 pom.xml                                         |  32 +-
 spark-gremlin/pom.xml                           |  30 +-
 60 files changed, 2649 insertions(+), 955 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/7013a974/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index a722497,c20655e..8b89446
--- 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
@@@ -297,7 -297,7 +298,7 @@@ public final class GryoMapper implement
              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, null, 106));
 -            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TraversalExplanation.class, kryo -> new JavaSerializer(), 106)); // ***LAST ID**
++            add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TraversalExplanation.class, kryo -> new JavaSerializer(), 106));
  
              add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Duration.class, kryo -> new JavaTimeSerializers.DurationSerializer(), 93));
              add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Instant.class, kryo -> new JavaTimeSerializers.InstantSerializer(), 94));


[03/12] incubator-tinkerpop git commit: Condense ProfileSideEffectTest into ProfileTest.

Posted by ok...@apache.org.
Condense ProfileSideEffectTest into ProfileTest.


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

Branch: refs/heads/TINKERPOP-1192
Commit: 856bb564baad3a28754aa37a77803ab3d2f9b8a5
Parents: 8e807ee
Author: rjbriody <bo...@datastax.com>
Authored: Thu Feb 25 11:07:17 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Thu Feb 25 11:07:17 2016 -0500

----------------------------------------------------------------------
 .../traversal/step/map/GroovyProfileTest.groovy |  25 ++
 .../GroovyProfileSideEffectTest.groovy          |  58 ---
 .../process/GroovyProcessComputerSuite.java     |   2 -
 .../process/GroovyProcessStandardSuite.java     |   2 -
 .../gremlin/process/ProcessComputerSuite.java   |   3 -
 .../gremlin/process/ProcessStandardSuite.java   |   3 -
 .../process/traversal/step/map/ProfileTest.java | 205 ++++++++++-
 .../step/sideEffect/ProfileSideEffectTest.java  | 360 -------------------
 .../gremlin/hadoop/structure/HadoopGraph.java   |   8 +-
 9 files changed, 215 insertions(+), 451 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/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 9701421..7a3c305 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
@@ -54,6 +54,31 @@ public abstract class GroovyProfileTest {
         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()")
         }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
+            g.V.out.out.profile('metrics_key') // 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')");
+        }
+
+        @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')");
+        }
+
+        @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')")
+        }
+
+        @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')")
+        }
     }
 }
 

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy
deleted file mode 100644
index d3d7e13..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy
+++ /dev/null
@@ -1,58 +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.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal
-import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyProfileSideEffectTest {
-
-    public static class Traversals extends ProfileSideEffectTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
-            g.V.out.out.profile('metrics_key') // 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')");
-        }
-
-        @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')");
-        }
-
-        @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')")
-        }
-
-        @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')")
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
index 06b4978..25e6c8a 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
@@ -73,7 +73,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGrou
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectTest;
@@ -162,7 +161,6 @@ public class GroovyProcessComputerSuite extends ProcessComputerSuite {
             GroovyGroupTestV3d0.Traversals.class,
             GroovyGroupCountTest.Traversals.class,
             GroovyInjectTest.Traversals.class,
-            GroovyProfileSideEffectTest.Traversals.class,
             GroovySackTest.Traversals.class,
             GroovySideEffectCapTest.Traversals.class,
             GroovySideEffectTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
index c2927a5..60fa5fc 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
@@ -74,7 +74,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGrou
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectTest;
@@ -157,7 +156,6 @@ public class GroovyProcessStandardSuite extends ProcessStandardSuite {
             GroovyGroupTestV3d0.Traversals.class,
             GroovyGroupCountTest.Traversals.class,
             GroovyInjectTest.Traversals.class,
-            GroovyProfileSideEffectTest.Traversals.class,
             GroovySackTest.Traversals.class,
             GroovySideEffectCapTest.Traversals.class,
             GroovySideEffectTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
index 9d588fc..2be30bd 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
@@ -76,7 +76,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCount
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
@@ -170,7 +169,6 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             GroupTestV3d0.Traversals.class,
             GroupCountTest.Traversals.class,
             InjectTest.Traversals.class,
-            ProfileSideEffectTest.Traversals.class,
             SackTest.Traversals.class,
             SideEffectCapTest.Traversals.class,
             SideEffectTest.Traversals.class,
@@ -246,7 +244,6 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             GroupTest.class,
             GroupCountTest.class,
             InjectTest.class,
-            ProfileSideEffectTest.class,
             SackTest.class,
             SideEffectCapTest.class,
             SideEffectTest.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 42ec6e4..904acfd 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -72,7 +72,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCount
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
@@ -163,7 +162,6 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             GroupTestV3d0.Traversals.class,
             GroupCountTest.Traversals.class,
             InjectTest.Traversals.class,
-            ProfileSideEffectTest.Traversals.class,
             SackTest.Traversals.class,
             SideEffectCapTest.Traversals.class,
             SideEffectTest.Traversals.class,
@@ -248,7 +246,6 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             GroupTest.class,
             GroupCountTest.class,
             InjectTest.class,
-            ProfileSideEffectTest.class,
             SackTest.class,
             SideEffectCapTest.class,
             SideEffectTest.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/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 1733c46..2951c40 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
@@ -42,6 +42,7 @@ import org.junit.runner.RunWith;
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
+import java.util.Map;
 import java.util.concurrent.TimeUnit;
 
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
@@ -69,6 +70,16 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile();
 
+    public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
+
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
+
     /**
      * 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.
@@ -95,14 +106,32 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
     }
 
-
     @Test
     @LoadGraphWith(MODERN)
-    public void g_V_out_out_profile_modern() {
-        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
+    @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);
 
-        final TraversalMetrics traversalMetrics = traversal.next();
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        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.", ProfileSideEffectStep.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());
+    }
+
+
+    private void validate_g_V_out_out_profile_modern(TraversalMetrics traversalMetrics) {
         traversalMetrics.toString(); // ensure no exceptions are thrown
 
         Metrics metrics = traversalMetrics.getMetrics(0);
@@ -118,14 +147,26 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
     }
 
-
     @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_out_out_profile_grateful() {
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_profile_modern() {
         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);
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_out_out_profile_modernXmetrics_keyX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+        printTraversalForm(traversal);
+        traversal.iterate();
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        validate_g_V_out_out_profile_modern(traversalMetrics);
+    }
+
+    private void validate_g_V_out_out_profile_grateful(TraversalMetrics traversalMetrics) {
         traversalMetrics.toString(); // ensure no exceptions are thrown
 
         Metrics metrics = traversalMetrics.getMetrics(0);
@@ -154,16 +195,27 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
     }
 
     @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();
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_out_out_profile_grateful() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
         printTraversalForm(traversal);
 
-        TraversalMetrics traversalMetrics = traversal.next();
+        final TraversalMetrics traversalMetrics = traversal.next();
+        validate_g_V_out_out_profile_grateful(traversalMetrics);
+    }
 
-        assertEquals("There should be 8 steps in this traversal (counting injected profile steps).", 8, traversal.asAdmin().getSteps().size());
+    @Test
+    @LoadGraphWith(GRATEFUL)
+    public void g_V_out_out_profile_gratefulXmetrics_keyX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+        printTraversalForm(traversal);
 
+        traversal.iterate();
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        validate_g_V_out_out_profile_grateful(traversalMetrics);
+    }
+
+    private void validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(TraversalMetrics traversalMetrics) {
         traversalMetrics.toString(); // ensure no exceptions are thrown
 
         // Grab the second (sideEffect{sleep}) step and check the times.
@@ -187,11 +239,27 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
     @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();
+    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
+        final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_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();
+    @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();
+        printTraversalForm(traversal);
+        traversal.iterate();
+        assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
+        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
+    }
+
+    private void validate_g_V_repeat_both_modern_profile(TraversalMetrics traversalMetrics) {
         traversalMetrics.toString(); // ensure no exceptions are thrown
 
         Metrics metrics = traversalMetrics.getMetrics(0);
@@ -228,11 +296,27 @@ 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();
+    @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).get();
+        validate_g_V_repeat_both_modern_profile(traversalMetrics);
+    }
+
+    private void validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(Traversal traversal, TraversalMetrics traversalMetrics) {
         traversalMetrics.toString(); // ensure no exceptions are thrown
 
         assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
@@ -252,6 +336,28 @@ 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();
+        printTraversalForm(traversal);
+
+        final TraversalMetrics traversalMetrics = traversal.next();
+        validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_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();
+        printTraversalForm(traversal);
+
+        traversal.iterate();
+
+        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+        validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(traversal, traversalMetrics);
+    }
+
     /**
      * ProfileStrategy callback test. Goal: ensure that a step that implements Profileable gets a callback to setMetrics
      */
@@ -297,12 +403,36 @@ 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();
+        MockStep mockStep = new MockStep(t.asAdmin());
+        t.asAdmin().addStep(3, mockStep);
+        t.iterate();
+        assertTrue(mockStep.callbackCalled);
+
+        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
+            final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
+            assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
+        }
+    }
+
+    @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();
         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();
+        printTraversalForm(traversal);
+        traversal.iterate();
+    }
+
     /**
      * Traversals
      */
@@ -344,5 +474,42 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
         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();
         }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
+            return g.V().out().out().profile(METRICS_KEY);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX() {
+            return g.V().repeat(both()).times(3).profile(METRICS_KEY);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
+            return g.V().sideEffect(v -> {
+                try {
+                    Thread.sleep(10);
+                } catch (final InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }).sideEffect(v -> {
+                try {
+                    Thread.sleep(5);
+                } catch (final InterruptedException e) {
+                    e.printStackTrace();
+                }
+            }).profile(METRICS_KEY);
+        }
+
+        @Override
+        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
+            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);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java
deleted file mode 100644
index 1e61828..0000000
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectTest.java
+++ /dev/null
@@ -1,360 +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.sideEffect;
-
-import org.apache.tinkerpop.gremlin.LoadGraphWith;
-import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
-import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.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;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep;
-import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-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;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-@RunWith(GremlinProcessRunner.class)
-public abstract class ProfileSideEffectTest extends AbstractGremlinProcessTest {
-    private static final String METRICS_KEY = "metrics_key";
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
-
-    public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
-
-    public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
-
-    public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
-
-    /**
-     * 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() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
-        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.", ProfileSideEffectStep.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)
-    public void g_V_out_out_profile_modern() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(2);
-        assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-    }
-
-
-    @Test
-    @LoadGraphWith(GRATEFUL)
-    public void g_V_out_out_profile_grateful() {
-        final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(808, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(808, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(8049, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        metrics = traversalMetrics.getMetrics(2);
-        assertEquals(327370, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
-        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());
-
-        TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        // Grab the second (sideEffect{sleep}) step and check the times.
-        Metrics metrics = traversalMetrics.getMetrics(1);
-        // 6 elements w/ a 10ms sleep each = 60ms with 10ms for other computation.
-        assertTrue("Duration should be at least the length of the sleep (59ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) >= 59);
-
-        // 6 elements w/ a 5ms sleep each = 30ms plus 20ms for other computation
-        metrics = traversalMetrics.getMetrics(2);
-        assertTrue("Duration should be at least the length of the sleep (29ms): " + metrics.getDuration(TimeUnit.MILLISECONDS),
-                metrics.getDuration(TimeUnit.MILLISECONDS) >= 29);
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void g_V_repeat_both_modern_profile() {
-        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).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(72, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Count should be greater than traversers.", metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertTrue("Percent duration should be positive.", (Double) metrics.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY) >= 0);
-        assertTrue("Times should be positive.", metrics.getDuration(TimeUnit.MICROSECONDS) >= 0);
-
-        // Test the nested global metrics of the repeat step
-        final Metrics vertexStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[0];
-        assertEquals(114, vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-        assertNotEquals(0, vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        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];
-        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);
-
-
-        double totalPercentDuration = 0;
-        for (Metrics m : traversalMetrics.getMetrics()) {
-            totalPercentDuration += (Double) m.getAnnotation(TraversalMetrics.PERCENT_DURATION_KEY);
-        }
-        assertEquals(100, totalPercentDuration, 0.000001);
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-        final Traversal<Vertex, String> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
-        printTraversalForm(traversal);
-
-        traversal.iterate();
-
-        final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
-        traversalMetrics.toString(); // ensure no exceptions are thrown
-
-        assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
-
-        Metrics metrics = traversalMetrics.getMetrics(0);
-        assertEquals(6, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(6, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        metrics = traversalMetrics.getMetrics(1);
-        assertEquals(1, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
-        assertEquals(1, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
-
-        if (traversal.asAdmin().getStrategies().toList().stream().anyMatch(s -> s instanceof RangeByIsCountStrategy)) {
-            assertEquals("Metrics 1 should have 4 nested metrics.", 4, metrics.getNested().size());
-        } else {
-            assertEquals("Metrics 1 should have 3 nested metrics.", 3, metrics.getNested().size());
-        }
-    }
-
-    /**
-     * ProfileStrategy callback test. Goal: ensure that a step that implements Profileable gets a callback to setMetrics
-     */
-
-    // Setup a "mock" step to test the strategy
-    static public class MockStep extends FlatMapStep<Vertex, Vertex> implements Profiling {
-        public static boolean callbackCalled = false;
-
-        public MockStep(final Traversal.Admin traversal) {
-            super(traversal);
-        }
-
-        @Override
-        protected Iterator<Vertex> flatMap(final Traverser.Admin<Vertex> traverser) {
-            List<Vertex> l = new ArrayList<>();
-            l.add(traverser.get());
-            return l.iterator();
-        }
-
-        @Override
-        public void setMetrics(final MutableMetrics parentMetrics) {
-            if (parentMetrics != null) {
-                callbackCalled = true;
-                parentMetrics.setCount("bogusCount", 100);
-            }
-        }
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    @IgnoreEngine(TraversalEngine.Type.COMPUTER)
-    public void testProfileStrategyCallback() {
-        final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetrics_keyX();
-        MockStep mockStep = new MockStep(t.asAdmin());
-        t.asAdmin().addStep(3, mockStep);
-        t.iterate();
-        assertTrue(mockStep.callbackCalled);
-
-        if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
-            final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY).get();
-            assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
-        }
-    }
-
-    @Test
-    @LoadGraphWith(MODERN)
-    public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
-        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
-        printTraversalForm(traversal);
-        traversal.iterate();
-    }
-
-    /**
-     * Traversals
-     */
-    public static class Traversals extends ProfileSideEffectTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
-            return g.V().out().out().profile(METRICS_KEY);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX() {
-            return g.V().repeat(both()).times(3).profile(METRICS_KEY);
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
-            return g.V().sideEffect(v -> {
-                try {
-                    Thread.sleep(10);
-                } catch (final InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }).sideEffect(v -> {
-                try {
-                    Thread.sleep(5);
-                } catch (final InterruptedException e) {
-                    e.printStackTrace();
-                }
-            }).profile(METRICS_KEY);
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
-            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);
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/856bb564/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 73106a0..a53018b 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
@@ -152,16 +152,16 @@ import java.util.stream.Stream;
         method = "g_V_out_out_profile_grateful",
         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.ProfileSideEffectTest$Traversals",
-        method = "g_V_out_out_profile_grateful",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest$Traversals",
+        method = "g_V_out_out_profile_gratefulXmetrics_keyX",
         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",
         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.GroovyProfileSideEffectTest$Traversals",
-        method = "g_V_out_out_profile_grateful",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyProfileTest$Traversals",
+        method = "g_V_out_out_profile_gratefulXmetrics_keyX",
         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",


[08/12] incubator-tinkerpop git commit: Revert "Update traversal docs for Profile step changes."

Posted by ok...@apache.org.
Revert "Update traversal docs for Profile step changes."

This reverts commit 86941ee5c6ff37f2bc4f88ea520a530e9372ba79.


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

Branch: refs/heads/TINKERPOP-1192
Commit: ebb6143e9dffbc0980dcb1445a18088f3e7fd4fa
Parents: 6f6c9a5
Author: rjbriody <bo...@datastax.com>
Authored: Tue Mar 1 08:45:46 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Tue Mar 1 08:45:46 2016 -0500

----------------------------------------------------------------------
 docs/src/reference/the-traversal.asciidoc | 11 +----------
 1 file changed, 1 insertion(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/ebb6143e/docs/src/reference/the-traversal.asciidoc
----------------------------------------------------------------------
diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc
index d5d151d..410018e 100644
--- a/docs/src/reference/the-traversal.asciidoc
+++ b/docs/src/reference/the-traversal.asciidoc
@@ -1346,7 +1346,7 @@ profile results, but durations are not exact. Thus, durations are best considere
 
 [gremlin-groovy,modern]
 ----
-g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile()
+g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile().cap(TraversalMetrics.METRICS_KEY)
 ----
 
 The `profile()`-step generates a `TraversalMetrics` sideEffect object that contains the following information:
@@ -1363,15 +1363,6 @@ into a single traverser. That new traverser has a `Traverser.bulk()` that is the
 bulks. On the other hand, the `Count` represents the sum of all `Traverser.bulk()` results and thus, expresses the
 number of "represented" (not enumerated) traversers. `Traversers` will always be less than or equal to `Count`.
 
-A side effect key can also be passed to the `profile()`-step for situations when it is important to iterate the normal
-results of the Traversal and retrieve the `TraversalMetrics` afterwards, as shown here:
-
----
-t = g.V().out('created').repeat(both()).times(3).hasLabel('person').values('age').sum().profile('metrics')
-t.iterate()
-metrics = t.asAdmin().getSideEffects().get('metrics')
----
-
 For traversal compilation information, please see <<explain-step,`explain()`>>-step.
 
 [[range-step]]


[02/12] incubator-tinkerpop git commit: TINKERPOP-958 split .profile() into ProfileSideEffectStep and ProfileStep (which is a MapStep).

Posted by ok...@apache.org.
TINKERPOP-958 split .profile() into ProfileSideEffectStep and ProfileStep (which is a MapStep).


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

Branch: refs/heads/TINKERPOP-1192
Commit: 8e807eec73a72b4bbbde3156e6aa8b237d099b42
Parents: 5dd337d
Author: rjbriody <bo...@datastax.com>
Authored: Wed Feb 24 15:08:25 2016 -0500
Committer: rjbriody <bo...@datastax.com>
Committed: Wed Feb 24 15:08:25 2016 -0500

----------------------------------------------------------------------
 .../gremlin/process/traversal/Traversal.java    |  12 +-
 .../traversal/dsl/graph/GraphTraversal.java     |   6 +-
 .../step/filter/WhereTraversalStep.java         |   4 +-
 .../process/traversal/step/map/MatchStep.java   |   4 +-
 .../traversal/step/map/ProfileMarkerStep.java   |  42 +++
 .../step/sideEffect/ProfileSideEffectStep.java  | 247 +++++++++++++
 .../traversal/step/sideEffect/ProfileStep.java  | 233 ------------
 .../strategy/decoration/ConnectiveStrategy.java |   4 +-
 .../strategy/finalization/ProfileStrategy.java  |  33 +-
 .../StandardVerificationStrategy.java           |   9 +
 .../traversal/util/TraversalMetrics.java        |   6 -
 .../sideEffect/ProfileSideEffectStepTest.java   |  37 ++
 .../step/sideEffect/ProfileStepTest.java        |  37 --
 .../traversal/step/map/GroovyProfileTest.groovy |  59 +++
 .../GroovyProfileSideEffectTest.groovy          |  58 +++
 .../step/sideEffect/GroovyProfileTest.groovy    |  58 ---
 .../process/GroovyProcessComputerSuite.java     |   6 +-
 .../process/GroovyProcessStandardSuite.java     |   6 +-
 .../gremlin/process/ProcessComputerSuite.java   |   9 +-
 .../gremlin/process/ProcessStandardSuite.java   |   8 +-
 .../process/traversal/step/map/ProfileTest.java | 348 ++++++++++++++++++
 .../step/sideEffect/ProfileSideEffectTest.java  | 360 +++++++++++++++++++
 .../traversal/step/sideEffect/ProfileTest.java  | 358 ------------------
 .../gremlin/structure/SerializationTest.java    |   6 +-
 .../gremlin/hadoop/structure/HadoopGraph.java   |  12 +-
 25 files changed, 1228 insertions(+), 734 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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 8b598a6..ddf0246 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,12 +21,14 @@ 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.sideEffect.ProfileStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
+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;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
 import org.apache.tinkerpop.gremlin.structure.Graph;
 
 import java.io.Serializable;
@@ -173,10 +175,12 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
     /**
      * Profile the traversal.
      *
-     * @return the updated traversal with respective {@link ProfileStep}.
+     * @return the updated traversal with respective {@link ProfileMarkerStep}.
      */
-    public default Traversal<S, E> profile() {
-        return this.asAdmin().addStep(new ProfileStep<>(this.asAdmin()));
+    public default Traversal<S, TraversalMetrics> profile() {
+        return this.asAdmin()
+                .addStep(new ProfileMarkerStep(this.asAdmin()))
+                .addStep(new SideEffectCapStep<Object, TraversalMetrics>(this.asAdmin(), ProfileMarkerStep.METRICS_KEY));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 69c84ad..a1e7954 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -116,7 +116,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupSideE
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentityStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.LambdaSideEffectStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackValueStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
@@ -1022,8 +1022,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
         return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), sideEffectKey));
     }
 
-    public default GraphTraversal<S, E> profile() {
-        return this.asAdmin().addStep(new ProfileStep<>(this.asAdmin()));
+    public default GraphTraversal<S, E> profile(final String sideEffectKey) {
+        return this.asAdmin().addStep(new ProfileSideEffectStep<>(this.asAdmin(), sideEffectKey));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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 78f3756..2b877ba 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
@@ -25,7 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 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.map.MapStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileStep;
+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.strategy.decoration.ConnectiveStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
@@ -135,7 +135,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 ProfileStep && this.getTraversal().getEndStep().getPreviousStep() instanceof WhereEndStep)     // TOTAL SUCKY HACK!
+            else if (this.getTraversal().getEndStep() instanceof ProfileSideEffectStep && 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/8e807eec/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 5452c17..0c57d97 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
@@ -31,7 +31,7 @@ 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.ProfileStep;
+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.AbstractStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
@@ -505,7 +505,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 ProfileStep ?           // TOTAL HACK
+            return endStep instanceof ProfileSideEffectStep ?           // TOTAL HACK
                     ((MatchEndStep) endStep.getPreviousStep()).getMatchKey() :
                     ((MatchEndStep) endStep).getMatchKey();
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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
new file mode 100644
index 0000000..6159082
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java
@@ -0,0 +1,42 @@
+/*
+ * 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<S> processNextStart() throws NoSuchElementException {
+        return this.starts.next();
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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
new file mode 100644
index 0000000..cb3e7f8
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
@@ -0,0 +1,247 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
+import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+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.MapReducer;
+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.structure.Vertex;
+import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.NoSuchElementException;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable, MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics>, GraphComputing {
+
+    private String sideEffectKey;
+    // Stored in the Traversal sideEffects but kept here as a reference for convenience.
+    private StandardTraversalMetrics traversalMetrics;
+    private boolean onGraphComputer = false;
+
+    public ProfileSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
+        super(traversal);
+        this.sideEffectKey = sideEffectKey;
+    }
+
+    @Override
+    protected void sideEffect(Traverser.Admin<S> traverser) {
+    }
+
+    @Override
+    public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
+        return new ProfileMapReduce(this);
+    }
+
+    @Override
+    public void onGraphComputer() {
+        this.onGraphComputer = true;
+    }
+
+    @Override
+    public String getSideEffectKey() {
+        return this.sideEffectKey;
+    }
+
+    @Override
+    public Traverser<S> next() {
+        Traverser<S> ret = null;
+        initializeIfNeeded();
+        traversalMetrics.start(this.getId());
+        try {
+            ret = super.next();
+            return ret;
+        } finally {
+            if (ret != null) {
+                traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
+            } else {
+                traversalMetrics.stop(this.getId());
+            }
+        }
+    }
+
+    @Override
+    public boolean hasNext() {
+        initializeIfNeeded();
+        traversalMetrics.start(this.getId());
+        boolean ret = super.hasNext();
+        traversalMetrics.stop(this.getId());
+        return ret;
+    }
+
+    @Override
+    protected Traverser<S> processNextStart() throws NoSuchElementException {
+        return this.starts.next();
+    }
+
+    private void initializeIfNeeded() {
+        if (traversalMetrics != null) {
+            return;
+        }
+
+        createTraversalMetricsSideEffectIfNecessary();
+
+        // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
+        // sideEffects after serialization.
+        if (traversalMetrics == null) {
+            // look up the TraversalMetrics in the root traversal's sideEffects
+            Traversal t = this.getTraversal();
+            while (!(t.asAdmin().getParent() instanceof TraversalVertexProgramStep)) {
+                t = t.asAdmin().getParent().asStep().getTraversal();
+            }
+            traversalMetrics = t.asAdmin().getSideEffects().<StandardTraversalMetrics>get(this.sideEffectKey).get();
+        }
+    }
+
+    private void createTraversalMetricsSideEffectIfNecessary() {
+        if (this.getTraversal().getSideEffects().get(this.sideEffectKey).isPresent()) {
+            // Already initialized
+            return;
+        }
+
+        if (!(this.getTraversal().getParent() instanceof TraversalVertexProgramStep) && !(this.getTraversal().getParent() instanceof EmptyStep)) {
+            // Initialization is handled at the top-level of the traversal only.
+            return;
+        }
+
+        // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
+        // once per thread if using Computer.)
+
+        traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(this.sideEffectKey, StandardTraversalMetrics::new);
+        prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
+    }
+
+    // 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.traversalMetrics.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);
+                }
+            }
+        }
+    }
+
+    //////////////////
+
+    public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
+
+        private String sideEffectKey;
+
+        private ProfileMapReduce() {
+        }
+
+        private ProfileMapReduce(final ProfileSideEffectStep step) {
+            this.sideEffectKey = step.getSideEffectKey();
+        }
+
+        @Override
+        public boolean doStage(final Stage stage) {
+            return true;
+        }
+
+        @Override
+        public String getMemoryKey() {
+            return this.sideEffectKey;
+        }
+
+        @Override
+        public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
+            VertexTraversalSideEffects.of(vertex).<StandardTraversalMetrics>get(this.sideEffectKey).ifPresent(emitter::emit);
+        }
+
+        @Override
+        public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+            reduce(key, values, emitter);
+        }
+
+        @Override
+        public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
+            emitter.emit(StandardTraversalMetrics.merge(values));
+        }
+
+        @Override
+        public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
+            return StandardTraversalMetrics.merge(IteratorUtils.map(keyValues, KeyValue::getValue));
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
deleted file mode 100644
index 5b468dc..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStep.java
+++ /dev/null
@@ -1,233 +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.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.computer.KeyValue;
-import org.apache.tinkerpop.gremlin.process.computer.MapReduce;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.VertexTraversalSideEffects;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
-import org.apache.tinkerpop.gremlin.process.computer.util.StaticMapReduce;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-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.MapReducer;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
-import org.apache.tinkerpop.gremlin.process.traversal.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.structure.Vertex;
-import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
-
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class ProfileStep<S> extends AbstractStep<S, S> implements MapReducer<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics>, GraphComputing {
-
-    // Stored in the Traversal sideEffects but kept here as a reference for convenience.
-    private StandardTraversalMetrics traversalMetrics;
-    private boolean onGraphComputer = false;
-
-    public ProfileStep(final Traversal.Admin traversal) {
-        super(traversal);
-    }
-
-
-    @Override
-    public MapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> getMapReduce() {
-        return ProfileMapReduce.instance();
-    }
-
-    @Override
-    public Traverser<S> next() {
-        Traverser<S> ret = null;
-        initializeIfNeeded();
-        traversalMetrics.start(this.getId());
-        try {
-            ret = super.next();
-            return ret;
-        } finally {
-            if (ret != null) {
-                traversalMetrics.finish(this.getId(), ret.asAdmin().bulk());
-            } else {
-                traversalMetrics.stop(this.getId());
-            }
-        }
-    }
-
-    @Override
-    public boolean hasNext() {
-        initializeIfNeeded();
-        traversalMetrics.start(this.getId());
-        boolean ret = super.hasNext();
-        traversalMetrics.stop(this.getId());
-        return ret;
-    }
-
-    @Override
-    protected Traverser<S> processNextStart() throws NoSuchElementException {
-        return this.starts.next();
-    }
-
-    private void initializeIfNeeded() {
-        if (traversalMetrics != null) {
-            return;
-        }
-
-        createTraversalMetricsSideEffectIfNecessary();
-
-        // How can traversalMetrics still be null? When running on computer it may need to be re-initialized from
-        // sideEffects after serialization.
-        if (traversalMetrics == null) {
-            // look up the TraversalMetrics in the root traversal's sideEffects
-            Traversal t = this.getTraversal();
-            while (!(t.asAdmin().getParent() instanceof TraversalVertexProgramStep)) {
-                t = t.asAdmin().getParent().asStep().getTraversal();
-            }
-            traversalMetrics = t.asAdmin().getSideEffects().<StandardTraversalMetrics>get(TraversalMetrics.METRICS_KEY).get();
-        }
-    }
-
-    private void createTraversalMetricsSideEffectIfNecessary() {
-        if (this.getTraversal().getSideEffects().get(TraversalMetrics.METRICS_KEY).isPresent()) {
-            // Already initialized
-            return;
-        }
-
-        if (!(this.getTraversal().getParent() instanceof TraversalVertexProgramStep) && !(this.getTraversal().getParent() instanceof EmptyStep)) {
-            // Initialization is handled at the top-level of the traversal only.
-            return;
-        }
-
-        // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
-        // once per thread if using Computer.)
-
-        traversalMetrics = this.getTraversal().getSideEffects().getOrCreate(TraversalMetrics.METRICS_KEY, StandardTraversalMetrics::new);
-        prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
-    }
-
-    // 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);
-            ProfileStep profileStep = (ProfileStep) steps.get(ii + 1);
-
-            // 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.
-            profileStep.traversalMetrics = this.traversalMetrics;
-
-            // Add root metrics to traversalMetrics
-            this.traversalMetrics.addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileStep.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() {
-        this.onGraphComputer = true;
-    }
-
-    //////////////////
-
-    public static final class ProfileMapReduce extends StaticMapReduce<MapReduce.NullObject, StandardTraversalMetrics, MapReduce.NullObject, StandardTraversalMetrics, StandardTraversalMetrics> {
-
-        private static ProfileMapReduce INSTANCE = new ProfileMapReduce();
-
-        private ProfileMapReduce() {
-
-        }
-
-        @Override
-        public boolean doStage(final Stage stage) {
-            return true;
-        }
-
-        @Override
-        public String getMemoryKey() {
-            return TraversalMetrics.METRICS_KEY;
-        }
-
-        @Override
-        public void map(final Vertex vertex, final MapEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            VertexTraversalSideEffects.of(vertex).<StandardTraversalMetrics>get(TraversalMetrics.METRICS_KEY).ifPresent(emitter::emit);
-        }
-
-        @Override
-        public void combine(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            reduce(key, values, emitter);
-        }
-
-        @Override
-        public void reduce(final NullObject key, final Iterator<StandardTraversalMetrics> values, final ReduceEmitter<NullObject, StandardTraversalMetrics> emitter) {
-            emitter.emit(StandardTraversalMetrics.merge(values));
-        }
-
-        @Override
-        public StandardTraversalMetrics generateFinalResult(final Iterator<KeyValue<NullObject, StandardTraversalMetrics>> keyValues) {
-            return StandardTraversalMetrics.merge(IteratorUtils.map(keyValues, KeyValue::getValue));
-        }
-
-        public static ProfileMapReduce instance() {
-            return INSTANCE;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
index f5b971f..7ec1742 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/ConnectiveStrategy.java
@@ -26,7 +26,7 @@ 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.OrStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileStep;
+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.ComputerAwareStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
@@ -63,7 +63,7 @@ public final class ConnectiveStrategy extends AbstractTraversalStrategy<Traversa
     }
 
     private static boolean legalCurrentStep(final Step<?, ?> step) {
-        return !(step instanceof EmptyStep || step instanceof ProfileStep || step instanceof ComputerAwareStep.EndStep || (step instanceof StartStep && !StartStep.isVariableStartStep(step)) || GraphStep.isStartStep(step));
+        return !(step instanceof EmptyStep || step instanceof ProfileSideEffectStep || step instanceof ComputerAwareStep.EndStep || (step instanceof StartStep && !StartStep.isVariableStartStep(step)) || GraphStep.isStartStep(step));
     }
 
     private static void processConnectiveMarker(final Traversal.Admin<?, ?> traversal) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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 656fd92..17f1a40 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
@@ -22,7 +22,8 @@ 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.sideEffect.ProfileStep;
+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.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 
@@ -40,19 +41,18 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
 
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
-        if (!TraversalHelper.hasStepOfClass(ProfileStep.class, traversal)) {
-            // No ProfileStep present
-            return;
+        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);
         }
-
-        prepTraversalForProfiling(traversal);
     }
 
     // Walk the traversal steps and inject the .profile()-steps.
-    private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal) {
-        // Remove user-specified .profile() steps
-        final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
-        for (ProfileStep step : profileSteps) {
+    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);
         }
 
@@ -63,17 +63,22 @@ 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) {
+                break;
+            }
+
             // Create and inject ProfileStep
-            ProfileStep profileStep = new ProfileStep(traversal);
-            traversal.addStep((ii * 2) + 1, 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 ProfileStep(t));
+                    t.addStep(new ProfileSideEffectStep(t, sideEffectKey));
                 }
                 for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
-                    t.addStep(new ProfileStep(t));
+                    t.addStep(new ProfileSideEffectStep(t, sideEffectKey));
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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 62f2654..1889fe5 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,6 +22,7 @@ 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.util.ReducingBarrierStep;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -47,6 +48,14 @@ public final class StandardVerificationStrategy extends AbstractTraversalStrateg
             if (step instanceof ReducingBarrierStep && step.getTraversal().getParent() instanceof RepeatStep && step.getTraversal().getParent().getGlobalChildren().get(0).getSteps().contains(step))
                 throw new VerificationException("The direct parent of a ReducingBarrierStep can not be a RepeatStep: " + 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);
+        }
+
+        if (TraversalHelper.getStepsOfClass(ProfileMarkerStep.class, traversal).size() > 1) {
+            throw new VerificationException("The .profile()-Step cannot be specified multiple times.", traversal);
+        }
     }
 
     public static StandardVerificationStrategy instance() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
index b2c70cf..6a54680 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalMetrics.java
@@ -18,8 +18,6 @@
  */
 package org.apache.tinkerpop.gremlin.process.traversal.util;
 
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
 import java.util.Collection;
 import java.util.concurrent.TimeUnit;
 
@@ -29,10 +27,6 @@ import java.util.concurrent.TimeUnit;
  * @author Bob Briody (http://bobbriody.com)
  */
 public interface TraversalMetrics {
-    /**
-     * The side-effect key used to store and retrieve the TraversalMetrics for a given Traversal.
-     */
-    public static final String METRICS_KEY = Graph.Hidden.hide("metrics");
 
     /**
      * The MetricsId used to obtain the element count via Metrics.getCount(String countKey)

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStepTest.java
new file mode 100644
index 0000000..6ad6ec1
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStepTest.java
@@ -0,0 +1,37 @@
+/*
+ * 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.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.StepTest;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author Daniel Kuppitz (http://gremlin.guru)
+ */
+public class ProfileSideEffectStepTest extends StepTest {
+
+    @Override
+    protected List<Traversal> getTraversals() {
+        return Collections.singletonList(__.identity().profile("x"));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStepTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStepTest.java
deleted file mode 100644
index 4b7a57b..0000000
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileStepTest.java
+++ /dev/null
@@ -1,37 +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.sideEffect;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.process.traversal.step.StepTest;
-
-import java.util.Collections;
-import java.util.List;
-
-/**
- * @author Daniel Kuppitz (http://gremlin.guru)
- */
-public class ProfileStepTest extends StepTest {
-
-    @Override
-    protected List<Traversal> getTraversals() {
-        return Collections.singletonList(__.identity().profile());
-    }
-}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/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
new file mode 100644
index 0000000..9701421
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
@@ -0,0 +1,59 @@
+/*
+ * 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.util.ScriptTraversal
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+
+/**
+ * @author Bob Briody (http://bobbriody.com
+ */
+public abstract class GroovyProfileTest {
+
+    public static class Traversals extends ProfileTest {
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_out_out_profile() {
+            g.V.out.out.profile() // locked traversal
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_repeatXbothX_timesX3X_profile() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.repeat(__.both()).times(3).profile()");
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile()");
+        }
+
+        @Override
+        public Traversal<Vertex, TraversalMetrics> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().sideEffect{Thread.sleep(10)}.sideEffect{Thread.sleep(5)}.profile()")
+        }
+
+        @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()")
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy
new file mode 100644
index 0000000..d3d7e13
--- /dev/null
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileSideEffectTest.groovy
@@ -0,0 +1,58 @@
+/*
+ * 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.sideEffect
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal
+import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal
+import org.apache.tinkerpop.gremlin.structure.Vertex
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class GroovyProfileSideEffectTest {
+
+    public static class Traversals extends ProfileSideEffectTest {
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
+            g.V.out.out.profile('metrics_key') // 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')");
+        }
+
+        @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')");
+        }
+
+        @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')")
+        }
+
+        @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')")
+        }
+    }
+}
+

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
deleted file mode 100644
index 22f81f4..0000000
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyProfileTest.groovy
+++ /dev/null
@@ -1,58 +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.sideEffect
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal
-import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal
-import org.apache.tinkerpop.gremlin.structure.Vertex
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public abstract class GroovyProfileTest {
-
-    public static class Traversals extends ProfileTest {
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_out_out_profile() {
-            g.V.out.out.profile() // locked traversal
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profile() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.repeat(__.both()).times(3).profile()");
-        }
-
-        @Override
-        public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile()");
-        }
-
-        @Override
-        public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
-            new ScriptTraversal<>(g, "gremlin-groovy", "g.V().sideEffect{Thread.sleep(10)}.sideEffect{Thread.sleep(5)}.profile()")
-        }
-
-        @Override
-        public Traversal<Vertex, Map<String, String>> 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")
-        }
-    }
-}
-

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
index 8e7fc30..06b4978 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessComputerSuite.java
@@ -60,6 +60,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyOrderTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPageRankTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPathTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPeerPressureTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyProfileTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPropertiesTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySelectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySumTest;
@@ -72,7 +73,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGrou
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectTest;
@@ -145,6 +146,7 @@ public class GroovyProcessComputerSuite extends ProcessComputerSuite {
             GroovyPageRankTest.Traversals.class,
             GroovyPathTest.Traversals.class,
             GroovyPeerPressureTest.Traversals.class,
+            GroovyProfileTest.Traversals.class,
             GroovyPropertiesTest.Traversals.class,
             GroovySelectTest.Traversals.class,
             GroovySumTest.Traversals.class,
@@ -160,7 +162,7 @@ public class GroovyProcessComputerSuite extends ProcessComputerSuite {
             GroovyGroupTestV3d0.Traversals.class,
             GroovyGroupCountTest.Traversals.class,
             GroovyInjectTest.Traversals.class,
-            GroovyProfileTest.Traversals.class,
+            GroovyProfileSideEffectTest.Traversals.class,
             GroovySackTest.Traversals.class,
             GroovySideEffectCapTest.Traversals.class,
             GroovySideEffectTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
index 7024869..c2927a5 100644
--- a/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
+++ b/gremlin-groovy-test/src/main/java/org/apache/tinkerpop/gremlin/process/GroovyProcessStandardSuite.java
@@ -61,6 +61,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMeanTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMinTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyOrderTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyProfileTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyPropertiesTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySelectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovySumTest;
@@ -73,7 +74,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGrou
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyGroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyInjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovyProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroovySideEffectTest;
@@ -141,6 +142,7 @@ public class GroovyProcessStandardSuite extends ProcessStandardSuite {
             GroovyMeanTest.Traversals.class,
             GroovyMinTest.Traversals.class,
             GroovyOrderTest.Traversals.class,
+            GroovyProfileTest.Traversals.class,
             GroovyPathTest.Traversals.class,
             GroovyPropertiesTest.Traversals.class,
             GroovySelectTest.Traversals.class,
@@ -155,7 +157,7 @@ public class GroovyProcessStandardSuite extends ProcessStandardSuite {
             GroovyGroupTestV3d0.Traversals.class,
             GroovyGroupCountTest.Traversals.class,
             GroovyInjectTest.Traversals.class,
-            GroovyProfileTest.Traversals.class,
+            GroovyProfileSideEffectTest.Traversals.class,
             GroovySackTest.Traversals.class,
             GroovySideEffectCapTest.Traversals.class,
             GroovySideEffectTest.Traversals.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
index d680421..9d588fc 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessComputerSuite.java
@@ -63,6 +63,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PageRankTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PeerPressureTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
@@ -75,7 +76,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCount
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
@@ -154,6 +155,7 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             PageRankTest.Traversals.class,
             PathTest.Traversals.class,
             PeerPressureTest.Traversals.class,
+            ProfileTest.Traversals.class,
             PropertiesTest.Traversals.class,
             SelectTest.Traversals.class,
             UnfoldTest.Traversals.class,
@@ -168,7 +170,7 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             GroupTestV3d0.Traversals.class,
             GroupCountTest.Traversals.class,
             InjectTest.Traversals.class,
-            ProfileTest.Traversals.class,
+            ProfileSideEffectTest.Traversals.class,
             SackTest.Traversals.class,
             SideEffectCapTest.Traversals.class,
             SideEffectTest.Traversals.class,
@@ -231,6 +233,7 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             OrderTest.class,
             PageRankTest.class,
             PathTest.class,
+            ProfileTest.class,
             PropertiesTest.class,
             SelectTest.class,
             UnfoldTest.class,
@@ -243,7 +246,7 @@ public class ProcessComputerSuite extends AbstractGremlinSuite {
             GroupTest.class,
             GroupCountTest.class,
             InjectTest.class,
-            ProfileTest.class,
+            ProfileSideEffectTest.class,
             SackTest.class,
             SideEffectCapTest.class,
             SideEffectTest.class,

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/8e807eec/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
index 3b7e634..42ec6e4 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/ProcessStandardSuite.java
@@ -59,6 +59,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.MinTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PathTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertiesTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.SumTest;
@@ -71,7 +72,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupCount
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTestV3d0;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectTest;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileTest;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SackTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapTest;
 import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectTest;
@@ -148,6 +149,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             SumTest.Traversals.class,
             OrderTest.Traversals.class,
             PathTest.Traversals.class,
+            ProfileTest.Traversals.class,
             PropertiesTest.Traversals.class,
             SelectTest.Traversals.class,
             VertexTest.Traversals.class,
@@ -161,7 +163,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             GroupTestV3d0.Traversals.class,
             GroupCountTest.Traversals.class,
             InjectTest.Traversals.class,
-            ProfileTest.Traversals.class,
+            ProfileSideEffectTest.Traversals.class,
             SackTest.Traversals.class,
             SideEffectCapTest.Traversals.class,
             SideEffectTest.Traversals.class,
@@ -246,7 +248,7 @@ public class ProcessStandardSuite extends AbstractGremlinSuite {
             GroupTest.class,
             GroupCountTest.class,
             InjectTest.class,
-            ProfileTest.class,
+            ProfileSideEffectTest.class,
             SackTest.class,
             SideEffectCapTest.class,
             SideEffectTest.class,