You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/03/22 21:53:26 UTC
[01/12] incubator-tinkerpop git commit: profiling overhaul.
Repository: incubator-tinkerpop
Updated Branches:
refs/heads/master 11a717322 -> c7111bedc
profiling overhaul.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/e73bbc5d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/e73bbc5d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/e73bbc5d
Branch: refs/heads/master
Commit: e73bbc5d978432e09e0323509854bed5cb7ee08f
Parents: a50732d
Author: rjbriody <bo...@datastax.com>
Authored: Thu Mar 17 17:13:34 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Thu Mar 17 17:13:34 2016 -0400
----------------------------------------------------------------------
.../traversal/step/map/VertexProgramStep.java | 3 +-
.../gremlin/process/traversal/Traversal.java | 19 +-
.../process/traversal/step/map/MatchStep.java | 29 +--
.../traversal/step/map/ProfileMarkerStep.java | 42 ----
.../step/sideEffect/ProfileSideEffectStep.java | 135 ++---------
.../traversal/step/util/ProfileStep.java | 84 +++++++
.../strategy/finalization/ProfileStrategy.java | 37 +--
.../ComputerVerificationStrategy.java | 10 +-
.../StandardVerificationStrategy.java | 12 +-
.../traversal/util/DefaultTraversalMetrics.java | 226 +++++++++++++++++++
.../traversal/util/DependantMutableMetrics.java | 62 -----
.../process/traversal/util/MutableMetrics.java | 6 +-
.../util/StandardTraversalMetrics.java | 226 -------------------
.../gremlin/structure/io/gryo/GryoMapper.java | 77 +------
.../DefaultTraversalMetricsSupplier.java | 45 ++++
.../StandardTraversalMetricsSupplier.java | 45 ----
.../process/traversal/step/map/ProfileTest.java | 18 +-
17 files changed, 422 insertions(+), 654 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
index 50c2e30..1b561fd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/VertexProgramStep.java
@@ -21,7 +21,6 @@ package org.apache.tinkerpop.gremlin.process.computer.traversal.step.map;
import org.apache.tinkerpop.gremlin.process.computer.ComputerResult;
import org.apache.tinkerpop.gremlin.process.computer.Memory;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.TraversalVertexProgram;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.VertexComputing;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -79,7 +78,7 @@ public abstract class VertexProgramStep extends AbstractStep<ComputerResult, Com
private void processMemorySideEffects(final Memory memory) {
// unfortunately there is no easy way to test this in a test case
- assert this.getNextStep() instanceof ComputerResultStep == memory.exists(TraversalVertexProgram.HALTED_TRAVERSERS);
+ // assert this.getNextStep() instanceof ComputerResultStep == memory.exists(TraversalVertexProgram.HALTED_TRAVERSERS);
final TraversalSideEffects sideEffects = this.getTraversal().getSideEffects();
for (final String key : memory.keys()) {
if (sideEffects.exists(key)) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
index da67277..97779b7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java
@@ -21,7 +21,7 @@ package org.apache.tinkerpop.gremlin.process.traversal;
import org.apache.tinkerpop.gremlin.process.computer.GraphComputer;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
@@ -32,16 +32,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
import org.apache.tinkerpop.gremlin.structure.Graph;
import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
-import java.util.Spliterator;
-import java.util.Spliterators;
+import java.util.*;
import java.util.function.Consumer;
import java.util.stream.Stream;
import java.util.stream.StreamSupport;
@@ -174,12 +165,12 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable {
/**
* Profile the traversal.
*
- * @return the updated traversal with respective {@link ProfileMarkerStep}.
+ * @return the updated traversal with respective {@link ProfileSideEffectStep}.
*/
public default Traversal<S, TraversalMetrics> profile() {
return this.asAdmin()
- .addStep(new ProfileMarkerStep(this.asAdmin()))
- .addStep(new SideEffectCapStep<Object, TraversalMetrics>(this.asAdmin(), ProfileMarkerStep.METRICS_KEY));
+ .addStep(new ProfileSideEffectStep<>(this.asAdmin(), ProfileSideEffectStep.DEFAULT_METRICS_KEY))
+ .addStep(new SideEffectCapStep<Object, TraversalMetrics>(this.asAdmin(), ProfileSideEffectStep.DEFAULT_METRICS_KEY));
}
/**
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
index eb11e5a..c6e3bbe 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
@@ -18,23 +18,14 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-import org.apache.tinkerpop.gremlin.process.traversal.Path;
-import org.apache.tinkerpop.gremlin.process.traversal.Pop;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.*;
import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.AndStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.ConnectiveStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WherePredicateStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.*;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
@@ -45,17 +36,7 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import java.io.Serializable;
import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Map;
-import java.util.NoSuchElementException;
-import java.util.Optional;
-import java.util.Set;
+import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;
@@ -513,7 +494,7 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
public static Optional<String> getEndLabel(final Traversal.Admin<Object, Object> traversal) {
final Step<?, ?> endStep = traversal.getEndStep();
- return endStep instanceof ProfileSideEffectStep ? // TOTAL HACK
+ return endStep instanceof ProfileStep ? // TOTAL HACK
((MatchEndStep) endStep.getPreviousStep()).getMatchKey() :
((MatchEndStep) endStep).getMatchKey();
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java
deleted file mode 100644
index bfef33d..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileMarkerStep.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.step.map;
-
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-
-import java.util.NoSuchElementException;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class ProfileMarkerStep<S> extends AbstractStep<S, S> {
- public static final String METRICS_KEY = Graph.Hidden.hide("metrics");
-
- public ProfileMarkerStep(final Traversal.Admin traversal) {
- super(traversal);
- }
-
- @Override
- protected Traverser.Admin<S> processNextStart() throws NoSuchElementException {
- return this.starts.next();
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
index 64fdbe0..7a9523e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
@@ -18,30 +18,22 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
-import org.apache.tinkerpop.gremlin.util.function.StandardTraversalMetricsSupplier;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.util.function.DefaultTraversalMetricsSupplier;
-import java.util.List;
-import java.util.NoSuchElementException;
import java.util.function.Supplier;
/**
* @author Bob Briody (http://bobbriody.com)
*/
-public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable<StandardTraversalMetrics, StandardTraversalMetrics>, GraphComputing {
+public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements SideEffectCapable<DefaultTraversalMetrics, DefaultTraversalMetrics>, GraphComputing {
+ public static final String DEFAULT_METRICS_KEY = Graph.Hidden.hide("metrics");
private String sideEffectKey;
private boolean onGraphComputer = false;
@@ -49,17 +41,11 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
public ProfileSideEffectStep(final Traversal.Admin traversal, final String sideEffectKey) {
super(traversal);
this.sideEffectKey = sideEffectKey;
- this.getTraversal().getSideEffects().registerIfAbsent(this.sideEffectKey, (Supplier) StandardTraversalMetricsSupplier.instance(), Operator.assign);
+ this.getTraversal().getSideEffects().registerIfAbsent(this.sideEffectKey, (Supplier) DefaultTraversalMetricsSupplier.instance(), Operator.assign);
}
@Override
protected void sideEffect(Traverser.Admin<S> traverser) {
-
- }
-
- @Override
- public void onGraphComputer() {
- this.onGraphComputer = true;
}
@Override
@@ -67,122 +53,35 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
return this.sideEffectKey;
}
- private StandardTraversalMetrics getMetrics() {
- return this.getTraversal().getSideEffects().<StandardTraversalMetrics>get(this.sideEffectKey);
- }
-
@Override
public Traverser.Admin<S> next() {
Traverser.Admin<S> ret = null;
- initializeIfNeeded();
- getMetrics().start(this.getId());
try {
ret = super.next();
return ret;
} finally {
- if (ret != null) {
- getMetrics().finish(this.getId(), ret.bulk());
- } else {
- getMetrics().stop(this.getId());
+ if (ret == null) {
+ finalizeMetrics();
}
}
}
@Override
public boolean hasNext() {
- initializeIfNeeded();
- this.getMetrics().start(this.getId());
boolean ret = super.hasNext();
- this.getMetrics().stop(this.getId());
+ if (!ret) {
+ finalizeMetrics();
+ }
return ret;
}
- @Override
- protected Traverser.Admin<S> processNextStart() throws NoSuchElementException {
- return this.starts.next();
- }
-
- private void initializeIfNeeded() {
- // Initialization is handled at the top-level of the traversal only.
- if (this.getMetrics().wasInitialized() ||
- !(this.getTraversal().getParent() instanceof TraversalVertexProgramStep) &&
- !(this.getTraversal().getParent() instanceof EmptyStep)) {
- return;
- }
- // The following code is executed once per top-level (non-nested) Traversal for all Profile steps. (Technically,
- // once per thread if using Computer.)
- prepTraversalForProfiling(this.getTraversal().asAdmin(), null);
+ private void finalizeMetrics() {
+ final DefaultTraversalMetrics tm = this.getTraversal().getSideEffects().get(this.sideEffectKey);
+ tm.setMetrics(traversal, onGraphComputer);
}
- // Walk the traversal steps and initialize the Metrics timers.
- private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, MutableMetrics parentMetrics) {
-
- DependantMutableMetrics prevMetrics = null;
- final List<Step> steps = traversal.getSteps();
- for (int ii = 0; ii + 1 < steps.size(); ii = ii + 2) {
- Step step = steps.get(ii);
- Step nextStep = steps.get(ii + 1);
- // Do not inject profiling after ProfileStep
- if (!(nextStep instanceof ProfileSideEffectStep)) {
- break;
- }
- ProfileSideEffectStep profileSideEffectStep = (ProfileSideEffectStep) nextStep;
-
- // Create metrics
- MutableMetrics metrics;
-
- // Computer metrics are "stand-alone" but Standard metrics handle double-counted upstream time.
- if (this.onGraphComputer) {
- metrics = new MutableMetrics(step.getId(), step.toString());
- } else {
- metrics = new DependantMutableMetrics(step.getId(), step.toString(), prevMetrics);
- prevMetrics = (DependantMutableMetrics) metrics;
- }
-
- if (step instanceof Profiling) {
- ((Profiling) step).setMetrics(metrics);
- }
-
- // Initialize counters (necessary because some steps might end up being 0)
- metrics.incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, 0);
- metrics.incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 0);
-
- // Add metrics to parent, if necessary
- if (parentMetrics != null) {
- parentMetrics.addNested(metrics);
- }
-
- // The TraversalMetrics sideEffect is shared across all the steps.
- //profileSideEffectStep.traversalMetrics = this.traversalMetrics;
-
- // Add root metrics to traversalMetrics
- this.getMetrics().addMetrics(metrics, step.getId(), ii / 2, parentMetrics == null, profileSideEffectStep.getId());
-
- // Handle nested traversal
- if (step instanceof TraversalParent) {
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
- prepTraversalForProfiling(t, metrics);
- }
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
- prepTraversalForProfiling(t, metrics);
- }
- }
- }
+ @Override
+ public void onGraphComputer() {
+ onGraphComputer = true;
}
-
- ///////////////////////////
-
- /*public static final class ProfileBiOperator implements BinaryOperator<StandardTraversalMetrics>, Serializable {
-
- private static final ProfileBiOperator INSTANCE = new ProfileBiOperator();
-
- @Override
- public StandardTraversalMetrics apply(final StandardTraversalMetrics mutatingSeed, final StandardTraversalMetrics map) {
- return StandardTraversalMetrics.merge(IteratorUtils.of(mutatingSeed, map));
- }
-
- public static final ProfileBiOperator instance() {
- return INSTANCE;
- }
- }*/
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
new file mode 100644
index 0000000..26ba878
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal.step.util;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class ProfileStep<S> extends AbstractStep<S, S> {
+ private MutableMetrics metrics;
+
+ public ProfileStep(final Traversal.Admin traversal) {
+ super(traversal);
+ }
+
+ public MutableMetrics getMetrics() {
+ return metrics;
+ }
+
+ @Override
+ public Traverser.Admin<S> next() {
+ Traverser.Admin<S> ret = null;
+ initializeIfNeeded();
+ metrics.start();
+ try {
+ ret = super.next();
+ return ret;
+ } finally {
+ if (ret != null) {
+ metrics.finish(ret.bulk());
+ } else {
+ metrics.stop();
+ }
+ }
+ }
+
+ @Override
+ public boolean hasNext() {
+ initializeIfNeeded();
+ this.metrics.start();
+ boolean ret = super.hasNext();
+ this.metrics.stop();
+ return ret;
+ }
+
+ @Override
+ protected Traverser.Admin<S> processNextStart() throws NoSuchElementException {
+ return this.starts.next();
+ }
+
+ private void initializeIfNeeded() {
+ if (metrics == null) {
+ metrics = new MutableMetrics(this.getPreviousStep().getId(), this.getPreviousStep().toString());
+ final Step<?, S> previousStep = this.getPreviousStep();
+ if (previousStep instanceof Profiling) {
+ ((Profiling) previousStep).setMetrics(metrics);
+ }
+ }
+ }
+
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index 17f1a40..dd66e1c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -21,9 +21,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -41,21 +40,13 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
- if (TraversalHelper.hasStepOfClass(ProfileSideEffectStep.class, traversal)) {
- prepTraversalForProfiling(traversal, TraversalHelper.getFirstStepOfAssignableClass(ProfileSideEffectStep.class, traversal).get().getSideEffectKey());
- } else if (TraversalHelper.hasStepOfClass(ProfileMarkerStep.class, traversal)) {
- prepTraversalForProfiling(traversal, ProfileMarkerStep.METRICS_KEY);
+ if (!TraversalHelper.getStepsOfAssignableClassRecursively(ProfileSideEffectStep.class, TraversalHelper.getRootTraversal(traversal).asAdmin()).isEmpty()) {
+ prepTraversalForProfiling(traversal);
}
}
- // Walk the traversal steps and inject the .profile()-steps.
- private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal, String sideEffectKey) {
- // Remove user-specified ProfileSideEffectStep steps
- final List<ProfileSideEffectStep> profileSideEffectSteps = TraversalHelper.getStepsOfClass(ProfileSideEffectStep.class, traversal);
- for (ProfileSideEffectStep step : profileSideEffectSteps) {
- traversal.removeStep(step);
- }
-
+ // Iterate the traversal steps and inject the .profile()-steps.
+ private void prepTraversalForProfiling(Traversal.Admin<?, ?> traversal) {
// Add .profile() step after every pre-existing step.
final List<Step> steps = traversal.getSteps();
final int numSteps = steps.size();
@@ -63,24 +54,14 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
// Get the original step
Step step = steps.get(ii * 2);
- // Do not inject profiling after ProfileStep
- if (step instanceof ProfileMarkerStep) {
+ // Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
+ if (step instanceof ProfileSideEffectStep) {
break;
}
// Create and inject ProfileStep
- ProfileSideEffectStep profileSideEffectStep = new ProfileSideEffectStep(traversal, sideEffectKey);
- traversal.addStep((ii * 2) + 1, profileSideEffectStep);
-
- // Handle nested traversal
- if (step instanceof TraversalParent) {
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
- t.addStep(new ProfileSideEffectStep(t, sideEffectKey));
- }
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
- t.addStep(new ProfileSideEffectStep(t, sideEffectKey));
- }
- }
+ ProfileStep profileStep = new ProfileStep(traversal);
+ traversal.addStep((ii * 2) + 1, profileStep);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index 8a2b9a9..f17735f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -23,17 +23,11 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Traversa
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
-import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor;
-import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
-import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.*;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
@@ -54,7 +48,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
private static final Set<Class<?>> UNSUPPORTED_STEPS = new HashSet<>(Arrays.asList(
- InjectStep.class, Mutating.class, SubgraphStep.class, ProfileMarkerStep.class, ProfileSideEffectStep.class, ComputerResultStep.class
+ InjectStep.class, Mutating.class, SubgraphStep.class, ComputerResultStep.class
));
private ComputerVerificationStrategy() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
index ed8c881..8e9c495 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
@@ -22,7 +22,8 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.VertexComput
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileMarkerStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -52,11 +53,14 @@ public final class StandardVerificationStrategy extends AbstractTraversalStrateg
throw new VerificationException("The parent of a reducing barrier can not be repeat()-step: " + step, traversal);
});
- if (TraversalHelper.hasStepOfClass(ProfileMarkerStep.class, traversal) && traversal.asAdmin().getEndStep() instanceof ProfileMarkerStep) {
- throw new VerificationException("When specified, the .profile()-Step must be the last step.", traversal);
+ // The ProfileSideEffectStep must be the last step or the 2nd last step when accompanied by the cap step.
+ if (TraversalHelper.hasStepOfClass(ProfileSideEffectStep.class, traversal) &&
+ !(traversal.asAdmin().getEndStep() instanceof ProfileSideEffectStep) &&
+ !(traversal.asAdmin().getEndStep() instanceof SideEffectCapStep && traversal.asAdmin().getEndStep().getPreviousStep() instanceof ProfileSideEffectStep)) {
+ throw new VerificationException("When specified, the .profile()-Step must be the last step or followed only by the cap step.", traversal);
}
- if (TraversalHelper.getStepsOfClass(ProfileMarkerStep.class, traversal).size() > 1) {
+ if (TraversalHelper.getStepsOfClass(ProfileSideEffectStep.class, traversal).size() > 1) {
throw new VerificationException("The .profile()-Step cannot be specified multiple times.", traversal);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
new file mode 100644
index 0000000..a2d2812
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -0,0 +1,226 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal.util;
+
+import org.apache.commons.lang.StringUtils;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
+
+import java.io.Serializable;
+import java.util.*;
+import java.util.concurrent.TimeUnit;
+
+/**
+ * @author Bob Briody (http://bobbriody.com)
+ */
+public final class DefaultTraversalMetrics implements TraversalMetrics, Serializable {
+ // toString() specific headers
+ private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
+
+ private final Map<String, MutableMetrics> metrics = new HashMap<>();
+ private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
+
+ /*
+ The following are computed values upon the completion of profiling in order to report the results back to the user
+ */
+ private long totalStepDuration;
+ private Map<String, ImmutableMetrics> computedMetrics;
+
+ public DefaultTraversalMetrics() {
+ }
+
+ @Override
+ public long getDuration(final TimeUnit unit) {
+ return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
+ }
+
+ @Override
+ public Metrics getMetrics(final int index) {
+ // adjust index to account for the injected profile steps
+ return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
+ }
+
+ @Override
+ public Metrics getMetrics(final String id) {
+ return computedMetrics.get(id);
+ }
+
+ @Override
+ public Collection<ImmutableMetrics> getMetrics() {
+ return computedMetrics.values();
+ }
+
+ @Override
+ public String toString() {
+ // Build a pretty table of metrics data.
+
+ // Append headers
+ final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
+ .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
+
+ sb.append("\n=============================================================================================================");
+
+ appendMetrics(computedMetrics.values(), sb, 0);
+
+ // Append total duration
+ sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
+ ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
+
+ return sb.toString();
+ }
+
+ private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
+ // Append each StepMetric's row. indexToLabelMap values are ordered by index.
+ for (Metrics m : metrics) {
+ String rowName = m.getName();
+
+ // Handle indentation
+ for (int ii = 0; ii < indent; ii++) {
+ rowName = " " + rowName;
+ }
+ // Abbreviate if necessary
+ rowName = StringUtils.abbreviate(rowName, 50);
+
+ // Grab the values
+ final Long itemCount = m.getCount(ELEMENT_COUNT_ID);
+ final Long traverserCount = m.getCount(TRAVERSER_COUNT_ID);
+ Double percentDur = (Double) m.getAnnotation(PERCENT_DURATION_KEY);
+
+ // Build the row string
+
+ sb.append(String.format("%n%-50s", rowName));
+
+ if (itemCount != null) {
+ sb.append(String.format(" %21d", itemCount));
+ } else {
+ sb.append(String.format(" %21s", ""));
+ }
+
+ if (traverserCount != null) {
+ sb.append(String.format(" %11d", traverserCount));
+ } else {
+ sb.append(String.format(" %11s", ""));
+ }
+
+ sb.append(String.format(" %15.3f", m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
+
+ if (percentDur != null) {
+ sb.append(String.format(" %8.2f", percentDur));
+ }
+
+ appendMetrics(m.getNested(), sb, indent + 1);
+ }
+ }
+
+ private void computeTotals() {
+ // Create temp list of ordered metrics
+ List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
+ for (String label : indexToLabelMap.values()) {
+ // The indexToLabelMap is sorted by index (key)
+ tempMetrics.add(metrics.get(label).clone());
+ }
+
+ // Calculate total duration
+ this.totalStepDuration = 0;
+ tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
+
+ // Assign %'s
+ tempMetrics.forEach(m -> {
+ double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
+ m.setAnnotation(PERCENT_DURATION_KEY, dur);
+ });
+
+ // Store immutable instances of the calculated metrics
+ computedMetrics = new LinkedHashMap<>(metrics.size());
+ tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
+ }
+
+ public static DefaultTraversalMetrics merge(final Iterator<DefaultTraversalMetrics> toMerge) {
+ final DefaultTraversalMetrics newTraversalMetrics = new DefaultTraversalMetrics();
+
+ // iterate the incoming TraversalMetrics
+ toMerge.forEachRemaining(inTraversalMetrics -> {
+ // aggregate the internal Metrics
+ inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
+
+ MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
+ if (null == aggregateMetrics) {
+ // need to create a Metrics to aggregate into
+ aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
+
+ newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
+ // Set the index of the Metrics
+ for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
+ if (metricsId.equals(entry.getValue())) {
+ newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
+ break;
+ }
+ }
+ }
+ aggregateMetrics.aggregate(toAggregate);
+ });
+ });
+ return newTraversalMetrics;
+ }
+
+ public void setMetrics(Traversal.Admin traversal, boolean onGraphComputer) {
+ addTopLevelMetrics(traversal);
+ handleNestedTraversals(traversal, null, onGraphComputer);
+ computeTotals();
+ }
+
+ private void addTopLevelMetrics(Traversal.Admin traversal) {
+ final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
+ for (int ii = 0; ii < profileSteps.size(); ii++) {
+ // The index is necessary to ensure that step order is preserved after a merge.
+ final MutableMetrics stepMetrics = profileSteps.get(ii).getMetrics();
+ this.indexToLabelMap.put(ii, stepMetrics.getId());
+ this.metrics.put(stepMetrics.getId(), stepMetrics);
+ }
+ }
+
+ private void handleNestedTraversals(Traversal.Admin traversal, MutableMetrics parentMetrics, boolean onGraphComputer) {
+ long prevDur = 0;
+ for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
+ Step step = (Step) traversal.getSteps().get(ii);
+ if (step instanceof ProfileStep) {
+ final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
+ if (!onGraphComputer) {
+ // save duration before we adjust
+ long tempDur = metrics.getDuration(TimeUnit.NANOSECONDS);
+ // adjust duration
+ metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
+ prevDur = tempDur;
+ }
+ if (parentMetrics != null) {
+ parentMetrics.addNested(metrics);
+ }
+ } else if (step instanceof TraversalParent) {
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+ handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+ }
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+ handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+ }
+ }
+ }
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
deleted file mode 100644
index bb7d50c..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DependantMutableMetrics.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.util;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * This Metrics class handles a metrics chain in which durations are "double counted" by upstream metrics. Durations are
- * corrected upon retrieval by subtracting upstream durations.
- *
- * @author Bob Briody (http://bobbriody.com)
- */
-public class DependantMutableMetrics extends MutableMetrics {
- private long prevDur = 0L;
- private DependantMutableMetrics upStreamMetrics;
-
- private DependantMutableMetrics() {
- // necessary for gryo serialization
- super();
- }
-
- public DependantMutableMetrics(final String id, final String name, final DependantMutableMetrics upStreamMetrics) {
- super(id, name);
- this.upStreamMetrics = upStreamMetrics;
- }
-
- /**
- * Returns the actual duration taken by this Metrics by subtracting the duration taken by the upstream Step, if
- * one exists.
- */
- @Override
- public long getDuration(final TimeUnit unit) {
- if (upStreamMetrics == null){
- return unit.convert(super.durationNs, unit);
- } else {
- // upStreamMetrics exists. Subtract that duration since it is time not spent in this step.
- return unit.convert(super.durationNs - upStreamMetrics.durationNs, unit);
- }
- }
-
- @Override
- protected void copyMembers(final ImmutableMetrics clone) {
- super.copyMembers(clone);
- clone.durationNs = this.getDuration(TimeUnit.NANOSECONDS);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
index 72c1076..a952c65 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/MutableMetrics.java
@@ -42,7 +42,6 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
this.name = name;
}
-
public void addNested(MutableMetrics metrics) {
this.nested.put(metrics.getId(), metrics);
}
@@ -178,4 +177,9 @@ public class MutableMetrics extends ImmutableMetrics implements Cloneable {
return clone;
}
+ public void finish(long bulk) {
+ stop();
+ incrementCount(TraversalMetrics.TRAVERSER_COUNT_ID, 1);
+ incrementCount(TraversalMetrics.ELEMENT_COUNT_ID, bulk);
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
deleted file mode 100644
index 93d6ec7..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/StandardTraversalMetrics.java
+++ /dev/null
@@ -1,226 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.tinkerpop.gremlin.process.traversal.util;
-
-import org.apache.commons.lang.StringUtils;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-
-import java.io.Serializable;
-import java.util.*;
-import java.util.concurrent.TimeUnit;
-
-/**
- * @author Bob Briody (http://bobbriody.com)
- */
-public final class StandardTraversalMetrics implements TraversalMetrics, Serializable {
- // toString() specific headers
- private static final String[] HEADERS = {"Step", "Count", "Traversers", "Time (ms)", "% Dur"};
-
- private boolean dirty = true;
- private final Map<String, MutableMetrics> metrics = new HashMap<>();
- private final Map<String, MutableMetrics> allMetrics = new HashMap<>();
- private final TreeMap<Integer, String> indexToLabelMap = new TreeMap<>();
-
- /*
- The following are computed values upon the completion of profiling in order to report the results back to the user
- */
- private long totalStepDuration;
- private Map<String, ImmutableMetrics> computedMetrics;
-
- public StandardTraversalMetrics() {
- }
-
- public void start(final String metricsId) {
- dirty = true;
- allMetrics.get(metricsId).start();
- }
-
- public void stop(final String metricsId) {
- dirty = true;
- allMetrics.get(metricsId).stop();
- }
-
- public boolean wasInitialized() {
- return !this.allMetrics.isEmpty();
- }
-
- public void finish(final String metricsId, final long bulk) {
- dirty = true;
- final MutableMetrics metrics = allMetrics.get(metricsId);
- metrics.stop();
- metrics.incrementCount(TRAVERSER_COUNT_ID, 1);
- metrics.incrementCount(ELEMENT_COUNT_ID, bulk);
- }
-
- @Override
- public long getDuration(final TimeUnit unit) {
- computeTotals();
- return unit.convert(totalStepDuration, MutableMetrics.SOURCE_UNIT);
- }
-
- @Override
- public Metrics getMetrics(final int index) {
- computeTotals();
- // adjust index to account for the injected profile steps
- return (Metrics) computedMetrics.get(indexToLabelMap.get(index));
- }
-
- @Override
- public Metrics getMetrics(final String id) {
- computeTotals();
- return computedMetrics.get(id);
- }
-
- @Override
- public Collection<ImmutableMetrics> getMetrics() {
- computeTotals();
- return computedMetrics.values();
- }
-
- @Override
- public String toString() {
- computeTotals();
-
- // Build a pretty table of metrics data.
-
- // Append headers
- final StringBuilder sb = new StringBuilder("Traversal Metrics\n")
- .append(String.format("%-50s %21s %11s %15s %8s", HEADERS));
-
- sb.append("\n=============================================================================================================");
-
- appendMetrics(computedMetrics.values(), sb, 0);
-
- // Append total duration
- sb.append(String.format("%n%50s %21s %11s %15.3f %8s",
- ">TOTAL", "-", "-", getDuration(TimeUnit.MICROSECONDS) / 1000.0, "-"));
-
- return sb.toString();
- }
-
- private void appendMetrics(final Collection<? extends Metrics> metrics, final StringBuilder sb, final int indent) {
- // Append each StepMetric's row. indexToLabelMap values are ordered by index.
- for (Metrics m : metrics) {
- String rowName = m.getName();
-
- // Handle indentation
- for (int ii = 0; ii < indent; ii++) {
- rowName = " " + rowName;
- }
- // Abbreviate if necessary
- rowName = StringUtils.abbreviate(rowName, 50);
-
- // Grab the values
- final Long itemCount = m.getCount(ELEMENT_COUNT_ID);
- final Long traverserCount = m.getCount(TRAVERSER_COUNT_ID);
- Double percentDur = (Double) m.getAnnotation(PERCENT_DURATION_KEY);
-
- // Build the row string
-
- sb.append(String.format("%n%-50s", rowName));
-
- if (itemCount != null) {
- sb.append(String.format(" %21d", itemCount));
- } else {
- sb.append(String.format(" %21s", ""));
- }
-
- if (traverserCount != null) {
- sb.append(String.format(" %11d", traverserCount));
- } else {
- sb.append(String.format(" %11s", ""));
- }
-
- sb.append(String.format(" %15.3f", m.getDuration(TimeUnit.MICROSECONDS) / 1000.0));
-
- if (percentDur!=null){
- sb.append(String.format(" %8.2f", percentDur ));
- }
-
- appendMetrics(m.getNested(), sb, indent + 1);
- }
- }
-
- private void computeTotals() {
- if (!dirty) {
- // already good to go
- return;
- }
-
- // Create temp list of ordered metrics
- List<MutableMetrics> tempMetrics = new ArrayList<>(metrics.size());
- for (String label : indexToLabelMap.values()) {
- // The indexToLabelMap is sorted by index (key)
- tempMetrics.add(metrics.get(label).clone());
- }
-
- // Calculate total duration
- this.totalStepDuration = 0;
- tempMetrics.forEach(m -> this.totalStepDuration += m.getDuration(MutableMetrics.SOURCE_UNIT));
-
- // Assign %'s
- tempMetrics.forEach(m -> {
- double dur = m.getDuration(TimeUnit.NANOSECONDS) * 100.d / this.totalStepDuration;
- m.setAnnotation(PERCENT_DURATION_KEY, dur);
- });
-
- // Store immutable instances of the calculated metrics
- computedMetrics = new LinkedHashMap<>(metrics.size());
- tempMetrics.forEach(it -> computedMetrics.put(it.getId(), it.getImmutableClone()));
-
- dirty = false;
- }
-
- public static StandardTraversalMetrics merge(final Iterator<StandardTraversalMetrics> toMerge) {
- final StandardTraversalMetrics newTraversalMetrics = new StandardTraversalMetrics();
-
- // iterate the incoming TraversalMetrics
- toMerge.forEachRemaining(inTraversalMetrics -> {
- // aggregate the internal Metrics
- inTraversalMetrics.metrics.forEach((metricsId, toAggregate) -> {
-
- MutableMetrics aggregateMetrics = newTraversalMetrics.metrics.get(metricsId);
- if (null == aggregateMetrics) {
- // need to create a Metrics to aggregate into
- aggregateMetrics = new MutableMetrics(toAggregate.getId(), toAggregate.getName());
-
- newTraversalMetrics.metrics.put(metricsId, aggregateMetrics);
- // Set the index of the Metrics
- for (Map.Entry<Integer, String> entry : inTraversalMetrics.indexToLabelMap.entrySet()) {
- if (metricsId.equals(entry.getValue())) {
- newTraversalMetrics.indexToLabelMap.put(entry.getKey(), metricsId);
- break;
- }
- }
- }
- aggregateMetrics.aggregate(toAggregate);
- });
- });
- return newTraversalMetrics;
- }
-
- public void addMetrics(final MutableMetrics newMetrics, final String id, final int index, final boolean isTopLevel, final String profileStepId) {
- if (isTopLevel) {
- // The index is necessary to ensure that step order is preserved after a merge.
- indexToLabelMap.put(index, id);
- metrics.put(id, newMetrics);
- }
- allMetrics.put(profileStepId, newMetrics);
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index e73f32c..4420fa6 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
@@ -24,48 +24,20 @@ import org.apache.tinkerpop.gremlin.process.traversal.Contains;
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.*;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.*;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DependantMutableMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.ImmutableMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation;
-import org.apache.tinkerpop.gremlin.structure.Direction;
-import org.apache.tinkerpop.gremlin.structure.Edge;
-import org.apache.tinkerpop.gremlin.structure.Graph;
-import org.apache.tinkerpop.gremlin.structure.Property;
-import org.apache.tinkerpop.gremlin.structure.T;
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.structure.VertexProperty;
+import org.apache.tinkerpop.gremlin.structure.*;
import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
import org.apache.tinkerpop.gremlin.structure.io.Mapper;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
-import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
-import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge;
-import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
-import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty;
-import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
-import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.detached.*;
+import org.apache.tinkerpop.gremlin.structure.util.reference.*;
import org.apache.tinkerpop.gremlin.structure.util.star.StarGraph;
import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphGryoSerializer;
import org.apache.tinkerpop.shaded.kryo.ClassResolver;
@@ -81,38 +53,8 @@ import org.javatuples.Triplet;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.net.URI;
-import java.time.Duration;
-import java.time.Instant;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.time.MonthDay;
-import java.time.OffsetDateTime;
-import java.time.OffsetTime;
-import java.time.Period;
-import java.time.Year;
-import java.time.YearMonth;
-import java.time.ZoneOffset;
-import java.time.ZonedDateTime;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Currency;
-import java.util.Date;
-import java.util.EnumSet;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.TimeZone;
-import java.util.TreeMap;
-import java.util.TreeSet;
-import java.util.UUID;
+import java.time.*;
+import java.util.*;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.function.Function;
@@ -302,11 +244,10 @@ public final class GryoMapper implements Mapper<Kryo> {
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(BulkSet.class, null, 64));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MutableMetrics.class, null, 69));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ImmutableMetrics.class, null, 115));
- add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(StandardTraversalMetrics.class, null, 70));
+ add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(DefaultTraversalMetrics.class, null, 70));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MapMemory.class, null, 73));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MapReduce.NullObject.class, null, 74));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(AtomicLong.class, null, 79));
- add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(DependantMutableMetrics.class, null, 80));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Pair.class, kryo -> new PairSerializer(), 88));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TraversalExplanation.class, kryo -> new JavaSerializer(), 106));
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java
new file mode 100644
index 0000000..e46b668
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/DefaultTraversalMetricsSupplier.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.util.function;
+
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class DefaultTraversalMetricsSupplier implements Supplier<DefaultTraversalMetrics>, Serializable {
+
+ private static final DefaultTraversalMetricsSupplier INSTANCE = new DefaultTraversalMetricsSupplier();
+
+ private DefaultTraversalMetricsSupplier() {
+ }
+
+ @Override
+ public DefaultTraversalMetrics get() {
+ return new DefaultTraversalMetrics();
+ }
+
+ public static DefaultTraversalMetricsSupplier instance() {
+ return INSTANCE;
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/StandardTraversalMetricsSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/StandardTraversalMetricsSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/StandardTraversalMetricsSupplier.java
deleted file mode 100644
index 63c94fa..0000000
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/StandardTraversalMetricsSupplier.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements. See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership. The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License. You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied. See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.tinkerpop.gremlin.util.function;
-
-import org.apache.tinkerpop.gremlin.process.traversal.util.StandardTraversalMetrics;
-
-import java.io.Serializable;
-import java.util.function.Supplier;
-
-/**
- * @author Marko A. Rodriguez (http://markorodriguez.com)
- */
-public final class StandardTraversalMetricsSupplier implements Supplier<StandardTraversalMetrics>, Serializable {
-
- private static final StandardTraversalMetricsSupplier INSTANCE = new StandardTraversalMetricsSupplier();
-
- private StandardTraversalMetricsSupplier() {
- }
-
- @Override
- public StandardTraversalMetrics get() {
- return new StandardTraversalMetrics();
- }
-
- public static StandardTraversalMetricsSupplier instance() {
- return INSTANCE;
- }
-}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/e73bbc5d/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
index a899689..d8d281d 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
@@ -22,14 +22,10 @@ import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.P;
-import org.apache.tinkerpop.gremlin.process.traversal.Step;
-import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
-import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.*;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
@@ -48,9 +44,7 @@ import java.util.concurrent.TimeUnit;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.*;
/**
* @author Bob Briody (http://bobbriody.com)
@@ -97,7 +91,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
// Every other step should be a Profile step
List<Step> steps = traversal.asAdmin().getSteps();
for (int ii = 1; ii <= 6; ii += 2) {
- assertEquals("Every other Step should be a ProfileStep.", ProfileSideEffectStep.class, steps.get(ii).getClass());
+ assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
}
// Validate the last Metrics only, which must be consistent across vendors.
@@ -121,7 +115,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
// Every other step should be a Profile step
List<Step> steps = traversal.asAdmin().getSteps();
for (int ii = 1; ii < steps.size(); ii += 2) {
- assertEquals("Every other Step should be a ProfileStep.", ProfileSideEffectStep.class, steps.get(ii).getClass());
+ assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
}
// Validate the last Metrics only, which must be consistent across vendors.
@@ -254,7 +248,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
printTraversalForm(traversal);
traversal.iterate();
- assertEquals("There should be 6 steps in this traversal (counting injected profile steps).", 6, traversal.asAdmin().getSteps().size());
+ assertEquals("There should be 7 steps in this traversal (counting injected profile steps).", 7, traversal.asAdmin().getSteps().size());
TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
}
[08/12] incubator-tinkerpop git commit: Found a nasty bug in
ComputerVerificationStragegy where onGraphcomputer() was not being called
beyond the root traversal --- weird. EndSteps are not processed now by
ProfileStrategy. Nearly done -- need to get loca
Posted by ok...@apache.org.
Found a nasty bug in ComputerVerificationStragegy where onGraphcomputer() was not being called beyond the root traversal --- weird. EndSteps are not processed now by ProfileStrategy. Nearly done -- need to get local traversals in computer working (have an idea).
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/781a676c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/781a676c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/781a676c
Branch: refs/heads/master
Commit: 781a676ccd42bed1444e998051ebc8d8c1ff3bbd
Parents: 58615c0
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Mar 21 16:30:56 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Mar 21 16:30:56 2016 -0600
----------------------------------------------------------------------
.../traversal/step/util/ProfileStep.java | 17 +++--
.../strategy/finalization/ProfileStrategy.java | 6 ++
.../ComputerVerificationStrategy.java | 34 +++-------
.../traversal/util/DefaultTraversalMetrics.java | 67 +++++++-------------
.../process/traversal/step/map/ProfileTest.java | 12 ++--
.../structure/TinkerGraphPlayTest.java | 3 +-
6 files changed, 61 insertions(+), 78 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
index 840fac0..89191e0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
@@ -49,20 +49,20 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
public Traverser.Admin<S> next() {
Traverser.Admin<S> ret = null;
initializeIfNeeded();
- metrics.start();
+ this.metrics.start();
try {
ret = super.next();
return ret;
} finally {
if (ret != null) {
- metrics.finish(ret.bulk());
- if(this.onGraphComputer) {
+ this.metrics.finish(ret.bulk());
+ if (this.onGraphComputer) {
this.getTraversal().getSideEffects().add(this.getId(), metrics);
this.metrics = null;
}
} else {
- metrics.stop();
- if(this.onGraphComputer) {
+ this.metrics.stop();
+ if (this.onGraphComputer) {
this.getTraversal().getSideEffects().add(this.getId(), metrics);
this.metrics = null;
}
@@ -104,6 +104,13 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
this.onGraphComputer = true;
}
+ @Override
+ public ProfileStep<S> clone() {
+ final ProfileStep<S> clone = (ProfileStep<S>) super.clone();
+ clone.metrics = null;
+ return clone;
+ }
+
/////
public static class ProfileBiOperator implements BinaryOperator<MutableMetrics> {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index dd66e1c..d5e86b8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -21,7 +21,9 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -54,6 +56,10 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
// Get the original step
Step step = steps.get(ii * 2);
+ if (step instanceof ComputerAwareStep.EndStep || step instanceof RepeatStep.RepeatEndStep) {
+ continue;
+ }
+
// Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
if (step instanceof ProfileSideEffectStep) {
break;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index 8199f3a..6748cd9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -23,17 +23,19 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.Traversa
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
-import org.apache.tinkerpop.gremlin.process.traversal.step.*;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor;
+import org.apache.tinkerpop.gremlin.process.traversal.step.Scoping;
+import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -56,36 +58,20 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
private ComputerVerificationStrategy() {
}
- private static void onlyGlobalChildren(final Traversal.Admin<?, ?> traversal) {
- for (final Step step : traversal.getSteps()) {
- if (step instanceof GraphComputing)
- ((GraphComputing) step).onGraphComputer();
- if (step instanceof TraversalParent) {
- ((TraversalParent) step).getGlobalChildren().forEach(ComputerVerificationStrategy::onlyGlobalChildren);
- }
- }
- }
-
@Override
public void apply(final Traversal.Admin<?, ?> traversal) {
if (!TraversalHelper.onGraphComputer(traversal) || traversal.getParent().isLocalChild(traversal)) // only process global children as local children are standard semantics
return;
- Step<?, ?> endStep = traversal.getEndStep();
- while (endStep instanceof ComputerAwareStep.EndStep) {
- endStep = endStep.getPreviousStep();
- }
-
- if (traversal.getParent() instanceof TraversalVertexProgramStep) {
- if (traversal.getStartStep() instanceof GraphStep && traversal.getSteps().stream().filter(step -> step instanceof GraphStep).count() > 1)
- throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
-
- ComputerVerificationStrategy.onlyGlobalChildren(traversal);
+ if (traversal.getParent() instanceof TraversalVertexProgramStep &&
+ TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1) {
+ throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
}
for (final Step<?, ?> step : traversal.getSteps()) {
-
+ if (step instanceof GraphComputing)
+ ((GraphComputing) step).onGraphComputer();
// you can not traverse past the local star graph with localChildren (e.g. by()-modulators).
if (step instanceof TraversalParent) {
final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
index 740cec8..bfcd27f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -215,53 +215,34 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
long prevDur = 0;
for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
Step step = (Step) traversal.getSteps().get(ii);
- if (step instanceof ProfileStep) {
- final MutableMetrics metrics = onGraphComputer ?
- traversal.getSideEffects().get(step.getId()) :
- ((ProfileStep) step).getMetrics();
- if (!onGraphComputer && null != metrics) {
- // save duration before we adjust
- long tempDur = metrics.getDuration(TimeUnit.NANOSECONDS);
- // adjust duration
- metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
- prevDur = tempDur;
- }
- if (parentMetrics != null && null != metrics) {
- parentMetrics.addNested(metrics);
- }
- } else if (step instanceof TraversalParent) {
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
- handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
- }
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
- handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
- }
+ if (!(step instanceof ProfileStep)) {
+ continue;
}
- }
- }
- /* private void handleNestedTraversals(Traversal.Admin traversal, MutableMetrics parentMetrics, boolean onGraphComputer) {
- for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
- Step step = (Step) traversal.getSteps().get(ii);
- if (step instanceof ProfileStep) {
- if (onGraphComputer) {
- if (parentMetrics != null) {
- parentMetrics.addNested(traversal.getSideEffects().get(step.getId()));
- }
- } else {
- final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
- if (parentMetrics != null && null != metrics) {
- parentMetrics.addNested(metrics);
- }
- }
- } else if (step instanceof TraversalParent) {
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
- handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
+ final MutableMetrics metrics = onGraphComputer ?
+ traversal.getSideEffects().get(step.getId()) :
+ ((ProfileStep) step).getMetrics();
+
+ if (!onGraphComputer) {
+ // subtract upstream duration.
+ long durBeforeAdjustment = metrics.getDuration(TimeUnit.NANOSECONDS);
+ // adjust duration
+ metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
+ prevDur = durBeforeAdjustment;
+ }
+
+ if (parentMetrics != null) {
+ parentMetrics.addNested(metrics);
+ }
+
+ if (step.getPreviousStep() instanceof TraversalParent) {
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getLocalChildren()) {
+ handleNestedTraversals(t, metrics, false);
}
- for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
- handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getGlobalChildren()) {
+ handleNestedTraversals(t, metrics, onGraphComputer);
}
}
}
- }*/
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
index d0ce91c..4b0d6bf 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
@@ -21,10 +21,12 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
+import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
@@ -85,7 +87,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
*/
@Test
@LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_out_out_profile_simple() {
final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
printTraversalForm(traversal);
@@ -237,7 +239,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
printTraversalForm(traversal);
@@ -248,7 +250,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
printTraversalForm(traversal);
@@ -279,11 +281,11 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
assertTrue("Count should be greater than traversers.", vertexStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > vertexStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
assertTrue("Times should be positive.", vertexStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);
- final Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
+ /*final Metrics repeatEndStepNestedInRepeat = (Metrics) metrics.getNested().toArray()[1];
assertEquals(72, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
assertNotEquals(0, repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
assertTrue("Count should be greater than traversers.", repeatEndStepNestedInRepeat.getCount(TraversalMetrics.ELEMENT_COUNT_ID) > repeatEndStepNestedInRepeat.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
- assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);
+ assertTrue("Times should be positive.", repeatEndStepNestedInRepeat.getDuration(TimeUnit.MICROSECONDS) >= 0);*/
double totalPercentDuration = 0;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/781a676c/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index 4425e65..e19dff8 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -57,7 +57,8 @@ public class TinkerGraphPlayTest {
GraphTraversalSource g = graph.traversal().withComputer();//GraphTraversalSource.computer());
//System.out.println(g.V().outE("knows").identity().inV().count().is(P.eq(5)).explain());
//System.out.println(g.V().hasLabel("person").fold().order(Scope.local).by("age").toList());
- final Traversal<?,?> traversal = g.V().where(__.in("created").count().is(1l)).<String>values("name").profile("m");
+ System.out.println(g.V().repeat(out()).times(2).profile("m").explain());
+ final Traversal<?,?> traversal = g.V().repeat(out().union(__.<Vertex>identity().as("a"),out())).times(1).count().profile("m");
//System.out.println(traversal.asAdmin().clone().toString());
// final Traversal<?,?> clone = traversal.asAdmin().clone();
[10/12] incubator-tinkerpop git commit: EndSteps are 'ignored' in
OLAP profiling cause of push-based semantics. No worries,
just made the metrics toString() articulate that accordingly. This is an
@rjbriody gist hand over.
Posted by ok...@apache.org.
EndSteps are 'ignored' in OLAP profiling cause of push-based semantics. No worries, just made the metrics toString() articulate that accordingly. This is an @rjbriody gist hand over.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/20e9ed1e
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/20e9ed1e
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/20e9ed1e
Branch: refs/heads/master
Commit: 20e9ed1ef28da2c4cc3d190252391b7546369f72
Parents: 42ab8bd
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 09:48:29 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 09:48:29 2016 -0600
----------------------------------------------------------------------
.../computer/traversal/TraversalVertexProgram.java | 2 +-
.../strategy/finalization/ProfileStrategy.java | 6 +-----
.../gremlin/util/function/MutableMetricsSupplier.java | 12 +++++++++---
.../tinkergraph/structure/TinkerGraphPlayTest.java | 2 +-
4 files changed, 12 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index d26ef59..666a803 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -161,7 +161,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
}
// register profile steps (TODO: try to hide this)
for (final ProfileStep profileStep : TraversalHelper.getStepsOfAssignableClassRecursively(ProfileStep.class, this.traversal.get())) {
- this.traversal.get().getSideEffects().register(profileStep.getId(), new MutableMetricsSupplier(profileStep.getPreviousStep().getId(), profileStep.getPreviousStep().toString()), ProfileStep.ProfileBiOperator.instance());
+ this.traversal.get().getSideEffects().register(profileStep.getId(), new MutableMetricsSupplier(profileStep.getPreviousStep()), ProfileStep.ProfileBiOperator.instance());
}
// register TraversalVertexProgram specific memory compute keys
this.memoryComputeKeys.add(MemoryComputeKey.of(HALTED_TRAVERSERS, Operator.addAll, false, this.keepDistributedHaltedTraversers)); // only keep if it will be preserved
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index d5e86b8..995ee18 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -54,11 +54,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
final int numSteps = steps.size();
for (int ii = 0; ii < numSteps; ii++) {
// Get the original step
- Step step = steps.get(ii * 2);
-
- if (step instanceof ComputerAwareStep.EndStep || step instanceof RepeatStep.RepeatEndStep) {
- continue;
- }
+ final Step step = steps.get(ii * 2);
// Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
if (step instanceof ProfileSideEffectStep) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
index c83d21e..15e4420 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
@@ -19,6 +19,9 @@
package org.apache.tinkerpop.gremlin.util.function;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
import java.io.Serializable;
@@ -32,9 +35,12 @@ public final class MutableMetricsSupplier implements Supplier<MutableMetrics>, S
private final String stepId;
private final String stepString;
- public MutableMetricsSupplier(final String stepId, final String stepString) {
- this.stepId = stepId;
- this.stepString = stepString;
+ public MutableMetricsSupplier(final Step<?, ?> previousStep) {
+ this.stepId = previousStep.getId();
+ this.stepString =
+ previousStep instanceof RepeatStep.RepeatEndStep || previousStep instanceof ComputerAwareStep.EndStep ?
+ previousStep.toString() + " (profiling ignored)" :
+ previousStep.toString();
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/20e9ed1e/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index f0d77ab..be065c7 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -59,7 +59,7 @@ public class TinkerGraphPlayTest {
//System.out.println(g.V().outE("knows").identity().inV().count().is(P.eq(5)).explain());
//System.out.println(g.V().hasLabel("person").fold().order(Scope.local).by("age").toList());
//System.out.println(g.V().repeat(out()).times(2).profile("m").explain());
- final Traversal<?,?> traversal = g.V().both().hasLabel("person").order().by("age", Order.decr).values("name");
+ final Traversal<?,?> traversal = g.V().repeat(__.union(__.<Vertex>identity().as("a"),out())).times(2).profile();
//System.out.println(g.V().hasLabel("person").pageRank().by("rank").by(bothE()).values("rank").profile("m").explain());
//System.out.println(traversal.asAdmin().clone().toString());
// final Traversal<?,?> clone = traversal.asAdmin().clone();
[07/12] incubator-tinkerpop git commit: work on profile step on
GraphComputer. Need @rbriody to review and discuss.
Posted by ok...@apache.org.
work on profile step on GraphComputer. Need @rbriody to review and discuss.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/58615c04
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/58615c04
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/58615c04
Branch: refs/heads/master
Commit: 58615c04228b3508da5141ab5a6a1bf4f050ef9f
Parents: 73b2d42
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Mon Mar 21 12:36:00 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Mon Mar 21 12:36:00 2016 -0600
----------------------------------------------------------------------
.../process/computer/MemoryComputeKey.java | 2 +-
.../traversal/TraversalVertexProgram.java | 22 ++++++-
.../traversal/step/filter/DedupGlobalStep.java | 7 ++-
.../traversal/step/filter/RangeGlobalStep.java | 6 +-
.../traversal/step/filter/TailGlobalStep.java | 2 +-
.../traversal/step/map/OrderGlobalStep.java | 14 ++---
.../step/sideEffect/ProfileSideEffectStep.java | 16 ++---
.../step/util/CollectingBarrierStep.java | 3 +-
.../traversal/step/util/ProfileStep.java | 41 ++++++++++++-
.../step/util/SupplyingBarrierStep.java | 3 +-
.../ComputerVerificationStrategy.java | 2 +-
.../traversal/util/DefaultTraversalMetrics.java | 61 ++++++++++++++++----
.../process/traversal/step/map/ProfileTest.java | 35 ++++++-----
.../structure/TinkerGraphPlayTest.java | 15 ++---
14 files changed, 171 insertions(+), 58 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
index 61e2fd8..94ca675 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/MemoryComputeKey.java
@@ -73,7 +73,7 @@ public final class MemoryComputeKey<A> implements Serializable {
return object instanceof MemoryComputeKey && ((MemoryComputeKey) object).key.equals(this.key);
}
- public static <A> MemoryComputeKey of(final String key, final BinaryOperator<A> reducer, final boolean isBroadcast, final boolean isTransient) {
+ public static <A> MemoryComputeKey<A> of(final String key, final BinaryOperator<A> reducer, final boolean isBroadcast, final boolean isTransient) {
return new MemoryComputeKey<>(key, reducer, isBroadcast, isTransient);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index aaac518..fbe5592 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -54,12 +54,15 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyKeyStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyMapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.PropertyValueStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.SackStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.VertexProgramStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.PureTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -141,6 +144,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
// if results will be serialized out, don't save halted traversers across the cluster
this.keepDistributedHaltedTraversers =
!(this.traversal.get().getParent().asStep().getNextStep() instanceof ComputerResultStep || // if its just going to stream it out, don't distribute
+ this.traversal.get().getParent().asStep().getNextStep().getNextStep() instanceof ComputerResultStep ||
this.traversal.get().getParent().asStep().getNextStep() instanceof EmptyStep); // same as above, but if using TraversalVertexProgramStep directly
// register traversal side-effects in memory
final TraversalSideEffects sideEffects = ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).getSideEffects();
@@ -155,6 +159,11 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
for (final MemoryComputing<?> memoryComputing : TraversalHelper.getStepsOfAssignableClassRecursively(MemoryComputing.class, this.traversal.get())) {
this.memoryComputeKeys.add(memoryComputing.getMemoryComputeKey());
}
+ // register profile steps
+ for (final ProfileStep profileStep : TraversalHelper.getStepsOfAssignableClassRecursively(ProfileStep.class, this.traversal.get())) {
+ this.traversal.get().getSideEffects().register(profileStep.getId(), () -> new MutableMetrics(profileStep.getPreviousStep().getId(), profileStep.getPreviousStep().toString()), ProfileStep.ProfileBiOperator.instance());
+
+ }
// register TraversalVertexProgram specific memory compute keys
this.memoryComputeKeys.add(MemoryComputeKey.of(HALTED_TRAVERSERS, Operator.addAll, false, this.keepDistributedHaltedTraversers)); // only keep if it will be preserved
this.memoryComputeKeys.add(MemoryComputeKey.of(ACTIVE_TRAVERSERS, Operator.addAll, true, true));
@@ -170,6 +179,8 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
@Override
public void setup(final Memory memory) {
+ // memory is distributed
+ ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
memory.set(VOTE_TO_HALT, true);
memory.set(HALTED_TRAVERSERS, new TraverserSet<>());
memory.set(ACTIVE_TRAVERSERS, new TraverserSet<>());
@@ -177,7 +188,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
memory.set(COMPLETED_BARRIERS, new HashSet<>());
final TraversalSideEffects sideEffects = ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).getSideEffects();
sideEffects.keys().forEach(key -> memory.set(key, sideEffects.get(key)));
- ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
+
}
@Override
@@ -187,7 +198,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
@Override
public void execute(final Vertex vertex, final Messenger<TraverserSet<Object>> messenger, final Memory memory) {
- // back the traversal side-effects by the global memory
+ // memory is distributed
((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, true);
// if a barrier was completed in another worker, it is also completed here (ensure distributed barries are synchronized)
final Set<String> completedBarriers = memory.get(COMPLETED_BARRIERS);
@@ -235,10 +246,11 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
@Override
public boolean terminate(final Memory memory) {
+ // memory is not distributed
+ ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
final boolean voteToHalt = memory.<Boolean>get(VOTE_TO_HALT);
memory.set(VOTE_TO_HALT, true);
memory.set(ACTIVE_TRAVERSERS, new TraverserSet<>());
- // put all side-effect memory into traversal side-effects
if (voteToHalt) {
final Set<String> mutatedMemoryKeys = memory.get(MUTATED_MEMORY_KEYS);
memory.set(MUTATED_MEMORY_KEYS, new HashSet<>());
@@ -272,6 +284,10 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
}
// the result of a TraversalVertexProgram are the halted traversers
memory.set(HALTED_TRAVERSERS, haltedTraversers);
+ // finalize profile side-effect steps.
+ for (final ProfileSideEffectStep profileStep : TraversalHelper.getStepsOfAssignableClassRecursively(ProfileSideEffectStep.class, this.traversal.get())) {
+ this.traversal.get().getSideEffects().set(profileStep.getSideEffectKey(), profileStep.generateFinalResult(this.traversal.get().getSideEffects().get(profileStep.getSideEffectKey())));
+ }
return true;
}
} else {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
index 649380e..546d24e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DedupGlobalStep.java
@@ -43,6 +43,7 @@ import java.util.HashSet;
import java.util.List;
import java.util.NoSuchElementException;
import java.util.Set;
+import java.util.function.BinaryOperator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -120,7 +121,9 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Traversal
@Override
public Set<TraverserRequirement> getRequirements() {
- return this.dedupLabels == null ? this.getSelfAndChildRequirements(TraverserRequirement.BULK) : this.getSelfAndChildRequirements(TraverserRequirement.LABELED_PATH, TraverserRequirement.BULK);
+ return this.dedupLabels == null ?
+ this.getSelfAndChildRequirements(TraverserRequirement.BULK) :
+ this.getSelfAndChildRequirements(TraverserRequirement.LABELED_PATH, TraverserRequirement.BULK);
}
@Override
@@ -167,7 +170,7 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Traversal
@Override
public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
- return MemoryComputeKey.of(this.getId(), Operator.addAll, false, true);
+ return MemoryComputeKey.of(this.getId(), (BinaryOperator) Operator.addAll, false, true);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
index 7576cc1..9458ca9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -135,7 +135,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
@Override
public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
- return MemoryComputeKey.of(this.getId(), new RangeBiOperator(this.high), false, true);
+ return MemoryComputeKey.of(this.getId(), new RangeBiOperator<>(this.high), false, true);
}
@Override
@@ -174,7 +174,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
////////////////
- public static final class RangeBiOperator implements BinaryOperator<TraverserSet>, Serializable {
+ public static final class RangeBiOperator<S> implements BinaryOperator<TraverserSet<S>>, Serializable {
private final long highRange;
@@ -187,7 +187,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> implements Ranging,
}
@Override
- public TraverserSet apply(final TraverserSet mutatingSeed, final TraverserSet set) {
+ public TraverserSet<S> apply(final TraverserSet<S> mutatingSeed, final TraverserSet<S> set) {
if (mutatingSeed.size() < this.highRange)
mutatingSeed.addAll(set);
return mutatingSeed;
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
index 9d19cb9..096151d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java
@@ -126,7 +126,7 @@ public final class TailGlobalStep<S> extends AbstractStep<S, S> implements Bypas
@Override
public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
- return MemoryComputeKey.of(this.getId(), new RangeGlobalStep.RangeBiOperator(this.limit), false, true);
+ return MemoryComputeKey.of(this.getId(), new RangeGlobalStep.RangeBiOperator<>(this.limit), false, true);
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
index cfec540..1daa31a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/OrderGlobalStep.java
@@ -138,13 +138,13 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
@Override
public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
if (null == this.chainedComparator)
- this.chainedComparator = new ChainedComparator(true, this.comparators);
- return MemoryComputeKey.of(this.getId(), new OrderBiOperator(this.chainedComparator, this.limit), false, true);
+ this.chainedComparator = new ChainedComparator<>(true, this.comparators);
+ return MemoryComputeKey.of(this.getId(), new OrderBiOperator<>(this.chainedComparator, this.limit), false, true);
}
////////////////
- public static final class OrderBiOperator implements BinaryOperator<TraverserSet>, Serializable {
+ public static final class OrderBiOperator<S> implements BinaryOperator<TraverserSet<S>>, Serializable {
private ChainedComparator chainedComparator;
private long limit;
@@ -153,13 +153,13 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
// for serializers that need a no-arg constructor
}
- public OrderBiOperator(final ChainedComparator chainedComparator, final long limit) {
+ public OrderBiOperator(final ChainedComparator<S,?> chainedComparator, final long limit) {
this.chainedComparator = chainedComparator;
this.limit = limit;
}
@Override
- public TraverserSet apply(final TraverserSet setA, final TraverserSet setB) {
+ public TraverserSet<S> apply(final TraverserSet<S> setA, final TraverserSet<S> setB) {
setA.addAll(setB);
if (Long.MAX_VALUE != this.limit && setA.bulkSize() > this.limit) {
if (this.chainedComparator.isShuffle())
@@ -167,9 +167,9 @@ public final class OrderGlobalStep<S, C extends Comparable> extends CollectingBa
else
setA.sort(this.chainedComparator);
long counter = 0l;
- final Iterator<Traverser.Admin> traversers = setA.iterator();
+ final Iterator<Traverser.Admin<S>> traversers = setA.iterator();
while (traversers.hasNext()) {
- final Traverser.Admin traverser = traversers.next();
+ final Traverser.Admin<S> traverser = traversers.next();
if (counter > this.limit)
traversers.remove();
counter = counter + traverser.bulk();
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
index 7a9523e..e2cf947 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
@@ -60,8 +60,8 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
ret = super.next();
return ret;
} finally {
- if (ret == null) {
- finalizeMetrics();
+ if (!this.onGraphComputer && ret == null) {
+ ((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
}
}
}
@@ -69,15 +69,17 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
@Override
public boolean hasNext() {
boolean ret = super.hasNext();
- if (!ret) {
- finalizeMetrics();
+ if (!this.onGraphComputer && !ret) {
+ ((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
}
return ret;
}
- private void finalizeMetrics() {
- final DefaultTraversalMetrics tm = this.getTraversal().getSideEffects().get(this.sideEffectKey);
- tm.setMetrics(traversal, onGraphComputer);
+ @Override
+ public DefaultTraversalMetrics generateFinalResult(final DefaultTraversalMetrics tm) {
+ if (this.onGraphComputer)
+ tm.setMetrics(this.getTraversal(), true);
+ return tm;
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
index f3bd457..f9c85a2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/CollectingBarrierStep.java
@@ -32,6 +32,7 @@ import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
import java.util.Collections;
import java.util.NoSuchElementException;
import java.util.Set;
+import java.util.function.BinaryOperator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -135,6 +136,6 @@ public abstract class CollectingBarrierStep<S> extends AbstractStep<S, S> implem
@Override
public MemoryComputeKey<TraverserSet<S>> getMemoryComputeKey() {
- return MemoryComputeKey.of(this.getId(), Operator.addAll, false, true);
+ return MemoryComputeKey.of(this.getId(), (BinaryOperator) Operator.addAll, false, true);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
index 26ba878..840fac0 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
@@ -18,19 +18,24 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.util;
+import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
+import org.apache.tinkerpop.gremlin.process.traversal.step.MemoryComputing;
import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
import java.util.NoSuchElementException;
+import java.util.function.BinaryOperator;
/**
* @author Bob Briody (http://bobbriody.com)
*/
-public final class ProfileStep<S> extends AbstractStep<S, S> {
+public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryComputing<MutableMetrics>, GraphComputing {
private MutableMetrics metrics;
+ private boolean onGraphComputer = false;
public ProfileStep(final Traversal.Admin traversal) {
super(traversal);
@@ -51,8 +56,16 @@ public final class ProfileStep<S> extends AbstractStep<S, S> {
} finally {
if (ret != null) {
metrics.finish(ret.bulk());
+ if(this.onGraphComputer) {
+ this.getTraversal().getSideEffects().add(this.getId(), metrics);
+ this.metrics = null;
+ }
} else {
metrics.stop();
+ if(this.onGraphComputer) {
+ this.getTraversal().getSideEffects().add(this.getId(), metrics);
+ this.metrics = null;
+ }
}
}
}
@@ -81,4 +94,30 @@ public final class ProfileStep<S> extends AbstractStep<S, S> {
}
}
+ @Override
+ public MemoryComputeKey<MutableMetrics> getMemoryComputeKey() {
+ return MemoryComputeKey.of(this.getId(), ProfileBiOperator.instance(), false, true);
+ }
+
+ @Override
+ public void onGraphComputer() {
+ this.onGraphComputer = true;
+ }
+
+ /////
+
+ public static class ProfileBiOperator implements BinaryOperator<MutableMetrics> {
+
+ private static final ProfileBiOperator INSTANCE = new ProfileBiOperator();
+
+ @Override
+ public MutableMetrics apply(final MutableMetrics metrics, final MutableMetrics metrics2) {
+ metrics.aggregate(metrics2);
+ return metrics;
+ }
+
+ public static final ProfileBiOperator instance() {
+ return INSTANCE;
+ }
+ }
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
index 9cccb67..51ae06d 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/SupplyingBarrierStep.java
@@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementExce
import java.util.Iterator;
import java.util.NoSuchElementException;
+import java.util.function.BinaryOperator;
/**
* @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -107,6 +108,6 @@ public abstract class SupplyingBarrierStep<S, E> extends AbstractStep<S, E> impl
@Override
public MemoryComputeKey<Boolean> getMemoryComputeKey() {
- return MemoryComputeKey.of(this.getId(), Operator.and, false, true);
+ return MemoryComputeKey.of(this.getId(), (BinaryOperator) Operator.and, false, true);
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index 85ce73b..8199f3a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -50,7 +50,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
private static final Set<Class<?>> UNSUPPORTED_STEPS = new HashSet<>(Arrays.asList(
- InjectStep.class, Mutating.class, SubgraphStep.class, ProfileStep.class, ProfileSideEffectStep.class, ComputerResultStep.class
+ InjectStep.class, Mutating.class, SubgraphStep.class, ComputerResultStep.class
));
private ComputerVerificationStrategy() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
index a2d2812..740cec8 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -25,7 +25,14 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import java.io.Serializable;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
/**
@@ -182,18 +189,25 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
}
public void setMetrics(Traversal.Admin traversal, boolean onGraphComputer) {
- addTopLevelMetrics(traversal);
+ addTopLevelMetrics(traversal, onGraphComputer);
handleNestedTraversals(traversal, null, onGraphComputer);
computeTotals();
}
- private void addTopLevelMetrics(Traversal.Admin traversal) {
+ private void addTopLevelMetrics(Traversal.Admin traversal, final boolean onGraphComputer) {
final List<ProfileStep> profileSteps = TraversalHelper.getStepsOfClass(ProfileStep.class, traversal);
for (int ii = 0; ii < profileSteps.size(); ii++) {
// The index is necessary to ensure that step order is preserved after a merge.
- final MutableMetrics stepMetrics = profileSteps.get(ii).getMetrics();
- this.indexToLabelMap.put(ii, stepMetrics.getId());
- this.metrics.put(stepMetrics.getId(), stepMetrics);
+ final ProfileStep step = profileSteps.get(ii);
+ if (onGraphComputer) {
+ final MutableMetrics stepMetrics = traversal.getSideEffects().get(step.getId());
+ this.indexToLabelMap.put(ii, stepMetrics.getId());
+ this.metrics.put(stepMetrics.getId(), stepMetrics);
+ } else {
+ final MutableMetrics stepMetrics = step.getMetrics();
+ this.indexToLabelMap.put(ii, stepMetrics.getId());
+ this.metrics.put(stepMetrics.getId(), stepMetrics);
+ }
}
}
@@ -202,20 +216,22 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
Step step = (Step) traversal.getSteps().get(ii);
if (step instanceof ProfileStep) {
- final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
- if (!onGraphComputer) {
+ final MutableMetrics metrics = onGraphComputer ?
+ traversal.getSideEffects().get(step.getId()) :
+ ((ProfileStep) step).getMetrics();
+ if (!onGraphComputer && null != metrics) {
// save duration before we adjust
long tempDur = metrics.getDuration(TimeUnit.NANOSECONDS);
// adjust duration
metrics.setDuration(metrics.getDuration(TimeUnit.NANOSECONDS) - prevDur, TimeUnit.NANOSECONDS);
prevDur = tempDur;
}
- if (parentMetrics != null) {
+ if (parentMetrics != null && null != metrics) {
parentMetrics.addNested(metrics);
}
} else if (step instanceof TraversalParent) {
for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
- handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+ handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
}
for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
@@ -223,4 +239,29 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
}
}
}
+
+ /* private void handleNestedTraversals(Traversal.Admin traversal, MutableMetrics parentMetrics, boolean onGraphComputer) {
+ for (int ii = 0; ii < traversal.getSteps().size(); ii++) {
+ Step step = (Step) traversal.getSteps().get(ii);
+ if (step instanceof ProfileStep) {
+ if (onGraphComputer) {
+ if (parentMetrics != null) {
+ parentMetrics.addNested(traversal.getSideEffects().get(step.getId()));
+ }
+ } else {
+ final MutableMetrics metrics = ((ProfileStep) step).getMetrics();
+ if (parentMetrics != null && null != metrics) {
+ parentMetrics.addNested(metrics);
+ }
+ }
+ } else if (step instanceof TraversalParent) {
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getLocalChildren()) {
+ handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), false);
+ }
+ for (Traversal.Admin<?, ?> t : ((TraversalParent) step).getGlobalChildren()) {
+ handleNestedTraversals(t, ((ProfileStep) step.getNextStep()).getMetrics(), onGraphComputer);
+ }
+ }
+ }
+ }*/
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
index d8d281d..d0ce91c 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
@@ -21,8 +21,11 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
-import org.apache.tinkerpop.gremlin.process.IgnoreEngine;
-import org.apache.tinkerpop.gremlin.process.traversal.*;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Step;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
@@ -44,7 +47,9 @@ import java.util.concurrent.TimeUnit;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL;
import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
/**
* @author Bob Briody (http://bobbriody.com)
@@ -80,7 +85,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
*/
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_out_out_profile_simple() {
final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
printTraversalForm(traversal);
@@ -102,7 +107,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_out_out_profile_simpleXmetrics_keyX() {
final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
printTraversalForm(traversal);
@@ -232,7 +237,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
printTraversalForm(traversal);
@@ -243,7 +248,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
printTraversalForm(traversal);
@@ -290,7 +295,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_repeat_both_modern_profile() {
final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_repeatXbothX_timesX3X_profile();
printTraversalForm(traversal);
@@ -301,7 +306,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void g_V_repeat_both_modern_profileXmetrics_keyX() {
final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
printTraversalForm(traversal);
@@ -382,7 +387,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void testProfileStrategyCallback() {
final Traversal<Vertex, TraversalMetrics> t = get_g_V_out_out_profile();
MockStep mockStep = new MockStep(t.asAdmin());
@@ -390,14 +395,14 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
TraversalMetrics traversalMetrics = t.next();
assertTrue(mockStep.callbackCalled);
- if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
+ if (!onGraphComputer(t.asAdmin())) {
assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
}
}
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void testProfileStrategyCallbackSideEffect() {
final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetrics_keyX();
MockStep mockStep = new MockStep(t.asAdmin());
@@ -405,7 +410,7 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
t.iterate();
assertTrue(mockStep.callbackCalled);
- if (!TraversalHelper.onGraphComputer(t.asAdmin())) {
+ if (!onGraphComputer(t.asAdmin())) {
final TraversalMetrics traversalMetrics = t.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
assertEquals(100, traversalMetrics.getMetrics(3).getCount("bogusCount").longValue());
}
@@ -427,6 +432,10 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
traversal.iterate();
}
+ private static boolean onGraphComputer(final Traversal.Admin<?, ?> traversal) {
+ return !TraversalHelper.getStepsOfClass(TraversalVertexProgramStep.class, TraversalHelper.getRootTraversal(traversal)).isEmpty();
+ }
+
/**
* Traversals
*/
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/58615c04/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index 6dbedc2..4425e65 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -57,13 +57,14 @@ public class TinkerGraphPlayTest {
GraphTraversalSource g = graph.traversal().withComputer();//GraphTraversalSource.computer());
//System.out.println(g.V().outE("knows").identity().inV().count().is(P.eq(5)).explain());
//System.out.println(g.V().hasLabel("person").fold().order(Scope.local).by("age").toList());
- final Traversal<?,?> traversal = g.V().out("created").group("m").by(T.label).pageRank(1.0).by("pageRank").by(__.inE()).times(1).in("created").group("m").by("pageRank").cap("m");
-
- System.out.println(traversal.asAdmin().clone().toString());
- final Traversal<?,?> clone = traversal.asAdmin().clone();
- clone.asAdmin().applyStrategies();
- System.out.println(clone);
- System.out.println(traversal.asAdmin().clone().toList());
+ final Traversal<?,?> traversal = g.V().where(__.in("created").count().is(1l)).<String>values("name").profile("m");
+
+ //System.out.println(traversal.asAdmin().clone().toString());
+ // final Traversal<?,?> clone = traversal.asAdmin().clone();
+ // clone.asAdmin().applyStrategies();
+ // System.out.println(clone);
+ System.out.println(traversal.asAdmin().toList());
+ System.out.println(traversal.asAdmin().getSideEffects().get("m") + " ");
//System.out.println(g.V().pageRank().order().by(PageRankVertexProgram.PAGE_RANK).valueMap().toList());
}
[06/12] incubator-tinkerpop git commit: merge master
Posted by ok...@apache.org.
merge master
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/73b2d42a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/73b2d42a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/73b2d42a
Branch: refs/heads/master
Commit: 73b2d42a5d0ebe9091fb300db9e5ca01206f4e45
Parents: 5b6acfc 11a7173
Author: rjbriody <bo...@datastax.com>
Authored: Mon Mar 21 09:24:37 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Mon Mar 21 09:24:37 2016 -0400
----------------------------------------------------------------------
CHANGELOG.asciidoc | 21 +-
docs/src/dev/provider/index.asciidoc | 20 +
.../src/reference/gremlin-applications.asciidoc | 81 +
.../reference/implementations-hadoop.asciidoc | 79 +-
docs/src/reference/the-graphcomputer.asciidoc | 24 +-
docs/src/reference/the-traversal.asciidoc | 2 +-
.../tutorials/getting-started/index.asciidoc | 4 +-
.../upgrade/release-3.2.x-incubating.asciidoc | 113 +-
docs/static/images/nine-inch-gremlins.png | Bin 0 -> 160571 bytes
docs/static/images/remote-graph.png | Bin 0 -> 19299 bytes
docs/static/images/tinkerpop3.graffle | 31929 ++++++++++++++++-
giraph-gremlin/pom.xml | 12 +-
.../process/computer/GiraphGraphComputer.java | 8 +-
.../structure/io/GiraphVertexOutputFormat.java | 4 +-
.../giraph/structure/io/GiraphVertexWriter.java | 2 +-
gremlin-console/conf/remote-graph.properties | 34 +
.../groovy/plugin/DriverGremlinPlugin.java | 2 +
gremlin-console/src/main/static/LICENSE | 2 +-
.../groovy/plugin/DriverGremlinPluginTest.java | 9 -
.../step/map/PageRankVertexProgramStep.java | 5 +
.../step/map/PeerPressureVertexProgramStep.java | 5 +
.../step/map/TraversalVertexProgramStep.java | 5 +
.../process/remote/RemoteConnection.java | 34 +
.../remote/RemoteConnectionException.java | 41 +
.../gremlin/process/remote/RemoteGraph.java | 232 +
.../remote/traversal/step/map/RemoteStep.java | 77 +
.../traversal/strategy/RemoteStrategy.java | 86 +
.../traversal/step/map/AddVertexStartStep.java | 1 -
.../process/traversal/step/map/GraphStep.java | 33 +-
.../process/traversal/step/map/GroupStep.java | 4 +-
.../process/traversal/util/PureTraversal.java | 10 +
.../tinkerpop/gremlin/structure/io/Storage.java | 20 +-
.../gremlin/structure/io/gryo/GryoMapper.java | 54 +-
.../tinkerpop/gremlin/driver/Channelizer.java | 2 +-
.../apache/tinkerpop/gremlin/driver/Client.java | 339 +-
.../tinkerpop/gremlin/driver/Cluster.java | 30 +-
.../tinkerpop/gremlin/driver/Handler.java | 22 +-
.../tinkerpop/gremlin/driver/ResultQueue.java | 11 +-
.../tinkerpop/gremlin/driver/Settings.java | 107 +
.../apache/tinkerpop/gremlin/driver/Tokens.java | 1 +
.../driver/remote/DriverRemoteConnection.java | 227 +
.../gremlin/driver/ResultQueueTest.java | 17 +-
.../tinkerpop/gremlin/driver/SettingsTest.java | 88 +
.../traversal/step/filter/GroovyHasTest.groovy | 20 +
.../step/filter/GroovyWhereTest.groovy | 2 +-
gremlin-groovy/pom.xml | 10 +-
.../AbstractImportCustomizerProvider.java | 2 +
.../plugin/dsl/credential/CredentialGraph.java | 2 +-
gremlin-server/scripts/generate-all.groovy | 54 +
gremlin-server/src/assembly/distribution.xml | 3 +-
gremlin-server/src/assembly/standalone.xml | 3 +
.../server/auth/SimpleAuthenticator.java | 2 +-
.../server/op/AbstractEvalOpProcessor.java | 195 +-
.../gremlin/server/op/AbstractOpProcessor.java | 234 +
.../op/traversal/TraversalOpProcessor.java | 214 +
....apache.tinkerpop.gremlin.server.OpProcessor | 3 +-
gremlin-server/src/main/static/LICENSE | 2 +-
.../driver/remote/RemoteGraphProvider.java | 138 +
.../process/RemoteGraphProcessStandardTest.java | 33 +
.../server/GremlinResultSetIntegrateTest.java | 62 +-
.../gremlin/server/ServerTestHelper.java | 2 +-
.../remote/gremlin-server-integration.yaml | 63 +
.../tinkerpop/gremlin/AbstractGremlinTest.java | 3 +
.../apache/tinkerpop/gremlin/GraphManager.java | 6 +
.../apache/tinkerpop/gremlin/GraphProvider.java | 19 +
.../process/traversal/step/filter/DropTest.java | 14 +-
.../process/traversal/step/filter/HasTest.java | 66 +-
.../traversal/step/filter/WhereTest.java | 2 +-
.../process/traversal/step/map/AddEdgeTest.java | 44 +-
.../traversal/step/map/AddVertexTest.java | 16 +-
.../process/traversal/step/map/MatchTest.java | 32 +-
.../PartitionStrategyProcessTest.java | 35 +-
.../ReadOnlyStrategyProcessTest.java | 14 +-
hadoop-gremlin/conf/hadoop-graphson.properties | 6 +-
.../conf/hadoop-grateful-gryo.properties | 4 +-
hadoop-gremlin/conf/hadoop-gryo.properties | 7 +-
hadoop-gremlin/conf/hadoop-script.properties | 4 +-
hadoop-gremlin/pom.xml | 12 +-
.../tinkerpop/gremlin/hadoop/Constants.java | 27 +-
.../computer/AbstractHadoopGraphComputer.java | 13 +-
.../computer/GraphFilterInputFormat.java | 2 +-
.../computer/GraphFilterRecordReader.java | 2 +-
.../process/computer/util/MapReduceHelper.java | 2 +-
.../hadoop/structure/HadoopConfiguration.java | 54 +-
.../gremlin/hadoop/structure/HadoopGraph.java | 25 +-
.../hadoop/structure/io/FileSystemStorage.java | 12 +-
.../structure/io/HadoopElementIterator.java | 3 +-
.../hadoop/structure/io/HadoopPools.java | 5 +-
.../hadoop/structure/io/InputOutputHelper.java | 7 +-
.../io/graphson/GraphSONRecordReader.java | 2 +-
.../io/graphson/GraphSONRecordWriter.java | 2 +-
.../structure/io/gryo/GryoRecordWriter.java | 2 +-
.../gremlin/hadoop/structure/util/ConfUtil.java | 15 +
.../gremlin/hadoop/HadoopGraphProvider.java | 6 +-
.../structure/io/FileSystemStorageCheck.java | 4 +-
.../step/sideEffect/Neo4jGraphStep.java | 5 +
.../optimization/Neo4jGraphStepStrategy.java | 5 +-
pom.xml | 7 +-
spark-gremlin/pom.xml | 5 +-
.../process/computer/SparkGraphComputer.java | 50 +-
.../spark/structure/io/InputFormatRDD.java | 2 +-
.../spark/structure/io/InputOutputHelper.java | 19 +-
.../spark/structure/io/InputRDDFormat.java | 2 +-
.../spark/structure/io/OutputFormatRDD.java | 2 +-
.../spark/structure/io/PersistedInputRDD.java | 5 +-
.../spark/structure/io/PersistedOutputRDD.java | 2 +-
.../spark/structure/io/SparkContextStorage.java | 26 +-
.../process/computer/LocalPropertyTest.java | 8 +-
.../computer/SparkHadoopGraphProvider.java | 15 +-
.../gremlin/spark/structure/SparkTest.java | 4 +-
.../spark/structure/io/InputOutputRDDTest.java | 4 +-
.../spark/structure/io/InputRDDTest.java | 9 +-
.../spark/structure/io/OutputRDDTest.java | 4 +-
.../io/PersistedInputOutputRDDTest.java | 42 +-
.../io/gryo/GryoSerializerIntegrateTest.java | 16 +-
.../step/sideEffect/TinkerGraphStep.java | 5 +
.../optimization/TinkerGraphStepStrategy.java | 5 +-
117 files changed, 34926 insertions(+), 624 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/73b2d42a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
[11/12] incubator-tinkerpop git commit: minor nothing logic tweak.
Posted by ok...@apache.org.
minor nothing logic tweak.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/32afb58a
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/32afb58a
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/32afb58a
Branch: refs/heads/master
Commit: 32afb58aead3cfeb61973b0c4748c691621ad91f
Parents: 20e9ed1
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 10:21:22 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 10:21:22 2016 -0600
----------------------------------------------------------------------
.../process/computer/traversal/TraversalVertexProgram.java | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/32afb58a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index 666a803..0cd873f 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -144,8 +144,9 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
// if results will be serialized out, don't save halted traversers across the cluster
this.keepDistributedHaltedTraversers =
!(this.traversal.get().getParent().asStep().getNextStep() instanceof ComputerResultStep || // if its just going to stream it out, don't distribute
- this.traversal.get().getParent().asStep().getNextStep().getNextStep() instanceof ComputerResultStep ||
- this.traversal.get().getParent().asStep().getNextStep() instanceof EmptyStep); // same as above, but if using TraversalVertexProgramStep directly
+ this.traversal.get().getParent().asStep().getNextStep() instanceof EmptyStep || // same as above, but if using TraversalVertexProgramStep directly
+ (this.traversal.get().getParent().asStep().getNextStep() instanceof ProfileStep && // same as above, but needed for profiling
+ this.traversal.get().getParent().asStep().getNextStep().getNextStep() instanceof ComputerResultStep));
// register traversal side-effects in memory
final TraversalSideEffects sideEffects = ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).getSideEffects();
sideEffects.keys().forEach(key -> this.memoryComputeKeys.add(MemoryComputeKey.of(key, sideEffects.getReducer(key), true, false)));
[05/12] incubator-tinkerpop git commit: Revert "Don't profile
computer steps."
Posted by ok...@apache.org.
Revert "Don't profile computer steps."
This reverts commit 3f25710b10301432ea64996330a084872d8bc78f.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/5b6acfc7
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/5b6acfc7
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/5b6acfc7
Branch: refs/heads/master
Commit: 5b6acfc754ba7b5f50942b607786fe00bf6ef020
Parents: 581f33b
Author: rjbriody <bo...@datastax.com>
Authored: Mon Mar 21 09:07:21 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Mon Mar 21 09:07:21 2016 -0400
----------------------------------------------------------------------
.../strategy/finalization/ProfileStrategy.java | 13 +++----------
1 file changed, 3 insertions(+), 10 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/5b6acfc7/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index 5eb16eb..dd66e1c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -18,8 +18,6 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
-import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -52,14 +50,9 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
// Add .profile() step after every pre-existing step.
final List<Step> steps = traversal.getSteps();
final int numSteps = steps.size();
- for (int ii = 0; ii < numSteps; ii += 2) {
+ for (int ii = 0; ii < numSteps; ii++) {
// Get the original step
- Step step = steps.get(ii);
- if (step instanceof TraversalVertexProgramStep || step instanceof ComputerResultStep) {
- ii--;
- // don't profile the computer steps
- continue;
- }
+ Step step = steps.get(ii * 2);
// Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
if (step instanceof ProfileSideEffectStep) {
@@ -68,7 +61,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
// Create and inject ProfileStep
ProfileStep profileStep = new ProfileStep(traversal);
- traversal.addStep(ii + 1, profileStep);
+ traversal.addStep((ii * 2) + 1, profileStep);
}
}
[09/12] incubator-tinkerpop git commit: Profiling and local
traversals now working with OLAP. This is done,
done now. Have a ComputerVerificaitonStrategy that doesn't allow profiling of
multi-OLAP job traversals. In the future, we will get that to work.
Posted by ok...@apache.org.
Profiling and local traversals now working with OLAP. This is done, done now. Have a ComputerVerificaitonStrategy that doesn't allow profiling of multi-OLAP job traversals. In the future, we will get that to work. Cleaned up the naming of the ProfileTest methods and added some more.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/42ab8bd6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/42ab8bd6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/42ab8bd6
Branch: refs/heads/master
Commit: 42ab8bd60bdce7e8c0260ecc508a48c71816cd02
Parents: 781a676
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 09:37:25 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 09:37:25 2016 -0600
----------------------------------------------------------------------
.../traversal/TraversalVertexProgram.java | 14 +-
.../step/filter/WhereTraversalStep.java | 5 +-
.../step/sideEffect/ProfileSideEffectStep.java | 14 +-
.../traversal/step/util/ProfileStep.java | 44 ++--
.../ComputerVerificationStrategy.java | 11 +-
.../traversal/util/DefaultTraversal.java | 7 +-
.../traversal/util/DefaultTraversalMetrics.java | 2 +-
.../process/traversal/util/TraversalHelper.java | 12 +
.../gremlin/structure/io/gryo/GryoMapper.java | 45 +++-
.../util/function/MutableMetricsSupplier.java | 44 ++++
.../traversal/step/map/GroovyProfileTest.groovy | 35 +--
.../process/traversal/step/map/MatchTest.java | 9 +-
.../process/traversal/step/map/ProfileTest.java | 228 +++++++++----------
.../gremlin/hadoop/structure/HadoopGraph.java | 8 +-
.../structure/TinkerGraphPlayTest.java | 9 +-
15 files changed, 279 insertions(+), 208 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
index fbe5592..d26ef59 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/TraversalVertexProgram.java
@@ -62,7 +62,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.Vertex
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
-import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.PureTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -76,6 +75,7 @@ import org.apache.tinkerpop.gremlin.structure.util.Attachable;
import org.apache.tinkerpop.gremlin.structure.util.ElementHelper;
import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory;
+import org.apache.tinkerpop.gremlin.util.function.MutableMetricsSupplier;
import org.apache.tinkerpop.gremlin.util.iterator.EmptyIterator;
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
@@ -159,10 +159,9 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
for (final MemoryComputing<?> memoryComputing : TraversalHelper.getStepsOfAssignableClassRecursively(MemoryComputing.class, this.traversal.get())) {
this.memoryComputeKeys.add(memoryComputing.getMemoryComputeKey());
}
- // register profile steps
+ // register profile steps (TODO: try to hide this)
for (final ProfileStep profileStep : TraversalHelper.getStepsOfAssignableClassRecursively(ProfileStep.class, this.traversal.get())) {
- this.traversal.get().getSideEffects().register(profileStep.getId(), () -> new MutableMetrics(profileStep.getPreviousStep().getId(), profileStep.getPreviousStep().toString()), ProfileStep.ProfileBiOperator.instance());
-
+ this.traversal.get().getSideEffects().register(profileStep.getId(), new MutableMetricsSupplier(profileStep.getPreviousStep().getId(), profileStep.getPreviousStep().toString()), ProfileStep.ProfileBiOperator.instance());
}
// register TraversalVertexProgram specific memory compute keys
this.memoryComputeKeys.add(MemoryComputeKey.of(HALTED_TRAVERSERS, Operator.addAll, false, this.keepDistributedHaltedTraversers)); // only keep if it will be preserved
@@ -179,7 +178,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
@Override
public void setup(final Memory memory) {
- // memory is distributed
+ // memory is local
((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
memory.set(VOTE_TO_HALT, true);
memory.set(HALTED_TRAVERSERS, new TraverserSet<>());
@@ -188,7 +187,6 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
memory.set(COMPLETED_BARRIERS, new HashSet<>());
final TraversalSideEffects sideEffects = ((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).getSideEffects();
sideEffects.keys().forEach(key -> memory.set(key, sideEffects.get(key)));
-
}
@Override
@@ -246,7 +244,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
@Override
public boolean terminate(final Memory memory) {
- // memory is not distributed
+ // memory is local
((MemoryTraversalSideEffects) this.traversal.get().getSideEffects()).setMemory(memory, false);
final boolean voteToHalt = memory.<Boolean>get(VOTE_TO_HALT);
memory.set(VOTE_TO_HALT, true);
@@ -284,7 +282,7 @@ public final class TraversalVertexProgram implements VertexProgram<TraverserSet<
}
// the result of a TraversalVertexProgram are the halted traversers
memory.set(HALTED_TRAVERSERS, haltedTraversers);
- // finalize profile side-effect steps.
+ // finalize profile side-effect steps. (todo: try and hide this)
for (final ProfileSideEffectStep profileStep : TraversalHelper.getStepsOfAssignableClassRecursively(ProfileSideEffectStep.class, this.traversal.get())) {
this.traversal.get().getSideEffects().set(profileStep.getSideEffectKey(), profileStep.generateFinalResult(this.traversal.get().getSideEffects().get(profileStep.getSideEffectKey())));
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
index f630017..e5d1f35 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WhereTraversalStep.java
@@ -27,6 +27,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.StartStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -121,7 +122,7 @@ public final class WhereTraversalStep<S> extends FilterStep<S> implements Traver
@Override
public Set<TraverserRequirement> getRequirements() {
- return TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.traversal)).stream().filter(this.scopeKeys::contains).findAny().isPresent() ?
+ return TraversalHelper.getLabels(TraversalHelper.getRootTraversal(this.getTraversal())).stream().filter(this.scopeKeys::contains).findAny().isPresent() ?
TYPICAL_GLOBAL_REQUIREMENTS :
TYPICAL_LOCAL_REQUIREMENTS;
}
@@ -141,7 +142,7 @@ public final class WhereTraversalStep<S> extends FilterStep<S> implements Traver
protected Object map(final Traverser.Admin<S> traverser) {
if (this.getTraversal().getEndStep() instanceof WhereEndStep)
((WhereEndStep) this.getTraversal().getEndStep()).processStartTraverser(traverser);
- else if (this.getTraversal().getEndStep() instanceof ProfileSideEffectStep && this.getTraversal().getEndStep().getPreviousStep() instanceof WhereEndStep) // TOTAL SUCKY HACK!
+ else if (this.getTraversal().getEndStep() instanceof ProfileStep && this.getTraversal().getEndStep().getPreviousStep() instanceof WhereEndStep) // TOTAL SUCKY HACK!
((WhereEndStep) this.getTraversal().getEndStep().getPreviousStep()).processStartTraverser(traverser);
return null == this.selectKey ? traverser.get() : this.getScopeValue(Pop.last, this.selectKey, traverser);
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
index e2cf947..be60808 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/ProfileSideEffectStep.java
@@ -55,12 +55,12 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
@Override
public Traverser.Admin<S> next() {
- Traverser.Admin<S> ret = null;
+ Traverser.Admin<S> start = null;
try {
- ret = super.next();
- return ret;
+ start = super.next();
+ return start;
} finally {
- if (!this.onGraphComputer && ret == null) {
+ if (!this.onGraphComputer && start == null) {
((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
}
}
@@ -68,11 +68,11 @@ public final class ProfileSideEffectStep<S> extends SideEffectStep<S> implements
@Override
public boolean hasNext() {
- boolean ret = super.hasNext();
- if (!this.onGraphComputer && !ret) {
+ boolean start = super.hasNext();
+ if (!this.onGraphComputer && !start) {
((DefaultTraversalMetrics) this.getTraversal().getSideEffects().get(this.sideEffectKey)).setMetrics(this.getTraversal(), false);
}
- return ret;
+ return start;
}
@Override
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
index 89191e0..9b2276b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/ProfileStep.java
@@ -22,18 +22,19 @@ import org.apache.tinkerpop.gremlin.process.computer.MemoryComputeKey;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
-import org.apache.tinkerpop.gremlin.process.traversal.step.GraphComputing;
import org.apache.tinkerpop.gremlin.process.traversal.step.MemoryComputing;
import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
+import java.io.Serializable;
import java.util.NoSuchElementException;
import java.util.function.BinaryOperator;
/**
* @author Bob Briody (http://bobbriody.com)
*/
-public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryComputing<MutableMetrics>, GraphComputing {
+public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryComputing<MutableMetrics> { // pseudo GraphComputing but local traversals are "GraphComputing"
private MutableMetrics metrics;
private boolean onGraphComputer = false;
@@ -47,23 +48,23 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
@Override
public Traverser.Admin<S> next() {
- Traverser.Admin<S> ret = null;
- initializeIfNeeded();
+ Traverser.Admin<S> start = null;
+ this.initializeIfNeeded();
this.metrics.start();
try {
- ret = super.next();
- return ret;
+ start = super.next();
+ return start;
} finally {
- if (ret != null) {
- this.metrics.finish(ret.bulk());
+ if (start != null) {
+ this.metrics.finish(start.bulk());
if (this.onGraphComputer) {
- this.getTraversal().getSideEffects().add(this.getId(), metrics);
+ this.getTraversal().getSideEffects().add(this.getId(), this.metrics);
this.metrics = null;
}
} else {
this.metrics.stop();
if (this.onGraphComputer) {
- this.getTraversal().getSideEffects().add(this.getId(), metrics);
+ this.getTraversal().getSideEffects().add(this.getId(), this.metrics);
this.metrics = null;
}
}
@@ -85,12 +86,12 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
}
private void initializeIfNeeded() {
- if (metrics == null) {
- metrics = new MutableMetrics(this.getPreviousStep().getId(), this.getPreviousStep().toString());
+ if (null == this.metrics) {
+ this.onGraphComputer = TraversalHelper.onGraphComputer(this.getTraversal());
+ this.metrics = new MutableMetrics(this.getPreviousStep().getId(), this.getPreviousStep().toString());
final Step<?, S> previousStep = this.getPreviousStep();
- if (previousStep instanceof Profiling) {
- ((Profiling) previousStep).setMetrics(metrics);
- }
+ if (previousStep instanceof Profiling)
+ ((Profiling) previousStep).setMetrics(this.metrics);
}
}
@@ -100,11 +101,6 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
}
@Override
- public void onGraphComputer() {
- this.onGraphComputer = true;
- }
-
- @Override
public ProfileStep<S> clone() {
final ProfileStep<S> clone = (ProfileStep<S>) super.clone();
clone.metrics = null;
@@ -113,14 +109,14 @@ public final class ProfileStep<S> extends AbstractStep<S, S> implements MemoryCo
/////
- public static class ProfileBiOperator implements BinaryOperator<MutableMetrics> {
+ public static class ProfileBiOperator implements BinaryOperator<MutableMetrics>, Serializable {
private static final ProfileBiOperator INSTANCE = new ProfileBiOperator();
@Override
- public MutableMetrics apply(final MutableMetrics metrics, final MutableMetrics metrics2) {
- metrics.aggregate(metrics2);
- return metrics;
+ public MutableMetrics apply(final MutableMetrics metricsA, final MutableMetrics metricsB) {
+ metricsA.aggregate(metricsB);
+ return metricsA;
}
public static final ProfileBiOperator instance() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index 6748cd9..b70da42 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.strategy.verification;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.VertexProgramStep;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -34,8 +35,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -64,9 +65,11 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
if (!TraversalHelper.onGraphComputer(traversal) || traversal.getParent().isLocalChild(traversal)) // only process global children as local children are standard semantics
return;
- if (traversal.getParent() instanceof TraversalVertexProgramStep &&
- TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1) {
- throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
+ if (traversal.getParent() instanceof TraversalVertexProgramStep) {
+ if (TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1)
+ throw new VerificationException("GraphComputer does not support mid-traversal V()/E()", traversal);
+ if (TraversalHelper.hasStepOfAssignableClassRecursively(ProfileStep.class, traversal) && TraversalHelper.getStepsOfAssignableClass(VertexProgramStep.class, TraversalHelper.getRootTraversal(traversal)).size() > 1)
+ throw new VerificationException("Profiling a multi-OLAP traversal is currently not supported", traversal);
}
for (final Step<?, ?> step : traversal.getSteps()) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
index 1fe0687..4a3a129 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversal.java
@@ -108,6 +108,11 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
}
}
this.finalEndStep = this.getEndStep();
+ // finalize requirements
+ if (this.getParent() instanceof EmptyStep) {
+ this.requirements = null;
+ this.getTraverserRequirements();
+ }
this.locked = true;
}
@@ -116,7 +121,7 @@ public class DefaultTraversal<S, E> implements Traversal.Admin<S, E> {
if (null == this.requirements) {
// if (!this.locked) this.applyStrategies();
this.requirements = new HashSet<>();
- for (Step<?, ?> step : this.getSteps()) {
+ for (final Step<?, ?> step : this.getSteps()) {
this.requirements.addAll(step.getRequirements());
}
if (!this.getSideEffects().keys().isEmpty())
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
index bfcd27f..1714a9e 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/DefaultTraversalMetrics.java
@@ -237,7 +237,7 @@ public final class DefaultTraversalMetrics implements TraversalMetrics, Serializ
if (step.getPreviousStep() instanceof TraversalParent) {
for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getLocalChildren()) {
- handleNestedTraversals(t, metrics, false);
+ handleNestedTraversals(t, metrics, onGraphComputer);
}
for (Traversal.Admin<?, ?> t : ((TraversalParent) step.getPreviousStep()).getGlobalChildren()) {
handleNestedTraversals(t, metrics, onGraphComputer);
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index ee20147..6f442fd 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -227,6 +227,9 @@ public final class TraversalHelper {
if (stepClass.isAssignableFrom(step.getClass()))
list.add((S) step);
if (step instanceof TraversalParent) {
+ for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+ list.addAll(TraversalHelper.getStepsOfAssignableClassRecursively(stepClass, localChild));
+ }
for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
list.addAll(TraversalHelper.getStepsOfAssignableClassRecursively(stepClass, globalChild));
}
@@ -282,6 +285,9 @@ public final class TraversalHelper {
return true;
}
if (step instanceof TraversalParent) {
+ for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+ if (hasStepOfAssignableClassRecursively(stepClass, localChild)) return true;
+ }
for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
if (hasStepOfAssignableClassRecursively(stepClass, globalChild)) return true;
}
@@ -307,6 +313,9 @@ public final class TraversalHelper {
return true;
}
if (step instanceof TraversalParent) {
+ for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+ if (hasStepOfAssignableClassRecursively(stepClasses, localChild)) return true;
+ }
for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
if (hasStepOfAssignableClassRecursively(stepClasses, globalChild)) return true;
}
@@ -328,6 +337,9 @@ public final class TraversalHelper {
return true;
}
if (step instanceof TraversalParent) {
+ for (final Traversal.Admin<?, ?> localChild : ((TraversalParent) step).getLocalChildren()) {
+ if (anyStepRecursively(predicate, localChild)) return true;
+ }
for (final Traversal.Admin<?, ?> globalChild : ((TraversalParent) step).getGlobalChildren()) {
if (anyStepRecursively(predicate, globalChild)) return true;
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
index 6e904ef..d510706 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/gryo/GryoMapper.java
@@ -24,20 +24,48 @@ import org.apache.tinkerpop.gremlin.process.traversal.Contains;
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
import org.apache.tinkerpop.gremlin.process.traversal.Path;
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep;
-import org.apache.tinkerpop.gremlin.process.traversal.step.map.*;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.FoldStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupStepV3d0;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.MeanGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.OrderGlobalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.TreeStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree;
-import org.apache.tinkerpop.gremlin.process.traversal.traverser.*;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_P_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_LP_O_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.B_O_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_P_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.LP_O_OB_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_OB_S_SE_SL_Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.traverser.O_Traverser;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.ImmutableMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
-import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalExplanation;
-import org.apache.tinkerpop.gremlin.structure.*;
+import org.apache.tinkerpop.gremlin.structure.Direction;
+import org.apache.tinkerpop.gremlin.structure.Edge;
+import org.apache.tinkerpop.gremlin.structure.Graph;
+import org.apache.tinkerpop.gremlin.structure.Property;
+import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
+import org.apache.tinkerpop.gremlin.structure.VertexProperty;
import org.apache.tinkerpop.gremlin.structure.io.IoRegistry;
import org.apache.tinkerpop.gremlin.structure.io.Mapper;
-import org.apache.tinkerpop.gremlin.structure.util.detached.*;
-import org.apache.tinkerpop.gremlin.structure.util.reference.*;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedPath;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex;
+import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceEdge;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferencePath;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceProperty;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertex;
+import org.apache.tinkerpop.gremlin.structure.util.reference.ReferenceVertexProperty;
import org.apache.tinkerpop.gremlin.structure.util.star.StarGraph;
import org.apache.tinkerpop.gremlin.structure.util.star.StarGraphGryoSerializer;
import org.apache.tinkerpop.shaded.kryo.ClassResolver;
@@ -318,13 +346,14 @@ public final class GryoMapper implements Mapper<Kryo> {
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(Operator.class, null, 107));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(FoldStep.FoldBiOperator.class, null, 108));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupCountStep.GroupCountBiOperator.class, null, 109));
- add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStep.GroupBiOperator.class, kryo -> new JavaSerializer(), 117));
+ add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStep.GroupBiOperator.class, kryo -> new JavaSerializer(), 117)); // because they contain traversals
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MeanGlobalStep.MeanGlobalBiOperator.class, null, 110));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(MeanGlobalStep.MeanNumber.class, null, 111));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(TreeStep.TreeBiOperator.class, null, 112));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(GroupStepV3d0.GroupBiOperatorV3d0.class, null, 113));
add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(RangeGlobalStep.RangeBiOperator.class, null, 114));
- add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(OrderGlobalStep.OrderBiOperator.class, kryo -> new JavaSerializer(), 118)); // ***LAST ID***
+ add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(OrderGlobalStep.OrderBiOperator.class, kryo -> new JavaSerializer(), 118)); // because they contain traversals
+ add(Triplet.<Class, Function<Kryo, Serializer>, Integer>with(ProfileStep.ProfileBiOperator.class, null, 119)); // ***LAST ID***
}};
private final List<IoRegistry> registries = new ArrayList<>();
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
new file mode 100644
index 0000000..c83d21e
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/function/MutableMetricsSupplier.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.util.function;
+
+import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
+
+import java.io.Serializable;
+import java.util.function.Supplier;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public final class MutableMetricsSupplier implements Supplier<MutableMetrics>, Serializable {
+
+ private final String stepId;
+ private final String stepString;
+
+ public MutableMetricsSupplier(final String stepId, final String stepString) {
+ this.stepId = stepId;
+ this.stepString = stepString;
+ }
+
+ @Override
+ public MutableMetrics get() {
+ return new MutableMetrics(this.stepId, this.stepString);
+ }
+}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
index 7a3c305..0987ee5 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyProfileTest.groovy
@@ -20,8 +20,8 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map
import org.apache.tinkerpop.gremlin.process.traversal.Traversal
import org.apache.tinkerpop.gremlin.process.traversal.util.ScriptTraversal
-import org.apache.tinkerpop.gremlin.structure.Vertex;
-import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics
+import org.apache.tinkerpop.gremlin.structure.Vertex
/**
* @author Bob Briody (http://bobbriody.com
@@ -41,7 +41,7 @@ public abstract class GroovyProfileTest {
}
@Override
- public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+ public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_name_profile() {
new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile()");
}
@@ -51,33 +51,38 @@ public abstract class GroovyProfileTest {
}
@Override
- public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
- new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').by('name').profile()")
+ public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').profile()")
}
@Override
- public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
- g.V.out.out.profile('metrics_key') // locked traversal
+ public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetricsX() {
+ g.V.out.out.profile('metrics') // locked traversal
}
@Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX() {
- new ScriptTraversal<>(g, "gremlin-groovy", "g.V.repeat(__.both()).times(3).profile('metrics_key')");
+ public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetricsX() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V.repeat(__.both()).times(3).profile('metrics')");
}
@Override
- public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
- new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile('metrics_key')");
+ public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V().where(__.in('created').count().is(1l)).values('name').profile('metrics')");
}
@Override
- public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
- new ScriptTraversal<>(g, "gremlin-groovy", "g.V().sideEffect{Thread.sleep(10)}.sideEffect{Thread.sleep(5)}.profile('metrics_key')")
+ public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V().sideEffect{Thread.sleep(10)}.sideEffect{Thread.sleep(5)}.profile('metrics')")
}
@Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX() {
- new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').by('name').profile('metrics_key')")
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V.match(__.as('a').out('created').as('b'), __.as('b').in.count.is(eq(1))).select('a', 'b').profile('metrics')")
+ }
+
+ @Override
+ public Traversal<Vertex, TraversalMetrics> get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile() {
+ new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').pageRank.by('rank').by(bothE()).rank.profile()")
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
index d2ef074..01c8eda 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
@@ -280,9 +280,8 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
@LoadGraphWith(MODERN)
public void g_V_matchXa_knows_b__c_knows_bX() {
final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_knows_b__c_knows_bX();
- printTraversalForm(traversal);
-
try {
+ printTraversalForm(traversal);
traversal.iterate();
fail("Should have tossed an exception because match pattern is not solvable");
} catch (Exception ex) {
@@ -307,9 +306,8 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
@LoadGraphWith(MODERN)
public void g_V_matchXa_created_b__c_created_bX_selectXa_b_cX_byXnameX() throws Exception {
final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__c_created_bX_selectXa_b_cX_byXnameX();
- printTraversalForm(traversal);
-
try {
+ printTraversalForm(traversal);
traversal.iterate();
fail("Should have tossed an exception because match pattern is not solvable");
} catch (Exception ex) {
@@ -321,9 +319,8 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
@LoadGraphWith(MODERN)
public void g_V_out_asXcX_matchXb_knows_a__c_created_eX_selectXcX() throws Exception {
final Traversal<Vertex, String> traversal = get_g_V_out_asXcX_matchXb_knows_a__c_created_eX_selectXcX();
- printTraversalForm(traversal);
-
try {
+ printTraversalForm(traversal);
traversal.iterate();
fail("Should have tossed an exception because match pattern is not solvable");
} catch (Exception ex) {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
index 4b0d6bf..5fdb8c0 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/ProfileTest.java
@@ -18,6 +18,7 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.step.map;
+import org.apache.commons.lang.exception.ExceptionUtils;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
@@ -32,6 +33,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
import org.apache.tinkerpop.gremlin.process.traversal.step.Profiling;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RangeByIsCountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException;
import org.apache.tinkerpop.gremlin.process.traversal.util.Metrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.MutableMetrics;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -52,6 +54,7 @@ import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
/**
* @author Bob Briody (http://bobbriody.com)
@@ -59,7 +62,7 @@ import static org.junit.Assert.assertTrue;
*/
@RunWith(GremlinProcessRunner.class)
public abstract class ProfileTest extends AbstractGremlinProcessTest {
- private static final String METRICS_KEY = "metrics_key";
+ private static final String METRICS_KEY = "metrics";
public abstract Traversal<Vertex, TraversalMetrics> get_g_V_out_out_profile();
@@ -67,72 +70,42 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
public abstract Traversal<Vertex, TraversalMetrics> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
- public abstract Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+ public abstract Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_name_profile();
- public abstract Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile();
+ public abstract Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile();
- public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX();
+ public abstract Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetricsX();
- public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
+ public abstract Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetricsX();
- public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
+ public abstract Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX();
- public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
+ public abstract Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX();
- public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
+ public abstract Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX();
+
+ public abstract Traversal<Vertex, TraversalMetrics> get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile();
- /**
- * Many of the tests in this class are coupled to not-totally-generic vendor behavior. However, this test is intended to provide
- * fully generic validation.
- */
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_out_out_profile_simple() {
+ public void modern_V_out_out_profile() {
final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
printTraversalForm(traversal);
+ validate_g_V_out_out_profile_modern(traversal, traversal.next());
- final TraversalMetrics traversalMetrics = traversal.next();
- traversalMetrics.toString(); // ensure no exceptions are thrown
-
- // Every other step should be a Profile step
- List<Step> steps = traversal.asAdmin().getSteps();
- for (int ii = 1; ii <= 6; ii += 2) {
- assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
- }
- // Validate the last Metrics only, which must be consistent across vendors.
- Metrics metrics = traversalMetrics.getMetrics(traversalMetrics.getMetrics().size() - 1);
- assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
- assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
}
@Test
@LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_out_out_profile_simpleXmetrics_keyX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+ public void modern_V_out_out_profileXmetricsX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetricsX();
printTraversalForm(traversal);
-
traversal.iterate();
-
- final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
- traversalMetrics.toString(); // ensure no exceptions are thrown
-
- // Every other step should be a Profile step
- List<Step> steps = traversal.asAdmin().getSteps();
- for (int ii = 1; ii < steps.size(); ii += 2) {
- assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
- }
-
- // Validate the last Metrics only, which must be consistent across vendors.
- Metrics metrics = traversalMetrics.getMetrics(traversalMetrics.getMetrics().size() - 1);
- assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
- assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+ validate_g_V_out_out_profile_modern(traversal, traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY));
}
-
- private void validate_g_V_out_out_profile_modern(TraversalMetrics traversalMetrics) {
+ private void validate_g_V_out_out_profile_modern(final Traversal traversal, final TraversalMetrics traversalMetrics) {
traversalMetrics.toString(); // ensure no exceptions are thrown
Metrics metrics = traversalMetrics.getMetrics(0);
@@ -146,25 +119,35 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
metrics = traversalMetrics.getMetrics(2);
assertEquals(2, metrics.getCount(TraversalMetrics.ELEMENT_COUNT_ID).longValue());
assertNotEquals(0, metrics.getCount(TraversalMetrics.TRAVERSER_COUNT_ID).longValue());
+
+ if (!onGraphComputer(traversal.asAdmin())) {
+ // Every other step should be a Profile step
+ List<Step> steps = traversal.asAdmin().getSteps();
+ for (int ii = 1; ii <= 6; ii += 2) {
+ assertEquals("Every other Step should be a ProfileStep.", ProfileStep.class, steps.get(ii).getClass());
+ }
+ }
}
+ ////////////////////
+
@Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out_profile_modern() {
+ @LoadGraphWith(GRATEFUL)
+ public void grateful_V_out_out_profile() {
final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
printTraversalForm(traversal);
final TraversalMetrics traversalMetrics = traversal.next();
- validate_g_V_out_out_profile_modern(traversalMetrics);
+ validate_g_V_out_out_profile_grateful(traversalMetrics);
}
@Test
- @LoadGraphWith(MODERN)
- public void g_V_out_out_profile_modernXmetrics_keyX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+ @LoadGraphWith(GRATEFUL)
+ public void grateful_V_out_out_profileXmetricsX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetricsX();
printTraversalForm(traversal);
traversal.iterate();
final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
- validate_g_V_out_out_profile_modern(traversalMetrics);
+ validate_g_V_out_out_profile_grateful(traversalMetrics);
}
private void validate_g_V_out_out_profile_grateful(TraversalMetrics traversalMetrics) {
@@ -195,25 +178,29 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
assertEquals(100, totalPercentDuration, 0.000001);
}
+ ///////////////////
+
@Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_out_out_profile_grateful() {
- final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_out_out_profile();
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
+ final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
printTraversalForm(traversal);
-
- final TraversalMetrics traversalMetrics = traversal.next();
- validate_g_V_out_out_profile_grateful(traversalMetrics);
+ TraversalMetrics traversalMetrics = traversal.next();
+ assertEquals("There should be 8 steps in this traversal (counting injected profile steps).", 8, traversal.asAdmin().getSteps().size());
+ validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
}
@Test
- @LoadGraphWith(GRATEFUL)
- public void g_V_out_out_profile_gratefulXmetrics_keyX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_out_out_profileXmetrics_keyX();
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.COMPUTER)
+ public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX();
printTraversalForm(traversal);
-
traversal.iterate();
- final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
- validate_g_V_out_out_profile_grateful(traversalMetrics);
+ assertEquals("There should be 7 steps in this traversal (counting injected profile steps).", 7, traversal.asAdmin().getSteps().size());
+ TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
+ validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
}
private void validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(TraversalMetrics traversalMetrics) {
@@ -237,27 +224,26 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
assertEquals(100, totalPercentDuration, 0.000001);
}
+ ///////////////////
+
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile() {
- final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile();
+ public void g_V_repeat_both_profile() {
+ final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_repeatXbothX_timesX3X_profile();
printTraversalForm(traversal);
- TraversalMetrics traversalMetrics = traversal.next();
- assertEquals("There should be 8 steps in this traversal (counting injected profile steps).", 8, traversal.asAdmin().getSteps().size());
- validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
+
+ final TraversalMetrics traversalMetrics = traversal.next();
+ validate_g_V_repeat_both_modern_profile(traversalMetrics);
}
@Test
@LoadGraphWith(MODERN)
- @IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX();
+ public void g_V_repeat_both_profileXmetricsX() {
+ final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_profileXmetricsX();
printTraversalForm(traversal);
traversal.iterate();
- assertEquals("There should be 7 steps in this traversal (counting injected profile steps).", 7, traversal.asAdmin().getSteps().size());
- TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
- validate_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profile(traversalMetrics);
+ final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
+ validate_g_V_repeat_both_modern_profile(traversalMetrics);
}
private void validate_g_V_repeat_both_modern_profile(TraversalMetrics traversalMetrics) {
@@ -295,29 +281,9 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
assertEquals(100, totalPercentDuration, 0.000001);
}
- @Test
- @LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_repeat_both_modern_profile() {
- final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_repeatXbothX_timesX3X_profile();
- printTraversalForm(traversal);
-
- final TraversalMetrics traversalMetrics = traversal.next();
- validate_g_V_repeat_both_modern_profile(traversalMetrics);
- }
-
- @Test
- @LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
- public void g_V_repeat_both_modern_profileXmetrics_keyX() {
- final Traversal<Vertex, Vertex> traversal = get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX();
- printTraversalForm(traversal);
- traversal.iterate();
- final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
- validate_g_V_repeat_both_modern_profile(traversalMetrics);
- }
+ /////////////
- private void validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(Traversal traversal, TraversalMetrics traversalMetrics) {
+ private void validate_g_V_whereXinXcreatedX_count_isX1XX_name_profile(Traversal traversal, TraversalMetrics traversalMetrics) {
traversalMetrics.toString(); // ensure no exceptions are thrown
assertEquals("There should be 3 top-level metrics.", 3, traversalMetrics.getMetrics().size());
@@ -339,24 +305,21 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
- final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile();
+ public void g_V_whereXinXcreatedX_count_isX1XX_name_profile() {
+ final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_name_profile();
printTraversalForm(traversal);
-
final TraversalMetrics traversalMetrics = traversal.next();
- validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(traversal, traversalMetrics);
+ validate_g_V_whereXinXcreatedX_count_isX1XX_name_profile(traversal, traversalMetrics);
}
@Test
@LoadGraphWith(MODERN)
- public void g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
- final Traversal<Vertex, String> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX();
+ public void g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX() {
+ final Traversal<Vertex, String> traversal = get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX();
printTraversalForm(traversal);
-
traversal.iterate();
-
final TraversalMetrics traversalMetrics = traversal.asAdmin().getSideEffects().<TraversalMetrics>get(METRICS_KEY);
- validate_g_V_hasXinXcreatedX_count_isX1XX_valuesXnameX_profile(traversal, traversalMetrics);
+ validate_g_V_whereXinXcreatedX_count_isX1XX_name_profile(traversal, traversalMetrics);
}
/**
@@ -389,7 +352,6 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void testProfileStrategyCallback() {
final Traversal<Vertex, TraversalMetrics> t = get_g_V_out_out_profile();
MockStep mockStep = new MockStep(t.asAdmin());
@@ -404,9 +366,8 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- //@IgnoreEngine(TraversalEngine.Type.COMPUTER)
public void testProfileStrategyCallbackSideEffect() {
- final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetrics_keyX();
+ final Traversal<Vertex, Vertex> t = get_g_V_out_out_profileXmetricsX();
MockStep mockStep = new MockStep(t.asAdmin());
t.asAdmin().addStep(3, mockStep);
t.iterate();
@@ -420,20 +381,34 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
@Test
@LoadGraphWith(MODERN)
- public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
- final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile();
+ public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile() {
+ final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile();
printTraversalForm(traversal);
traversal.iterate();
}
@Test
@LoadGraphWith(MODERN)
- public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX() {
- final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX();
+ public void g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX() {
+ final Traversal<Vertex, Map<String, String>> traversal = get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX();
printTraversalForm(traversal);
traversal.iterate();
}
+ @Test
+ @LoadGraphWith(MODERN)
+ @IgnoreEngine(TraversalEngine.Type.STANDARD)
+ public void g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile() {
+ final Traversal<Vertex, TraversalMetrics> traversal = get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile();
+ //printTraversalForm(traversal);
+ try {
+ traversal.iterate();
+ fail("Should have tossed an exception because multi-OLAP is unsolvable");
+ } catch (Exception ex) {
+ assertTrue(ex instanceof VerificationException || ExceptionUtils.getRootCause(ex) instanceof VerificationException);
+ }
+ }
+
private static boolean onGraphComputer(final Traversal.Admin<?, ?> traversal) {
return !TraversalHelper.getStepsOfClass(TraversalVertexProgramStep.class, TraversalHelper.getRootTraversal(traversal)).isEmpty();
}
@@ -471,27 +446,27 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
}
@Override
- public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profile() {
+ public Traversal<Vertex, TraversalMetrics> get_g_V_whereXinXcreatedX_count_isX1XX_name_profile() {
return g.V().where(__.in("created").count().is(1l)).<String>values("name").profile();
}
@Override
- public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profile() {
- return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").by("name").profile();
+ public Traversal<Vertex, TraversalMetrics> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profile() {
+ return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").profile();
}
@Override
- public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetrics_keyX() {
+ public Traversal<Vertex, Vertex> get_g_V_out_out_profileXmetricsX() {
return g.V().out().out().profile(METRICS_KEY);
}
@Override
- public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetrics_keyX() {
+ public Traversal<Vertex, Vertex> get_g_V_repeatXbothX_timesX3X_profileXmetricsX() {
return g.V().repeat(both()).times(3).profile(METRICS_KEY);
}
@Override
- public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetrics_keyX() {
+ public Traversal<Vertex, Vertex> get_g_V_sideEffectXThread_sleepX10XX_sideEffectXThread_sleepX5XX_profileXmetricsX() {
return g.V().sideEffect(v -> {
try {
Thread.sleep(10);
@@ -508,13 +483,18 @@ public abstract class ProfileTest extends AbstractGremlinProcessTest {
}
@Override
- public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX_profileXmetrics_keyX() {
+ public Traversal<Vertex, String> get_g_V_whereXinXcreatedX_count_isX1XX_name_profileXmetricsX() {
return g.V().where(__.in("created").count().is(1l)).<String>values("name").profile(METRICS_KEY);
}
@Override
- public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_byXnameX_profileXmetrics_keyX() {
- return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").by("name").profile(METRICS_KEY);
+ public Traversal<Vertex, Map<String, String>> get_g_V_matchXa_created_b__b_in_count_isXeqX1XXX_selectXa_bX_profileXmetricsX() {
+ return g.V().match(__.as("a").out("created").as("b"), __.as("b").in().count().is(P.eq(1))).<String>select("a", "b").profile(METRICS_KEY);
+ }
+
+ @Override
+ public Traversal<Vertex, TraversalMetrics> get_g_V_hasLabelXpersonX_pageRank_byXrankX_byXbothEX_rank_profile() {
+ return g.V().hasLabel("person").pageRank().by("rank").by(__.bothE()).values("rank").profile();
}
}
}
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
index c8a8394..3dd0d9a 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
@@ -146,19 +146,19 @@ import java.util.stream.Stream;
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest$Traversals",
- method = "g_V_out_out_profile_grateful",
+ method = "grateful_V_out_out_profile",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.ProfileTest$Traversals",
- method = "g_V_out_out_profile_gratefulXmetrics_keyX",
+ method = "grateful_V_out_out_profileXmetricsX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyProfileTest$Traversals",
- method = "g_V_out_out_profile_grateful",
+ method = "grateful_V_out_out_profile",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyProfileTest$Traversals",
- method = "g_V_out_out_profile_gratefulXmetrics_keyX",
+ method = "grateful_V_out_out_profileXmetricsX",
reason = "Hadoop-Gremlin is OLAP-oriented and for OLTP operations, linear-scan joins are required. This particular tests takes many minutes to execute.")
@Graph.OptOut(
test = "org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.GroupTest",
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/42ab8bd6/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index e19dff8..f0d77ab 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.tinkergraph.structure;
import org.apache.tinkerpop.gremlin.process.computer.bulkloading.BulkLoaderVertexProgram;
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
+import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
@@ -57,15 +58,15 @@ public class TinkerGraphPlayTest {
GraphTraversalSource g = graph.traversal().withComputer();//GraphTraversalSource.computer());
//System.out.println(g.V().outE("knows").identity().inV().count().is(P.eq(5)).explain());
//System.out.println(g.V().hasLabel("person").fold().order(Scope.local).by("age").toList());
- System.out.println(g.V().repeat(out()).times(2).profile("m").explain());
- final Traversal<?,?> traversal = g.V().repeat(out().union(__.<Vertex>identity().as("a"),out())).times(1).count().profile("m");
-
+ //System.out.println(g.V().repeat(out()).times(2).profile("m").explain());
+ final Traversal<?,?> traversal = g.V().both().hasLabel("person").order().by("age", Order.decr).values("name");
+ //System.out.println(g.V().hasLabel("person").pageRank().by("rank").by(bothE()).values("rank").profile("m").explain());
//System.out.println(traversal.asAdmin().clone().toString());
// final Traversal<?,?> clone = traversal.asAdmin().clone();
// clone.asAdmin().applyStrategies();
// System.out.println(clone);
System.out.println(traversal.asAdmin().toList());
- System.out.println(traversal.asAdmin().getSideEffects().get("m") + " ");
+ //System.out.println(traversal.asAdmin().getSideEffects().get("m") + " ");
//System.out.println(g.V().pageRank().order().by(PageRankVertexProgram.PAGE_RANK).valueMap().toList());
}
[12/12] incubator-tinkerpop git commit: updated CHANGELOG.
Posted by ok...@apache.org.
updated CHANGELOG.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/c7111bed
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/c7111bed
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/c7111bed
Branch: refs/heads/master
Commit: c7111bedc25f265a1da859e07cf12dff4abf0dd0
Parents: 32afb58
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Mar 22 14:53:12 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Mar 22 14:53:12 2016 -0600
----------------------------------------------------------------------
CHANGELOG.asciidoc | 2 ++
1 file changed, 2 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/c7111bed/CHANGELOG.asciidoc
----------------------------------------------------------------------
diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 2d7fe5f..1865936 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
TinkerPop 3.2.0 (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Fixed a bug around profiling and nested traversals.
* Added `gremlin.hadoop.defaultGraphComputer` so users can use `graph.compute()` with `HadoopGraph`.
* Added `gremlin.hadoop.graphReader` and `gremlin.hadoop.graphWriter` which can handled `XXXFormats` and `XXXRDDs`.
* Deprecated `gremlin.hadoop.graphInputFormat`, `gremlin.hadoop.graphOutputFormat`, `gremlin.spark.graphInputRDD`, and `gremlin.spark.graphOuputRDD`.
@@ -128,6 +129,7 @@ image::https://raw.githubusercontent.com/apache/incubator-tinkerpop/master/docs/
TinkerPop 3.1.2 (NOT OFFICIALLY RELEASED YET)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+* Renamed `StandardTraversalMetrics` to `DefaultTraversalMetrics` given the `DefaultXXX`-convention throughout. (*breaking*)
* Bumped to Apache Hadoop 2.7.2.
* Fixed a bug in `gremlin-driver` where a really fast call to get a `Future` to wait for a result might not register an error raised from the server.
* Fixed a severe bug where `LP_O_OB_P_S_SE_SL_Traverser` was not registered with `GryoMapper`.
[04/12] incubator-tinkerpop git commit: Put back check to prevent
profiling of computer traversals.
Posted by ok...@apache.org.
Put back check to prevent profiling of computer traversals.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/581f33bc
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/581f33bc
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/581f33bc
Branch: refs/heads/master
Commit: 581f33bcb8aef7ff76e31175b0b0fcdc5059bba7
Parents: 800cf0a
Author: rjbriody <bo...@datastax.com>
Authored: Mon Mar 21 09:04:32 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Mon Mar 21 09:04:32 2016 -0400
----------------------------------------------------------------------
.../strategy/verification/ComputerVerificationStrategy.java | 4 +++-
.../gremlin/tinkergraph/structure/TinkerGraphPlayTest.java | 8 --------
2 files changed, 3 insertions(+), 9 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/581f33bc/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index f17735f..85ce73b 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -28,10 +28,12 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalSte
import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SubgraphStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.CollectingBarrierStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.ProfileStep;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
@@ -48,7 +50,7 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
private static final ComputerVerificationStrategy INSTANCE = new ComputerVerificationStrategy();
private static final Set<Class<?>> UNSUPPORTED_STEPS = new HashSet<>(Arrays.asList(
- InjectStep.class, Mutating.class, SubgraphStep.class, ComputerResultStep.class
+ InjectStep.class, Mutating.class, SubgraphStep.class, ProfileStep.class, ProfileSideEffectStep.class, ComputerResultStep.class
));
private ComputerVerificationStrategy() {
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/581f33bc/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index 97aef31..6dbedc2 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -51,14 +51,6 @@ public class TinkerGraphPlayTest {
private static final Logger logger = LoggerFactory.getLogger(TinkerGraphPlayTest.class);
@Test
- public void testBob() {
- GraphTraversalSource g = TinkerFactory.createModern().traversal().withComputer();
- final GraphTraversal<Vertex, Long> traversal = g.V().hasLabel("person").bothE().count().profile("m");
- traversal.iterate();
- System.out.println(traversal.asAdmin().getSideEffects().get("m").toString());
- }
-
- @Test
@Ignore
public void testPlay8() throws Exception {
Graph graph = TinkerFactory.createModern();
[02/12] incubator-tinkerpop git commit: Don't profile computer steps.
Posted by ok...@apache.org.
Don't profile computer steps.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/3f25710b
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/3f25710b
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/3f25710b
Branch: refs/heads/master
Commit: 3f25710b10301432ea64996330a084872d8bc78f
Parents: e73bbc5
Author: rjbriody <bo...@datastax.com>
Authored: Thu Mar 17 17:38:26 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Thu Mar 17 17:38:26 2016 -0400
----------------------------------------------------------------------
.../strategy/finalization/ProfileStrategy.java | 13 ++++++++++---
1 file changed, 10 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/3f25710b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
index dd66e1c..5eb16eb 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/finalization/ProfileStrategy.java
@@ -18,6 +18,8 @@
*/
package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ComputerResultStep;
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.TraversalVertexProgramStep;
import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
@@ -50,9 +52,14 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
// Add .profile() step after every pre-existing step.
final List<Step> steps = traversal.getSteps();
final int numSteps = steps.size();
- for (int ii = 0; ii < numSteps; ii++) {
+ for (int ii = 0; ii < numSteps; ii += 2) {
// Get the original step
- Step step = steps.get(ii * 2);
+ Step step = steps.get(ii);
+ if (step instanceof TraversalVertexProgramStep || step instanceof ComputerResultStep) {
+ ii--;
+ // don't profile the computer steps
+ continue;
+ }
// Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal.
if (step instanceof ProfileSideEffectStep) {
@@ -61,7 +68,7 @@ public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalSt
// Create and inject ProfileStep
ProfileStep profileStep = new ProfileStep(traversal);
- traversal.addStep((ii * 2) + 1, profileStep);
+ traversal.addStep(ii + 1, profileStep);
}
}
[03/12] incubator-tinkerpop git commit: Add play test for computer
profile
Posted by ok...@apache.org.
Add play test for computer profile
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/800cf0a4
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/800cf0a4
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/800cf0a4
Branch: refs/heads/master
Commit: 800cf0a46cf3d991c28aeb174f9692c0d6fa3f71
Parents: 3f25710
Author: rjbriody <bo...@datastax.com>
Authored: Thu Mar 17 17:52:31 2016 -0400
Committer: rjbriody <bo...@datastax.com>
Committed: Thu Mar 17 17:52:31 2016 -0400
----------------------------------------------------------------------
.../structure/TinkerGraphPlayTest.java | 29 ++++++--------------
1 file changed, 9 insertions(+), 20 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/800cf0a4/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
----------------------------------------------------------------------
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
index b655513..97aef31 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java
@@ -19,16 +19,13 @@
package org.apache.tinkerpop.gremlin.tinkergraph.structure;
import org.apache.tinkerpop.gremlin.process.computer.bulkloading.BulkLoaderVertexProgram;
-import org.apache.tinkerpop.gremlin.process.computer.ranking.pagerank.PageRankVertexProgram;
import org.apache.tinkerpop.gremlin.process.traversal.Operator;
-import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Scope;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
-import org.apache.tinkerpop.gremlin.structure.Column;
import org.apache.tinkerpop.gremlin.structure.Graph;
import org.apache.tinkerpop.gremlin.structure.T;
import org.apache.tinkerpop.gremlin.structure.Vertex;
@@ -45,23 +42,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.function.Supplier;
-import static org.apache.tinkerpop.gremlin.process.traversal.P.gt;
-import static org.apache.tinkerpop.gremlin.process.traversal.P.without;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.both;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.choose;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.count;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.fold;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.in;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.select;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.union;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.valueMap;
-import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.values;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*;
/**
* @author Stephen Mallette (http://stephen.genoprime.com)
@@ -70,6 +51,14 @@ public class TinkerGraphPlayTest {
private static final Logger logger = LoggerFactory.getLogger(TinkerGraphPlayTest.class);
@Test
+ public void testBob() {
+ GraphTraversalSource g = TinkerFactory.createModern().traversal().withComputer();
+ final GraphTraversal<Vertex, Long> traversal = g.V().hasLabel("person").bothE().count().profile("m");
+ traversal.iterate();
+ System.out.println(traversal.asAdmin().getSideEffects().get("m").toString());
+ }
+
+ @Test
@Ignore
public void testPlay8() throws Exception {
Graph graph = TinkerFactory.createModern();