This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch PopPoc in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 8d856cd68cc0ee04cad48e9208076278283d12f6 Author: Stephen Mallette <[email protected]> AuthorDate: Tue May 20 16:47:10 2025 -0400 Quick POC around providing access to scope/pop info --- .../process/traversal/step/PopContaining.java | 45 ++++++++++++++++++++++ .../gremlin/process/traversal/step/Scoping.java | 14 ++++++- .../process/traversal/step/TraversalParent.java | 15 +++++++- .../traversal/step/filter/DedupGlobalStep.java | 8 ++++ .../traversal/step/filter/WherePredicateStep.java | 8 ++++ .../traversal/step/filter/WhereTraversalStep.java | 8 ++++ .../traversal/step/map/AddEdgeStartStep.java | 10 ++++- .../process/traversal/step/map/AddEdgeStep.java | 9 +++++ .../traversal/step/map/AddVertexStartStep.java | 9 +++++ .../process/traversal/step/map/AddVertexStep.java | 9 +++++ .../process/traversal/step/map/FormatStep.java | 9 +++++ .../process/traversal/step/map/MatchStep.java | 8 ++++ .../process/traversal/step/map/MathStep.java | 8 ++++ .../process/traversal/step/map/SelectOneStep.java | 8 ++++ .../process/traversal/step/map/SelectStep.java | 8 ++++ .../traversal/step/map/TraversalSelectStep.java | 8 ++++ .../traversal/step/sideEffect/AddPropertyStep.java | 9 +++++ .../process/traversal/util/TraversalHelper.java | 12 +++++- 18 files changed, 201 insertions(+), 4 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PopContaining.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PopContaining.java new file mode 100644 index 0000000000..50f021b315 --- /dev/null +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/PopContaining.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.process.traversal.step; + +import org.apache.tinkerpop.gremlin.process.traversal.Pop; + +import java.util.Set; + +public interface PopContaining { + public Set<PopInstruction> getPopInstructions(); + + class PopInstruction { + private final Pop pop; + private final String label; + + public PopInstruction(final Pop pop, final String label) { + this.pop = pop; + this.label = label; + } + + public Pop getPop() { + return pop; + } + + public String getLabel() { + return label; + } + } +} diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java index e2c0e17747..08d700a836 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/Scoping.java @@ -23,6 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Pop; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; +import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -105,10 +106,21 @@ import java.util.Set; * @author Marko A. Rodriguez (http://markorodriguez.com) * @author Stephen Mallette (http://stephen.genoprime.com) */ -public interface Scoping { +public interface Scoping extends PopContaining { public enum Variable {START, END} + @Override + public default Set<PopInstruction> getPopInstructions() { + final Set<String> labels = this.getScopeKeys(); + final Set<PopInstruction> scopingInfoSet = new HashSet<>(); + for (String label : labels) { + final PopInstruction scopingInfo = new PopInstruction(Pop.last, label); + scopingInfoSet.add(scopingInfo); + } + return scopingInfoSet; + } + /** * Finds the object with the specified key for the current traverser and throws an exception if the key cannot * be found. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java index 695d2972fc..80d12b9a1b 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java @@ -21,16 +21,29 @@ package org.apache.tinkerpop.gremlin.process.traversal.step; import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import java.util.Collections; import java.util.EnumSet; +import java.util.HashSet; import java.util.List; import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public interface TraversalParent extends AutoCloseable { +public interface TraversalParent extends PopContaining, AutoCloseable { + @Override + public default Set<PopContaining.PopInstruction> getPopInstructions() { + final Set<PopContaining.PopInstruction> scopingInfos = new HashSet<>(); + for (final Traversal.Admin local: this.getLocalChildren()) { + scopingInfos.addAll(TraversalHelper.getPopInstructions(local)); + } + for (final Traversal.Admin global: this.getGlobalChildren()) { + scopingInfos.addAll(TraversalHelper.getPopInstructions(global)); + } + return scopingInfos; + } public default <S, E> List<Traversal.Admin<S, E>> getGlobalChildren() { return Collections.emptyList(); 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 ad4a762fe0..645a26683a 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 @@ -69,6 +69,14 @@ public final class DedupGlobalStep<S> extends FilterStep<S> implements Traversal this.dedupLabels = dedupLabels.length == 0 ? null : Collections.unmodifiableSet(new HashSet<>(Arrays.asList(dedupLabels))); } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override protected boolean filter(final Traverser.Admin<S> traverser) { if (this.onGraphComputer && !this.executingAtMaster) return true; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java index cffe3ebc8c..6ff02d8bde 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/WherePredicateStep.java @@ -110,6 +110,14 @@ public final class WherePredicateStep<S> extends FilterStep<S> implements Scopin this.startKey = null; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override protected boolean filter(final Traverser.Admin<S> traverser) { final TraversalProduct product = null == this.startKey ? 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 dde900348a..ea7b59e1ac 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 @@ -147,6 +147,14 @@ public final class WhereTraversalStep<S> extends FilterStep<S> implements Traver return this.keepLabels; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + ////////////////////////////// public static class WhereStartStep<S> extends ScalarMapStep<S, Object> implements Scoping { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java index 95907e9c7a..15c22b7a78 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java @@ -16,7 +16,6 @@ * 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.Step; @@ -42,6 +41,7 @@ import org.apache.tinkerpop.gremlin.structure.util.Attachable; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -68,6 +68,14 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> this.parameters.set(this, T.label, edgeLabelTraversal); } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { return this.parameters.getTraversals(); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java index f5f7280764..3c1504d24b 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java @@ -38,6 +38,7 @@ import org.apache.tinkerpop.gremlin.structure.util.Attachable; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -64,6 +65,14 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> this.parameters.set(this, T.label, edgeLabelTraversal); } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { return this.parameters.getTraversals(); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java index fd52f445e8..6421f800ab 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java @@ -37,6 +37,7 @@ import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -68,6 +69,14 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> return userProvidedLabel; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override public Parameters getParameters() { return this.parameters; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java index 0dfb55c2a1..25a71f5bbe 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java @@ -33,6 +33,7 @@ import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; +import java.util.HashSet; import java.util.List; import java.util.Set; @@ -63,6 +64,14 @@ public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> return userProvidedLabel; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override public Parameters getParameters() { return this.parameters; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FormatStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FormatStep.java index c4b50958d9..6f007d60cb 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FormatStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/FormatStep.java @@ -34,6 +34,7 @@ import org.apache.tinkerpop.gremlin.structure.Element; import org.apache.tinkerpop.gremlin.structure.Property; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; +import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Objects; @@ -74,6 +75,14 @@ public final class FormatStep<S> extends MapStep<S, String> implements ByModulat this.variables = getVariables(); } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override protected Traverser.Admin<String> processNextStart() { final Traverser.Admin traverser = this.starts.next(); 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 6de3970236..e3a0ed6a91 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 @@ -166,6 +166,14 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>> return this.connective; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + public void addGlobalChild(final Traversal.Admin<?, ?> globalChildTraversal) { this.configureStartAndEndSteps(globalChildTraversal); this.matchTraversals.add(this.integrateChild(globalChildTraversal)); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java index e36a1311c8..c2c458ec35 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MathStep.java @@ -199,6 +199,14 @@ public final class MathStep<S> extends MapStep<S, Double> implements ByModulatin return variables; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + /** * A wrapper for the {@code Expression} class. That class is not marked {@code Serializable} and therefore gives * problems in OLAP specifically with Spark. This wrapper allows the {@code Expression} to be serialized in that diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java index b2de4b002c..9b53a74099 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectOneStep.java @@ -53,6 +53,14 @@ public final class SelectOneStep<S, E> extends MapStep<S, E> implements Traversa this.selectKey = selectKey; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override protected Traverser.Admin<E> processNextStart() throws NoSuchElementException { final Traverser.Admin<S> traverser = this.starts.next(); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java index 24c9771ed2..6f5fd13161 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectStep.java @@ -144,6 +144,14 @@ public final class SelectStep<S, E> extends MapStep<S, Map<String, E>> implement return this.getSelfAndChildRequirements(TraverserRequirement.OBJECT, TraverserRequirement.SIDE_EFFECTS); } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override public Set<String> getScopeKeys() { return this.selectKeysSet; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TraversalSelectStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TraversalSelectStep.java index ff9f0996f5..f120b73a15 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TraversalSelectStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/TraversalSelectStep.java @@ -53,6 +53,14 @@ public final class TraversalSelectStep<S, E> extends MapStep<S, E> implements Tr this.keyTraversal = this.integrateChild(keyTraversal.asAdmin()); } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override protected Traverser.Admin<E> processNextStart() { final Traverser.Admin<S> traverser = this.starts.next(); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java index 3dfef89285..3ac4002f2a 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java @@ -38,6 +38,7 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.structure.util.keyed.KeyedProperty; import org.apache.tinkerpop.gremlin.structure.util.keyed.KeyedVertexProperty; +import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Objects; @@ -60,6 +61,14 @@ public class AddPropertyStep<S extends Element> extends SideEffectStep<S> this.cardinality = cardinality; } + @Override + public Set<PopInstruction> getPopInstructions() { + final Set<PopInstruction> popInstructions = new HashSet<>(); + popInstructions.addAll(Scoping.super.getPopInstructions()); + popInstructions.addAll(TraversalParent.super.getPopInstructions()); + return popInstructions; + } + @Override public Parameters getParameters() { return this.parameters; 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 19117d6e9a..ba232045d3 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 @@ -28,6 +28,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.lambda.ValueTraversal; import org.apache.tinkerpop.gremlin.process.traversal.lambda.TokenTraversal; import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating; import org.apache.tinkerpop.gremlin.process.traversal.step.HasContainerHolder; +import org.apache.tinkerpop.gremlin.process.traversal.step.PopContaining; 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.branch.RepeatStep; @@ -54,7 +55,6 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import java.util.ArrayList; import java.util.Collection; -import java.util.Comparator; import java.util.EnumSet; import java.util.HashSet; import java.util.LinkedHashSet; @@ -788,4 +788,14 @@ public final class TraversalHelper { } else return (T) traversal.addStep(new HasStep<>(traversal, hasContainer)); } + + public static <T extends Traversal.Admin<?, ?>> Set<PopContaining.PopInstruction> getPopInstructions(final T traversal) { + final Set<PopContaining.PopInstruction> scopingInfos = new HashSet<>(); + for (final Step step: traversal.getSteps()) { + if (step instanceof PopContaining) { + scopingInfos.addAll(((PopContaining) step).getPopInstructions()); + } + } + return scopingInfos; + } }
