I made it so ProfileStrategy uses the MARKER model developed by @dkuppitz and myself to reduce recurssive lookups in strategies. Moving forward, we really need to move to a Traversal.metadata model as using labeled steps is a bit hackish.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/3182a06d Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/3182a06d Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/3182a06d Branch: refs/heads/master Commit: 3182a06de4b39fb185b363444e59ce373536411e Parents: 181558c Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Fri Mar 17 11:57:52 2017 -0600 Committer: Stephen Mallette <sp...@genoprime.com> Committed: Wed Mar 29 11:22:58 2017 -0400 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 1 + .../strategy/finalization/ProfileStrategy.java | 39 +++++++++----------- 2 files changed, 19 insertions(+), 21 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3182a06d/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 8dd8d9a..926aa18 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* `ProfileStrategy` now uses the marker-model to reduce recrussive lookups of `ProfileSideEffectStep`. * `Mutating` steps now implement `Scoping` interface. * Fixed a step id compilation bug in `AddVertexStartStep`, `AddVertexStep`, `AddEdgeStep`, and `AddPropertyStep`. * De-registered metrics on Gremlin Server shutdown. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/3182a06d/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 6d08652..b5f0b86 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,13 +18,16 @@ */ package org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization; +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; 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.strategy.AbstractTraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; +import org.apache.tinkerpop.gremlin.structure.Graph; import java.util.List; @@ -34,34 +37,28 @@ import java.util.List; public final class ProfileStrategy extends AbstractTraversalStrategy<TraversalStrategy.FinalizationStrategy> implements TraversalStrategy.FinalizationStrategy { private static final ProfileStrategy INSTANCE = new ProfileStrategy(); + private static final String MARKER = Graph.Hidden.hide("gremlin.profile"); private ProfileStrategy() { } @Override public void apply(final Traversal.Admin<?, ?> traversal) { - if (TraversalHelper.hasStepOfAssignableClassRecursively(ProfileSideEffectStep.class, TraversalHelper.getRootTraversal(traversal).asAdmin())) { - prepTraversalForProfiling(traversal); - } - } - - // 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(); - for (int ii = 0; ii < numSteps; ii++) { - // Get the original step - 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) { - break; + if ((traversal.getParent() instanceof EmptyStep || traversal.getParent() instanceof VertexProgramStep) && + TraversalHelper.hasStepOfAssignableClassRecursively(ProfileSideEffectStep.class, traversal)) + TraversalHelper.applyTraversalRecursively(t -> t.getEndStep().addLabel(MARKER), traversal); + if (traversal.getEndStep().getLabels().contains(MARKER)) { + traversal.getEndStep().removeLabel(MARKER); + // Add .profile() step after every pre-existing step. + final List<Step> steps = traversal.getSteps(); + final int numSteps = steps.size(); + for (int i = 0; i < numSteps; i++) { + // Do not inject profiling after ProfileSideEffectStep as this will be the last step on the root traversal. + if (steps.get(i * 2) instanceof ProfileSideEffectStep) + break; + // Create and inject ProfileStep + traversal.addStep((i * 2) + 1, new ProfileStep(traversal)); } - - // Create and inject ProfileStep - ProfileStep profileStep = new ProfileStep(traversal); - traversal.addStep((ii * 2) + 1, profileStep); } }