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,