nada.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/f3364102 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/f3364102 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/f3364102 Branch: refs/heads/TINKERPOP-1278 Commit: f33641023920e9ba9df73eb2c4888cdf42bc7f33 Parents: 97b12a4 Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Fri Jun 10 11:35:34 2016 -0600 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Fri Jun 10 11:35:34 2016 -0600 ---------------------------------------------------------------------- .../process/traversal/TraversalSource.java | 49 +++- .../process/traversal/TraversalStrategies.java | 11 + .../process/traversal/TraversalStrategy.java | 53 +++- .../traversal/dsl/graph/GraphTraversal.java | 243 ++++++++++++++++--- .../dsl/graph/GraphTraversalSource.java | 30 +++ .../script/ScriptGraphTraversalSource.java | 36 +-- .../process/traversal/step/map/GroupStep.java | 8 +- .../strategy/creation/TranslationStrategy.java | 95 ++++++++ .../process/traversal/util/Translator.java | 15 +- .../process/traversal/util/TraversalHelper.java | 28 +++ .../tinkerpop/gremlin/structure/Graph.java | 4 - .../step/sideEffect/GroovySackTest.groovy | 2 +- .../gremlin/groovy/GroovyTranslator.java | 31 ++- .../traversal/step/sideEffect/SackTest.java | 8 +- .../gremlin/python/PythonTranslator.java | 4 +- .../gremlin/groovy/GroovyProvider.java | 2 +- .../gremlin/python/PythonProvider.java | 3 +- 17 files changed, 523 insertions(+), 99 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f3364102/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java index cf0b51f..e29f20a 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalSource.java @@ -21,8 +21,11 @@ package org.apache.tinkerpop.gremlin.process.traversal; import org.apache.tinkerpop.gremlin.process.computer.Computer; import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.creation.TranslationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SackStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SideEffectStrategy; +import org.apache.tinkerpop.gremlin.process.traversal.util.Translator; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.util.function.ConstantSupplier; @@ -98,6 +101,7 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default TraversalSource withComputer(final Computer computer) { + TraversalHelper.addSourceToCreationStrategies(this, computer); Class<? extends GraphComputer> graphComputerClass; try { graphComputerClass = computer.apply(this.getGraph()).getClass(); @@ -113,6 +117,11 @@ public interface TraversalSource extends Cloneable { return this.withStrategies(traversalStrategies); } + public default TraversalSource withTranslator(final Translator<?> translator) { + TraversalHelper.addSourceToCreationStrategies(this, translator); + return this.withStrategies(new TranslationStrategy(translator)); + } + /** * Add a {@link GraphComputer} class used to execute the traversal. * This adds a {@link VertexProgramStrategy} to the strategies. @@ -121,6 +130,7 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default TraversalSource withComputer(final Class<? extends GraphComputer> graphComputerClass) { + TraversalHelper.addSourceToCreationStrategies(this, graphComputerClass); return this.withComputer(Computer.compute(graphComputerClass)); } @@ -131,6 +141,7 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default TraversalSource withComputer() { + TraversalHelper.addSourceToCreationStrategies(this); return this.withComputer(Computer.compute()); } @@ -144,6 +155,7 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSideEffect(final String key, final Supplier<A> initialValue, final BinaryOperator<A> reducer) { + TraversalHelper.addSourceToCreationStrategies(this, key, initialValue, reducer); final TraversalSource clone = this.clone(); SideEffectStrategy.addSideEffect(clone.getStrategies(), key, (A) initialValue, reducer); return clone; @@ -159,7 +171,10 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSideEffect(final String key, final A initialValue, final BinaryOperator<A> reducer) { - return this.withSideEffect(key, initialValue instanceof Supplier ? (Supplier) initialValue : new ConstantSupplier<>(initialValue), reducer); + TraversalHelper.addSourceToCreationStrategies(this, key, initialValue, reducer); + final TraversalSource clone = this.clone(); + SideEffectStrategy.addSideEffect(clone.getStrategies(), key, initialValue, reducer); + return clone; } /** @@ -171,7 +186,10 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSideEffect(final String key, final Supplier<A> initialValue) { - return this.withSideEffect(key, initialValue, (BinaryOperator<A>) null); + TraversalHelper.addSourceToCreationStrategies(this, key, initialValue); + final TraversalSource clone = this.clone(); + SideEffectStrategy.addSideEffect(clone.getStrategies(), key, initialValue, null); + return clone; } /** @@ -183,7 +201,10 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSideEffect(final String key, final A initialValue) { - return this.withSideEffect(key, initialValue instanceof Supplier ? (Supplier) initialValue : new ConstantSupplier<>(initialValue)); + TraversalHelper.addSourceToCreationStrategies(this, key, initialValue); + final TraversalSource clone = this.clone(); + SideEffectStrategy.addSideEffect(clone.getStrategies(), key, initialValue, null); + return clone; } /** @@ -196,6 +217,7 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) { + TraversalHelper.addSourceToCreationStrategies(this, initialValue, splitOperator, mergeOperator); return this.withStrategies(SackStrategy.<A>build().initialValue(initialValue).splitOperator(splitOperator).mergeOperator(mergeOperator).create()); } @@ -209,7 +231,8 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) { - return this.withSack(new ConstantSupplier<>(initialValue), splitOperator, mergeOperator); + TraversalHelper.addSourceToCreationStrategies(this, initialValue, splitOperator, mergeOperator); + return this.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).splitOperator(splitOperator).mergeOperator(mergeOperator).create()); } /** @@ -220,7 +243,8 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final A initialValue) { - return this.withSack(initialValue, null, null); + TraversalHelper.addSourceToCreationStrategies(this, initialValue); + return this.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).create()); } /** @@ -231,7 +255,8 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final Supplier<A> initialValue) { - return this.withSack(initialValue, (UnaryOperator<A>) null, null); + TraversalHelper.addSourceToCreationStrategies(this, initialValue); + return this.withStrategies(SackStrategy.<A>build().initialValue(initialValue).create()); } /** @@ -243,7 +268,8 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) { - return this.withSack(initialValue, splitOperator, null); + TraversalHelper.addSourceToCreationStrategies(this, initialValue, splitOperator); + return this.withStrategies(SackStrategy.<A>build().initialValue(initialValue).splitOperator(splitOperator).create()); } /** @@ -255,7 +281,8 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator) { - return this.withSack(initialValue, splitOperator, null); + TraversalHelper.addSourceToCreationStrategies(this, initialValue, splitOperator); + return this.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).splitOperator(splitOperator).create()); } /** @@ -267,7 +294,8 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final Supplier<A> initialValue, final BinaryOperator<A> mergeOperator) { - return this.withSack(initialValue, null, mergeOperator); + TraversalHelper.addSourceToCreationStrategies(this, initialValue, mergeOperator); + return this.withStrategies(SackStrategy.<A>build().initialValue(initialValue).mergeOperator(mergeOperator).create()); } /** @@ -279,7 +307,8 @@ public interface TraversalSource extends Cloneable { * @return a new traversal source with updated strategies */ public default <A> TraversalSource withSack(final A initialValue, final BinaryOperator<A> mergeOperator) { - return this.withSack(initialValue, null, mergeOperator); + TraversalHelper.addSourceToCreationStrategies(this, initialValue, mergeOperator); + return this.withStrategies(SackStrategy.<A>build().initialValue(new ConstantSupplier<>(initialValue)).mergeOperator(mergeOperator).create()); } /** http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f3364102/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java index 137abb9..8780d4e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java @@ -65,6 +65,17 @@ public interface TraversalStrategies extends Serializable, Cloneable { public List<TraversalStrategy<?>> toList(); /** + * Return all the {@link TraversalStrategy} instances associated with this {@link TraversalStrategies} and within a particular strategy class. + * + * @param traversalStrategyClass the strategy class to get the strategies for + * @param <T> the strategy class type + * @return a sorted list of strategies within the respective strategy class + */ + public default <T extends TraversalStrategy> List<T> getStrategies(final Class<T> traversalStrategyClass) { + return (List<T>) toList().stream().filter(s -> traversalStrategyClass.isAssignableFrom(s.getClass())).collect(Collectors.toList()); + } + + /** * Apply all the {@link TraversalStrategy} optimizers to the {@link Traversal} for the stated {@link TraversalEngine}. * This method must ensure that the strategies are sorted prior to application. * http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f3364102/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java index 84f0f1b..1241ef6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategy.java @@ -83,6 +83,39 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ /** * Implemented by strategies that adds "application logic" to the traversal (e.g. {@link PartitionStrategy}). */ + public interface CreationStrategy extends TraversalStrategy<CreationStrategy> { + + @Override + public default Class<CreationStrategy> getTraversalCategory() { + return CreationStrategy.class; + } + + @Override + public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) { + if (otherTraversalCategory.equals(CreationStrategy.class)) + return 0; + else if (otherTraversalCategory.equals(DecorationStrategy.class)) + return -1; + else if (otherTraversalCategory.equals(OptimizationStrategy.class)) + return -1; + else if (otherTraversalCategory.equals(ProviderOptimizationStrategy.class)) + return -1; + else if (otherTraversalCategory.equals(FinalizationStrategy.class)) + return -1; + else if (otherTraversalCategory.equals(VerificationStrategy.class)) + return -1; + else + return 0; + } + + public void addStep(final Traversal.Admin<?,?> traversal, final String stepName, final Object... arguments); + + public void addSource(final TraversalSource traversalSource, final String withName, final Object... arguments); + } + + /** + * Implemented by strategies that adds "application logic" to the traversal (e.g. {@link PartitionStrategy}). + */ public interface DecorationStrategy extends TraversalStrategy<DecorationStrategy> { @Override @@ -92,7 +125,9 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ @Override public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) { - if (otherTraversalCategory.equals(DecorationStrategy.class)) + if (otherTraversalCategory.equals(CreationStrategy.class)) + return 1; + else if (otherTraversalCategory.equals(DecorationStrategy.class)) return 0; else if (otherTraversalCategory.equals(OptimizationStrategy.class)) return -1; @@ -121,7 +156,9 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ @Override public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) { - if (otherTraversalCategory.equals(DecorationStrategy.class)) + if (otherTraversalCategory.equals(CreationStrategy.class)) + return 1; + else if (otherTraversalCategory.equals(DecorationStrategy.class)) return 1; else if (otherTraversalCategory.equals(OptimizationStrategy.class)) return 0; @@ -149,7 +186,9 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ @Override public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) { - if (otherTraversalCategory.equals(DecorationStrategy.class)) + if (otherTraversalCategory.equals(CreationStrategy.class)) + return 1; + else if (otherTraversalCategory.equals(DecorationStrategy.class)) return 1; else if (otherTraversalCategory.equals(OptimizationStrategy.class)) return 1; @@ -177,7 +216,9 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ @Override public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) { - if (otherTraversalCategory.equals(DecorationStrategy.class)) + if (otherTraversalCategory.equals(CreationStrategy.class)) + return 1; + else if (otherTraversalCategory.equals(DecorationStrategy.class)) return 1; else if (otherTraversalCategory.equals(OptimizationStrategy.class)) return 1; @@ -206,7 +247,9 @@ public interface TraversalStrategy<S extends TraversalStrategy> extends Serializ @Override public default int compareTo(final Class<? extends TraversalStrategy> otherTraversalCategory) { - if (otherTraversalCategory.equals(DecorationStrategy.class)) + if (otherTraversalCategory.equals(CreationStrategy.class)) + return 1; + else if (otherTraversalCategory.equals(DecorationStrategy.class)) return 1; else if (otherTraversalCategory.equals(OptimizationStrategy.class)) return 1; http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f3364102/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java index fa5ab5b..534b1ef 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java @@ -133,6 +133,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.HasContainer; import org.apache.tinkerpop.gremlin.process.traversal.step.util.Tree; import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalMetrics; import org.apache.tinkerpop.gremlin.structure.Column; import org.apache.tinkerpop.gremlin.structure.Direction; import org.apache.tinkerpop.gremlin.structure.Edge; @@ -192,10 +193,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link LambdaMapStep}. */ public default <E2> GraphTraversal<S, E2> map(final Function<Traverser<E>, E2> function) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function); return this.asAdmin().addStep(new LambdaMapStep<>(this.asAdmin(), function)); } public default <E2> GraphTraversal<S, E2> map(final Traversal<?, E2> mapTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), mapTraversal); return this.asAdmin().addStep(new TraversalMapStep<>(this.asAdmin(), mapTraversal)); } @@ -208,6 +211,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link LambdaFlatMapStep}. */ public default <E2> GraphTraversal<S, E2> flatMap(final Function<Traverser<E>, Iterator<E2>> function) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function); return this.asAdmin().addStep(new LambdaFlatMapStep<>(this.asAdmin(), function)); } @@ -220,6 +224,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link TraversalFlatMapStep}. */ public default <E2> GraphTraversal<S, E2> flatMap(final Traversal<?, E2> flatMapTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), flatMapTraversal); return this.asAdmin().addStep(new TraversalFlatMapStep<>(this.asAdmin(), flatMapTraversal)); } @@ -229,6 +234,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link IdStep}. */ public default GraphTraversal<S, Object> id() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new IdStep<>(this.asAdmin())); } @@ -238,6 +244,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link LabelStep}. */ public default GraphTraversal<S, String> label() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new LabelStep<>(this.asAdmin())); } @@ -247,6 +254,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link IdentityStep}. */ public default GraphTraversal<S, E> identity() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new IdentityStep<>(this.asAdmin())); } @@ -256,10 +264,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link ConstantStep}. */ public default <E2> GraphTraversal<S, E2> constant(final E2 e) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), e); return this.asAdmin().addStep(new ConstantStep<E, E2>(this.asAdmin(), e)); } public default GraphTraversal<S, Vertex> V(final Object... vertexIdsOrElements) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), vertexIdsOrElements); return this.asAdmin().addStep(new GraphStep<>(this.asAdmin(), Vertex.class, false, vertexIdsOrElements)); } @@ -271,6 +281,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Vertex> to(final Direction direction, final String... edgeLabels) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), direction, edgeLabels); return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, direction, edgeLabels)); } @@ -281,7 +292,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Vertex> out(final String... edgeLabels) { - return this.to(Direction.OUT, edgeLabels); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabels); + return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, Direction.OUT, edgeLabels)); } /** @@ -291,7 +303,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Vertex> in(final String... edgeLabels) { - return this.to(Direction.IN, edgeLabels); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabels); + return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, Direction.IN, edgeLabels)); } /** @@ -301,7 +314,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Vertex> both(final String... edgeLabels) { - return this.to(Direction.BOTH, edgeLabels); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabels); + return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Vertex.class, Direction.BOTH, edgeLabels)); } /** @@ -312,6 +326,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Edge> toE(final Direction direction, final String... edgeLabels) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), direction, edgeLabels); return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, direction, edgeLabels)); } @@ -322,7 +337,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Edge> outE(final String... edgeLabels) { - return this.toE(Direction.OUT, edgeLabels); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabels); + return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, Direction.OUT, edgeLabels)); } /** @@ -332,7 +348,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Edge> inE(final String... edgeLabels) { - return this.toE(Direction.IN, edgeLabels); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabels); + return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, Direction.IN, edgeLabels)); } /** @@ -342,7 +359,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link VertexStep}. */ public default GraphTraversal<S, Edge> bothE(final String... edgeLabels) { - return this.toE(Direction.BOTH, edgeLabels); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabels); + return this.asAdmin().addStep(new VertexStep<>(this.asAdmin(), Edge.class, Direction.BOTH, edgeLabels)); } /** @@ -352,6 +370,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link EdgeVertexStep}. */ public default GraphTraversal<S, Vertex> toV(final Direction direction) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), direction); return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), direction)); } @@ -361,7 +380,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link EdgeVertexStep}. */ public default GraphTraversal<S, Vertex> inV() { - return this.toV(Direction.IN); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), Direction.IN)); } /** @@ -370,7 +390,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link EdgeVertexStep}. */ public default GraphTraversal<S, Vertex> outV() { - return this.toV(Direction.OUT); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), Direction.OUT)); } /** @@ -379,7 +400,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link EdgeVertexStep}. */ public default GraphTraversal<S, Vertex> bothV() { - return this.toV(Direction.BOTH); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new EdgeVertexStep(this.asAdmin(), Direction.BOTH)); } /** @@ -388,6 +410,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link EdgeOtherVertexStep}. */ public default GraphTraversal<S, Vertex> otherV() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new EdgeOtherVertexStep(this.asAdmin())); } @@ -397,7 +420,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link OrderGlobalStep}. */ public default GraphTraversal<S, E> order() { - return this.order(Scope.global); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new OrderGlobalStep<>(this.asAdmin())); } /** @@ -407,6 +431,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link OrderGlobalStep} or {@link OrderLocalStep}. */ public default GraphTraversal<S, E> order(final Scope scope) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope); return this.asAdmin().addStep(scope.equals(Scope.global) ? new OrderGlobalStep<>(this.asAdmin()) : new OrderLocalStep<>(this.asAdmin())); } @@ -419,6 +444,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertiesStep}. */ public default <E2> GraphTraversal<S, ? extends Property<E2>> properties(final String... propertyKeys) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), propertyKeys); return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.PROPERTY, propertyKeys)); } @@ -431,6 +457,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertiesStep}. */ public default <E2> GraphTraversal<S, E2> values(final String... propertyKeys) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), propertyKeys); return this.asAdmin().addStep(new PropertiesStep<>(this.asAdmin(), PropertyType.VALUE, propertyKeys)); } @@ -443,6 +470,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertyMapStep}. */ public default <E2> GraphTraversal<S, Map<String, E2>> propertyMap(final String... propertyKeys) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), propertyKeys); return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.PROPERTY, propertyKeys)); } @@ -455,6 +483,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertyMapStep}. */ public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final String... propertyKeys) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), propertyKeys); return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), false, PropertyType.VALUE, propertyKeys)); } @@ -468,11 +497,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertyMapStep}. */ public default <E2> GraphTraversal<S, Map<String, E2>> valueMap(final boolean includeTokens, final String... propertyKeys) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), includeTokens, propertyKeys); return this.asAdmin().addStep(new PropertyMapStep<>(this.asAdmin(), includeTokens, PropertyType.VALUE, propertyKeys)); } public default <E2> GraphTraversal<S, Collection<E2>> select(final Column column) { - return this.map(new ColumnTraversal(column)); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), column); + return this.asAdmin().addStep(new TraversalMapStep<>(this.asAdmin(), new ColumnTraversal(column))); } /** @@ -497,6 +528,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertyKeyStep}. */ public default GraphTraversal<S, String> key() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new PropertyKeyStep(this.asAdmin())); } @@ -506,6 +538,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PropertyValueStep}. */ public default <E2> GraphTraversal<S, E2> value() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new PropertyValueStep<>(this.asAdmin())); } @@ -515,6 +548,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link PathStep}. */ public default GraphTraversal<S, Path> path() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new PathStep<>(this.asAdmin())); } @@ -526,6 +560,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link MatchStep}. */ public default <E2> GraphTraversal<S, Map<String, E2>> match(final Traversal<?, ?>... matchTraversals) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), matchTraversals); return this.asAdmin().addStep(new MatchStep<>(this.asAdmin(), ConnectiveStep.Connective.AND, matchTraversals)); } @@ -536,10 +571,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link SackStep}. */ public default <E2> GraphTraversal<S, E2> sack() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new SackStep<>(this.asAdmin())); } public default GraphTraversal<S, Integer> loops() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new LoopsStep<>(this.asAdmin())); } @@ -547,6 +584,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { final String[] projectKeys = new String[otherProjectKeys.length + 1]; projectKeys[0] = projectKey; System.arraycopy(otherProjectKeys, 0, projectKeys, 1, otherProjectKeys.length); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), projectKeys); return this.asAdmin().addStep(new ProjectStep<>(this.asAdmin(), projectKeys)); } @@ -565,6 +603,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { selectKeys[0] = selectKey1; selectKeys[1] = selectKey2; System.arraycopy(otherSelectKeys, 0, selectKeys, 2, otherSelectKeys.length); + if (null == pop) + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), selectKeys); + else + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), pop, selectKeys); return this.asAdmin().addStep(new SelectStep<>(this.asAdmin(), pop, selectKeys)); } @@ -582,22 +624,27 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default <E2> GraphTraversal<S, E2> select(final Pop pop, final String selectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), pop, selectKey); return this.asAdmin().addStep(new SelectOneStep<>(this.asAdmin(), pop, selectKey)); } public default <E2> GraphTraversal<S, E2> select(final String selectKey) { - return this.select(null, selectKey); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), selectKey); + return this.asAdmin().addStep(new SelectOneStep<>(this.asAdmin(), null, selectKey)); } public default <E2> GraphTraversal<S, E2> unfold() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new UnfoldStep<>(this.asAdmin())); } public default GraphTraversal<S, List<E>> fold() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new FoldStep<>(this.asAdmin())); } public default <E2> GraphTraversal<S, E2> fold(final E2 seed, final BiFunction<E2, E, E2> foldFunction) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), seed, foldFunction); return this.asAdmin().addStep(new FoldStep<>(this.asAdmin(), new ConstantSupplier<>(seed), foldFunction)); // TODO: User should provide supplier? } @@ -607,10 +654,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link CountGlobalStep}. */ public default GraphTraversal<S, Long> count() { - return this.count(Scope.global); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new CountGlobalStep<>(this.asAdmin())); } public default GraphTraversal<S, Long> count(final Scope scope) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope); return this.asAdmin().addStep(scope.equals(Scope.global) ? new CountGlobalStep<>(this.asAdmin()) : new CountLocalStep<>(this.asAdmin())); } @@ -620,38 +669,47 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link SumGlobalStep}. */ public default <E2 extends Number> GraphTraversal<S, E2> sum() { - return this.sum(Scope.global); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new SumGlobalStep<>(this.asAdmin())); } public default <E2 extends Number> GraphTraversal<S, E2> sum(final Scope scope) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope); return this.asAdmin().addStep(scope.equals(Scope.global) ? new SumGlobalStep<>(this.asAdmin()) : new SumLocalStep(this.asAdmin())); } public default <E2 extends Number> GraphTraversal<S, E2> max() { - return this.max(Scope.global); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new MaxGlobalStep<>(this.asAdmin())); } public default <E2 extends Number> GraphTraversal<S, E2> max(final Scope scope) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope); return this.asAdmin().addStep(scope.equals(Scope.global) ? new MaxGlobalStep<>(this.asAdmin()) : new MaxLocalStep(this.asAdmin())); } public default <E2 extends Number> GraphTraversal<S, E2> min() { - return this.min(Scope.global); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new MinGlobalStep<>(this.asAdmin())); } public default <E2 extends Number> GraphTraversal<S, E2> min(final Scope scope) { - return this.asAdmin().addStep(scope.equals(Scope.global) ? new MinGlobalStep<>(this.asAdmin()) : new MinLocalStep(this.asAdmin())); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope); + return this.asAdmin().addStep(scope.equals(Scope.global) ? new MinGlobalStep<E2>(this.asAdmin()) : new MinLocalStep<>(this.asAdmin())); } public default <E2 extends Number> GraphTraversal<S, E2> mean() { - return this.mean(Scope.global); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new MeanGlobalStep<>(this.asAdmin())); } public default <E2 extends Number> GraphTraversal<S, E2> mean(final Scope scope) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope); return this.asAdmin().addStep(scope.equals(Scope.global) ? new MeanGlobalStep<>(this.asAdmin()) : new MeanLocalStep(this.asAdmin())); } public default <K, V> GraphTraversal<S, Map<K, V>> group() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new GroupStep<>(this.asAdmin())); } @@ -660,22 +718,27 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { */ @Deprecated public default <K, V> GraphTraversal<S, Map<K, V>> groupV3d0() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new GroupStepV3d0<>(this.asAdmin())); } public default <K> GraphTraversal<S, Map<K, Long>> groupCount() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new GroupCountStep<>(this.asAdmin())); } public default GraphTraversal<S, Tree> tree() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new TreeStep<>(this.asAdmin())); } public default GraphTraversal<S, Vertex> addV(final String vertexLabel) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), vertexLabel); return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), vertexLabel)); } public default GraphTraversal<S, Vertex> addV() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new AddVertexStep<>(this.asAdmin(), null)); } @@ -685,28 +748,38 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { @Deprecated public default GraphTraversal<S, Vertex> addV(final Object... propertyKeyValues) { this.addV(); - ((AddVertexStep) this.asAdmin().getEndStep()).addPropertyMutations(propertyKeyValues); + for (int i = 0; i < propertyKeyValues.length; i = i + 2) { + this.property(propertyKeyValues[i], propertyKeyValues[i + 1]); + } + //((AddVertexStep) this.asAdmin().getEndStep()).addPropertyMutations(propertyKeyValues); return (GraphTraversal<S, Vertex>) this; } public default GraphTraversal<S, Edge> addE(final String edgeLabel) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), edgeLabel); return this.asAdmin().addStep(new AddEdgeStep<>(this.asAdmin(), edgeLabel)); } public default GraphTraversal<S, E> to(final String toStepLabel) { - return this.to(__.select(toStepLabel)); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), toStepLabel); + ((AddEdgeStep) this.asAdmin().getEndStep()).addFrom(__.select(toStepLabel)); + return this; } public default GraphTraversal<S, E> from(final String fromStepLabel) { - return this.from(__.select(fromStepLabel)); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), fromStepLabel); + ((AddEdgeStep) this.asAdmin().getEndStep()).addFrom(__.select(fromStepLabel)); + return this; } public default GraphTraversal<S, E> to(final Traversal<E, Vertex> toVertex) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), toVertex); ((AddEdgeStep) this.asAdmin().getEndStep()).addTo(toVertex); return this; } public default GraphTraversal<S, E> from(final Traversal<E, Vertex> fromVertex) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), fromVertex); ((AddEdgeStep) this.asAdmin().getEndStep()).addFrom(fromVertex); return this; } @@ -723,7 +796,11 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { this.to(edgeLabelOrSecondVertexKey); else this.from(edgeLabelOrSecondVertexKey); - ((Mutating) this.asAdmin().getEndStep()).addPropertyMutations(propertyKeyValues); + + for (int i = 0; i < propertyKeyValues.length; i = i + 2) { + this.property(propertyKeyValues[i], propertyKeyValues[i + 1]); + } + // ((Mutating) this.asAdmin().getEndStep()).addPropertyMutations(propertyKeyValues); return (GraphTraversal<S, Edge>) this; } else { // addInE("a", "co-developer", "b", "year", 2009) @@ -732,7 +809,11 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { this.from(firstVertexKeyOrEdgeLabel).to((String) propertyKeyValues[0]); else this.to(firstVertexKeyOrEdgeLabel).from((String) propertyKeyValues[0]); - ((Mutating) this.asAdmin().getEndStep()).addPropertyMutations(Arrays.copyOfRange(propertyKeyValues, 1, propertyKeyValues.length)); + final Object[] temp = Arrays.copyOfRange(propertyKeyValues, 1, propertyKeyValues.length); + for (int i = 0; i < temp.length; i = i + 2) { + this.property(temp[i], temp[i + 1]); + } + // ((Mutating) this.asAdmin().getEndStep()).addPropertyMutations(Arrays.copyOfRange(propertyKeyValues, 1, propertyKeyValues.length)); return (GraphTraversal<S, Edge>) this; } } @@ -756,22 +837,27 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { ///////////////////// FILTER STEPS ///////////////////// public default GraphTraversal<S, E> filter(final Predicate<Traverser<E>> predicate) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), predicate); return this.asAdmin().addStep(new LambdaFilterStep<>(this.asAdmin(), predicate)); } public default GraphTraversal<S, E> filter(final Traversal<?, ?> filterTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), filterTraversal); return this.asAdmin().addStep(new TraversalFilterStep<>(this.asAdmin(), (Traversal) filterTraversal)); } public default GraphTraversal<S, E> or(final Traversal<?, ?>... orTraversals) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), orTraversals); return this.asAdmin().addStep(new OrStep(this.asAdmin(), orTraversals)); } public default GraphTraversal<S, E> and(final Traversal<?, ?>... andTraversals) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), andTraversals); return this.asAdmin().addStep(new AndStep(this.asAdmin(), andTraversals)); } public default GraphTraversal<S, E> inject(final E... injections) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), injections); return this.asAdmin().addStep(new InjectStep<>(this.asAdmin(), injections)); } @@ -783,6 +869,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link DedupGlobalStep}. */ public default GraphTraversal<S, E> dedup(final Scope scope, final String... dedupLabels) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, dedupLabels); return this.asAdmin().addStep(scope.equals(Scope.global) ? new DedupGlobalStep<>(this.asAdmin(), dedupLabels) : new DedupLocalStep(this.asAdmin())); } @@ -793,29 +880,35 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link DedupGlobalStep}. */ public default GraphTraversal<S, E> dedup(final String... dedupLabels) { - return this.dedup(Scope.global, dedupLabels); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), dedupLabels); + return this.asAdmin().addStep(new DedupGlobalStep<>(this.asAdmin(), dedupLabels)); } public default GraphTraversal<S, E> where(final String startKey, final P<String> predicate) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), startKey, predicate); return this.asAdmin().addStep(new WherePredicateStep<>(this.asAdmin(), Optional.ofNullable(startKey), predicate)); } public default GraphTraversal<S, E> where(final P<String> predicate) { - return this.where(null, predicate); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), predicate); + return this.asAdmin().addStep(new WherePredicateStep<>(this.asAdmin(), Optional.empty(), predicate)); } public default GraphTraversal<S, E> where(final Traversal<?, ?> whereTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), whereTraversal); return TraversalHelper.getVariableLocations(whereTraversal.asAdmin()).isEmpty() ? - this.filter(whereTraversal) : + this.asAdmin().addStep(new TraversalFilterStep<>(this.asAdmin(), (Traversal) whereTraversal)) : this.asAdmin().addStep(new WhereTraversalStep<>(this.asAdmin(), whereTraversal)); } public default GraphTraversal<S, E> has(final String propertyKey, final P<?> predicate) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), propertyKey, predicate); return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(propertyKey, predicate))); } public default GraphTraversal<S, E> has(final T accessor, final P<?> predicate) { - return this.has(accessor.getAccessor(), predicate); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), accessor, predicate); + return this.asAdmin().addStep(new HasStep(this.asAdmin(), HasContainer.makeHasContainers(accessor.getAccessor(), predicate))); } public default GraphTraversal<S, E> has(final String propertyKey, final Object value) { @@ -844,7 +937,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> has(final String propertyKey, final Traversal<?, ?> propertyTraversal) { - return this.filter(propertyTraversal.asAdmin().addStep(0, new PropertiesStep(propertyTraversal.asAdmin(), PropertyType.VALUE, propertyKey))); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), propertyKey, propertyTraversal); + return this.asAdmin().addStep( + new TraversalFilterStep<>(this.asAdmin(), propertyTraversal.asAdmin().addStep(0, + new PropertiesStep(propertyTraversal.asAdmin(), PropertyType.VALUE, propertyKey)))); } public default GraphTraversal<S, E> has(final String propertyKey) { @@ -872,6 +968,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> is(final P<E> predicate) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), predicate); return this.asAdmin().addStep(new IsStep<>(this.asAdmin(), predicate)); } @@ -886,6 +983,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> not(final Traversal<?, ?> notTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), notTraversal); return this.asAdmin().addStep(new NotStep<>(this.asAdmin(), (Traversal<E, ?>) notTraversal)); } @@ -896,40 +994,53 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link CoinStep}. */ public default GraphTraversal<S, E> coin(final double probability) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), probability); return this.asAdmin().addStep(new CoinStep<>(this.asAdmin(), probability)); } public default GraphTraversal<S, E> range(final long low, final long high) { - return this.<E>range(Scope.global, low, high); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), low, high); + return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), low, high)); } public default <E2> GraphTraversal<S, E2> range(final Scope scope, final long low, final long high) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, low, high); return this.asAdmin().addStep(scope.equals(Scope.global) ? new RangeGlobalStep<>(this.asAdmin(), low, high) : new RangeLocalStep<>(this.asAdmin(), low, high)); } public default GraphTraversal<S, E> limit(final long limit) { - return this.<E>range(Scope.global, 0, limit); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), limit); + return this.asAdmin().addStep(new RangeGlobalStep<>(this.asAdmin(), 0, limit)); } public default <E2> GraphTraversal<S, E2> limit(final Scope scope, final long limit) { - return this.range(scope, 0, limit); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, limit); + return this.asAdmin().addStep(scope.equals(Scope.global) + ? new RangeGlobalStep<>(this.asAdmin(), 0, limit) + : new RangeLocalStep<>(this.asAdmin(), 0, limit)); } public default GraphTraversal<S, E> tail() { - return this.tail(1); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin().addStep(new TailGlobalStep<>(this.asAdmin(), 1)); } public default GraphTraversal<S, E> tail(final long limit) { - return this.tail(Scope.global, limit); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), limit); + return this.asAdmin().addStep(new TailGlobalStep<>(this.asAdmin(), limit)); } public default <E2> GraphTraversal<S, E2> tail(final Scope scope) { - return this.<E2>tail(scope, 1); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope); + return this.asAdmin().addStep(scope.equals(Scope.global) + ? new TailGlobalStep<>(this.asAdmin(), 1) + : new TailLocalStep<>(this.asAdmin(), 1)); } public default <E2> GraphTraversal<S, E2> tail(final Scope scope, final long limit) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, limit); return this.asAdmin().addStep(scope.equals(Scope.global) ? new TailGlobalStep<>(this.asAdmin(), limit) : new TailLocalStep<>(this.asAdmin(), limit)); @@ -942,6 +1053,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link TimeLimitStep} */ public default GraphTraversal<S, E> timeLimit(final long timeLimit) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), timeLimit); return this.asAdmin().addStep(new TimeLimitStep<E>(this.asAdmin(), timeLimit)); } @@ -951,6 +1063,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link SimplePathStep}. */ public default GraphTraversal<S, E> simplePath() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new SimplePathStep<>(this.asAdmin())); } @@ -960,46 +1073,56 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @return the traversal with an appended {@link CyclicPathStep}. */ public default GraphTraversal<S, E> cyclicPath() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new CyclicPathStep<>(this.asAdmin())); } public default GraphTraversal<S, E> sample(final int amountToSample) { - return this.sample(Scope.global, amountToSample); + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), amountToSample); + return this.asAdmin().addStep(new SampleGlobalStep<>(this.asAdmin(), amountToSample)); } public default GraphTraversal<S, E> sample(final Scope scope, final int amountToSample) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), scope, amountToSample); return this.asAdmin().addStep(scope.equals(Scope.global) ? new SampleGlobalStep<>(this.asAdmin(), amountToSample) : new SampleLocalStep<>(this.asAdmin(), amountToSample)); } public default GraphTraversal<S, E> drop() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep(new DropStep<>(this.asAdmin())); } ///////////////////// SIDE-EFFECT STEPS ///////////////////// public default GraphTraversal<S, E> sideEffect(final Consumer<Traverser<E>> consumer) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), consumer); return this.asAdmin().addStep(new LambdaSideEffectStep<>(this.asAdmin(), consumer)); } public default GraphTraversal<S, E> sideEffect(final Traversal<?, ?> sideEffectTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectTraversal); return this.asAdmin().addStep(new TraversalSideEffectStep<>(this.asAdmin(), (Traversal) sideEffectTraversal)); } public default <E2> GraphTraversal<S, E2> cap(final String sideEffectKey, final String... sideEffectKeys) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey, sideEffectKeys); return this.asAdmin().addStep(new SideEffectCapStep<>(this.asAdmin(), sideEffectKey, sideEffectKeys)); } public default GraphTraversal<S, Edge> subgraph(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new SubgraphStep(this.asAdmin(), sideEffectKey)); } public default GraphTraversal<S, E> aggregate(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new AggregateStep<>(this.asAdmin(), sideEffectKey)); } public default GraphTraversal<S, E> group(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new GroupSideEffectStep<>(this.asAdmin(), sideEffectKey)); } @@ -1007,18 +1130,22 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @deprecated As of release 3.1.0, replaced by {@link #group(String)}. */ public default GraphTraversal<S, E> groupV3d0(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new GroupSideEffectStepV3d0<>(this.asAdmin(), sideEffectKey)); } public default GraphTraversal<S, E> groupCount(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new GroupCountSideEffectStep<>(this.asAdmin(), sideEffectKey)); } public default GraphTraversal<S, E> tree(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new TreeSideEffectStep<>(this.asAdmin(), sideEffectKey)); } public default <V, U> GraphTraversal<S, E> sack(final BiFunction<V, U, V> sackOperator) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sackOperator); return this.asAdmin().addStep(new SackValueStep<>(this.asAdmin(), sackOperator)); } @@ -1031,13 +1158,23 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> store(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new StoreStep<>(this.asAdmin(), sideEffectKey)); } public default GraphTraversal<S, E> profile(final String sideEffectKey) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), sideEffectKey); return this.asAdmin().addStep(new ProfileSideEffectStep<>(this.asAdmin(), sideEffectKey)); } + @Override + public default GraphTraversal<S, TraversalMetrics> profile() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return this.asAdmin() + .addStep(new ProfileSideEffectStep<>(this.asAdmin(), ProfileSideEffectStep.DEFAULT_METRICS_KEY)) + .addStep(new SideEffectCapStep<Object, TraversalMetrics>(this.asAdmin(), ProfileSideEffectStep.DEFAULT_METRICS_KEY)); + } + /** * Sets a {@link Property} value and related meta properties if supplied, if supported by the {@link Graph} * and if the {@link Element} is a {@link VertexProperty}. This method is the long-hand version of @@ -1056,6 +1193,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * @param keyValues any meta properties to be assigned to this property */ public default GraphTraversal<S, E> property(final VertexProperty.Cardinality cardinality, final Object key, final Object value, final Object... keyValues) { + if (null == cardinality) + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), key, value, keyValues); + else + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), cardinality, key, value, keyValues); // if it can be detected that this call to property() is related to an addV/E() then we can attempt to fold // the properties into that step to gain an optimization for those graphs that support such capabilities. if ((this.asAdmin().getEndStep() instanceof AddVertexStep || this.asAdmin().getEndStep() instanceof AddEdgeStep @@ -1089,6 +1230,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { ///////////////////// BRANCH STEPS ///////////////////// public default <M, E2> GraphTraversal<S, E2> branch(final Traversal<?, M> branchTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), branchTraversal); final BranchStep<E, E2, M> branchStep = new BranchStep<>(this.asAdmin()); branchStep.setBranchTraversal((Traversal.Admin<E, M>) branchTraversal); return this.asAdmin().addStep(branchStep); @@ -1099,11 +1241,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default <M, E2> GraphTraversal<S, E2> choose(final Traversal<?, M> choiceTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), choiceTraversal); return this.asAdmin().addStep(new ChooseStep<>(this.asAdmin(), (Traversal.Admin<E, M>) choiceTraversal)); } public default <E2> GraphTraversal<S, E2> choose(final Traversal<?, ?> traversalPredicate, final Traversal<?, E2> trueChoice, final Traversal<?, E2> falseChoice) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), traversalPredicate, trueChoice, falseChoice); return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) traversalPredicate, (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice)); } @@ -1121,18 +1265,22 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default <E2> GraphTraversal<S, E2> union(final Traversal<?, E2>... unionTraversals) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), unionTraversals); return this.asAdmin().addStep(new UnionStep(this.asAdmin(), Arrays.copyOf(unionTraversals, unionTraversals.length, Traversal.Admin[].class))); } public default <E2> GraphTraversal<S, E2> coalesce(final Traversal<?, E2>... coalesceTraversals) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), coalesceTraversals); return this.asAdmin().addStep(new CoalesceStep(this.asAdmin(), Arrays.copyOf(coalesceTraversals, coalesceTraversals.length, Traversal.Admin[].class))); } public default GraphTraversal<S, E> repeat(final Traversal<?, E> repeatTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), repeatTraversal); return RepeatStep.addRepeatToTraversal(this, (Traversal.Admin<E, E>) repeatTraversal); } public default GraphTraversal<S, E> emit(final Traversal<?, ?> emitTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), emitTraversal); return RepeatStep.addEmitToTraversal(this, (Traversal.Admin<E, ?>) emitTraversal); } @@ -1141,10 +1289,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> emit() { - return this.emit(TrueTraversal.instance()); + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); + return RepeatStep.addEmitToTraversal(this, TrueTraversal.instance()); } public default GraphTraversal<S, E> until(final Traversal<?, ?> untilTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), untilTraversal); return RepeatStep.addUntilToTraversal(this, (Traversal.Admin<E, ?>) untilTraversal); } @@ -1153,14 +1303,16 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> times(final int maxLoops) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), maxLoops); if (this.asAdmin().getEndStep() instanceof TimesModulating) { ((TimesModulating) this.asAdmin().getEndStep()).modulateTimes(maxLoops); return this; } else - return this.until(new LoopTraversal<>(maxLoops)); + return RepeatStep.addUntilToTraversal(this, new LoopTraversal<>(maxLoops)); } public default <E2> GraphTraversal<S, E2> local(final Traversal<?, E2> localTraversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), localTraversal); return this.asAdmin().addStep(new LocalStep<>(this.asAdmin(), localTraversal.asAdmin())); } @@ -1171,10 +1323,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> pageRank(final double alpha) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), alpha); return this.asAdmin().addStep((Step<E, E>) new PageRankVertexProgramStep(this.asAdmin(), alpha)); } public default GraphTraversal<S, E> peerPressure() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); return this.asAdmin().addStep((Step<E, E>) new PeerPressureVertexProgramStep(this.asAdmin())); } @@ -1185,6 +1339,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { ///////////////////// UTILITY STEPS ///////////////////// public default GraphTraversal<S, E> as(final String stepLabel, final String... stepLabels) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), stepLabel, stepLabels); if (this.asAdmin().getSteps().size() == 0) this.asAdmin().addStep(new StartStep<>(this.asAdmin())); final Step<?, E> endStep = this.asAdmin().getEndStep(); endStep.addLabel(stepLabel); @@ -1199,10 +1354,12 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { } public default GraphTraversal<S, E> barrier(final int maxBarrierSize) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), maxBarrierSize); return this.asAdmin().addStep(new NoOpBarrierStep<>(this.asAdmin(), maxBarrierSize)); } public default GraphTraversal<S, E> barrier(final Consumer<TraverserSet<Object>> barrierConsumer) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), barrierConsumer); return this.asAdmin().addStep(new LambdaCollectingBarrierStep<>(this.asAdmin(), (Consumer) barrierConsumer, Integer.MAX_VALUE)); } @@ -1210,26 +1367,31 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { //// BY-MODULATORS public default GraphTraversal<S, E> by() { + TraversalHelper.addStepToCreationStrategies(this.asAdmin()); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(); return this; } public default GraphTraversal<S, E> by(final Traversal<?, ?> traversal) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), traversal); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(traversal.asAdmin()); return this; } public default GraphTraversal<S, E> by(final T token) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), token); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(token); return this; } public default GraphTraversal<S, E> by(final String key) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), key); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(key); return this; } public default <V> GraphTraversal<S, E> by(final Function<V, Object> function) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(function); return this; } @@ -1237,21 +1399,25 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { //// COMPARATOR BY-MODULATORS public default <V> GraphTraversal<S, E> by(final Traversal<?, ?> traversal, final Comparator<V> comparator) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), traversal, comparator); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(traversal.asAdmin(), comparator); return this; } public default GraphTraversal<S, E> by(final Comparator<E> comparator) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), comparator); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(comparator); return this; } public default GraphTraversal<S, E> by(final Order order) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), order); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(order); return this; } public default <V> GraphTraversal<S, E> by(final String key, final Comparator<V> comparator) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), key, comparator); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(key, comparator); return this; } @@ -1267,6 +1433,7 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { }*/ public default <U> GraphTraversal<S, E> by(final Function<U, Object> function, final Comparator comparator) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), function, comparator); ((ByModulating) this.asAdmin().getEndStep()).modulateBy(function, comparator); return this; } @@ -1274,11 +1441,13 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { //// public default <M, E2> GraphTraversal<S, E> option(final M pickToken, final Traversal<E, E2> traversalOption) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), pickToken, traversalOption); ((TraversalOptionParent<M, E, E2>) this.asAdmin().getEndStep()).addGlobalChildOption(pickToken, traversalOption.asAdmin()); return this; } public default <E2> GraphTraversal<S, E> option(final Traversal<E, E2> traversalOption) { + TraversalHelper.addStepToCreationStrategies(this.asAdmin(), traversalOption); return this.option(TraversalOptionParent.Pick.any, traversalOption.asAdmin()); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f3364102/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java index 720d529..58e97e2 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalSource.java @@ -28,8 +28,11 @@ import org.apache.tinkerpop.gremlin.process.traversal.engine.ComputerTraversalEn import org.apache.tinkerpop.gremlin.process.traversal.engine.StandardTraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.step.map.AddVertexStartStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.creation.TranslationStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.RequirementsStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; +import org.apache.tinkerpop.gremlin.process.traversal.util.Translator; +import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Transaction; @@ -93,6 +96,11 @@ public class GraphTraversalSource implements TraversalSource { //// CONFIGURATIONS @Override + public GraphTraversalSource withTranslator(final Translator<?> translator) { + return (GraphTraversalSource) TraversalSource.super.withTranslator(translator); + } + + @Override public GraphTraversalSource withComputer(final Computer computer) { return (GraphTraversalSource) TraversalSource.super.withComputer(computer); } @@ -179,6 +187,7 @@ public class GraphTraversalSource implements TraversalSource { } public GraphTraversalSource withBulk(final boolean useBulk) { + TraversalHelper.addSourceToCreationStrategies(this, useBulk); if (!useBulk) { final GraphTraversalSource clone = this.clone(); RequirementsStrategy.addRequirements(clone.strategies, TraverserRequirement.ONE_BULK); @@ -189,6 +198,7 @@ public class GraphTraversalSource implements TraversalSource { } public GraphTraversalSource withPath() { + TraversalHelper.addSourceToCreationStrategies(this); final GraphTraversalSource clone = this.clone(); RequirementsStrategy.addRequirements(clone.strategies, TraverserRequirement.PATH); return clone; @@ -201,19 +211,31 @@ public class GraphTraversalSource implements TraversalSource { */ @Deprecated public GraphTraversal<Vertex, Vertex> addV(final Object... keyValues) { + TraversalStrategies temp = this.strategies; + this.strategies = this.strategies.clone(); + TraversalHelper.addSourceToCreationStrategies(this, keyValues); final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal(); + this.strategies = temp; traversal.addStep(new AddVertexStartStep(traversal, null)); ((AddVertexStartStep) traversal.getEndStep()).addPropertyMutations(keyValues); return traversal; } public GraphTraversal<Vertex, Vertex> addV(final String label) { + TraversalStrategies temp = this.strategies; + this.strategies = this.strategies.clone(); + TraversalHelper.addSourceToCreationStrategies(this, label); final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal(); + this.strategies = temp; return traversal.addStep(new AddVertexStartStep(traversal, label)); } public GraphTraversal<Vertex, Vertex> addV() { + TraversalStrategies temp = this.strategies; + this.strategies = this.strategies.clone(); + TraversalHelper.addSourceToCreationStrategies(this); final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal(); + this.strategies = temp; return traversal.addStep(new AddVertexStartStep(traversal, null)); } @@ -222,12 +244,20 @@ public class GraphTraversalSource implements TraversalSource { } public GraphTraversal<Vertex, Vertex> V(final Object... vertexIds) { + TraversalStrategies temp = this.strategies; + this.strategies = this.strategies.clone(); + TraversalHelper.addSourceToCreationStrategies(this, vertexIds); final GraphTraversal.Admin<Vertex, Vertex> traversal = this.generateTraversal(); + this.strategies = temp; return traversal.addStep(new GraphStep<>(traversal, Vertex.class, true, vertexIds)); } public GraphTraversal<Edge, Edge> E(final Object... edgesIds) { + TraversalStrategies temp = this.strategies; + this.strategies = this.strategies.clone(); + TraversalHelper.addSourceToCreationStrategies(this, edgesIds); final GraphTraversal.Admin<Edge, Edge> traversal = this.generateTraversal(); + this.strategies = temp; return traversal.addStep(new GraphStep<>(traversal, Edge.class, true, edgesIds)); } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f3364102/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java index 9e0db74..16b3eed 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/script/ScriptGraphTraversalSource.java @@ -76,19 +76,19 @@ public class ScriptGraphTraversalSource extends GraphTraversalSource { @Override public GraphTraversalSource withComputer(final Computer computer) { - this.translator.addStrategy("withComputer", computer); + this.translator.addSource("withComputer", computer); return this; } @Override public GraphTraversalSource withComputer(final Class<? extends GraphComputer> graphComputerClass) { - this.translator.addStrategy("withComputer", graphComputerClass); + this.translator.addSource("withComputer", graphComputerClass); return this; } @Override public GraphTraversalSource withComputer() { - this.translator.addStrategy("withComputer"); + this.translator.addSource("withComputer"); return this; } @@ -101,89 +101,89 @@ public class ScriptGraphTraversalSource extends GraphTraversalSource { @Override @SuppressWarnings({"unchecked", "varargs"}) public GraphTraversalSource withoutStrategies(final Class<? extends TraversalStrategy>... traversalStrategyClasses) { - this.translator.addStrategy("withoutStrategies", traversalStrategyClasses); + this.translator.addSource("withoutStrategies", traversalStrategyClasses); return this; } @Override public <A> GraphTraversalSource withSideEffect(final String key, final Supplier<A> initialValue, final BinaryOperator<A> reducer) { - this.translator.addStrategy("withSideEffect", key, initialValue, reducer); + this.translator.addSource("withSideEffect", key, initialValue, reducer); return this; } @Override public <A> GraphTraversalSource withSideEffect(final String key, final A initialValue, final BinaryOperator<A> reducer) { - this.translator.addStrategy("withSideEffect", key, initialValue, reducer); + this.translator.addSource("withSideEffect", key, initialValue, reducer); return this; } @Override public <A> GraphTraversalSource withSideEffect(final String key, final A initialValue) { - this.translator.addStrategy("withSideEffect", key, initialValue); + this.translator.addSource("withSideEffect", key, initialValue); return this; } @Override public <A> GraphTraversalSource withSideEffect(final String key, final Supplier<A> initialValue) { - this.translator.addStrategy("withSideEffect", key, initialValue); + this.translator.addSource("withSideEffect", key, initialValue); return this; } @Override public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) { - this.translator.addStrategy("withSack", initialValue, splitOperator, mergeOperator); + this.translator.addSource("withSack", initialValue, splitOperator, mergeOperator); return this; } @Override public <A> GraphTraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator, final BinaryOperator<A> mergeOperator) { - this.translator.addStrategy("withSack", initialValue, splitOperator, mergeOperator); + this.translator.addSource("withSack", initialValue, splitOperator, mergeOperator); return this; } @Override public <A> GraphTraversalSource withSack(final A initialValue) { - this.translator.addStrategy("withSack", initialValue); + this.translator.addSource("withSack", initialValue); return this; } @Override public <A> GraphTraversalSource withSack(final Supplier<A> initialValue) { - this.translator.addStrategy("withSack", initialValue); + this.translator.addSource("withSack", initialValue); return this; } @Override public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final UnaryOperator<A> splitOperator) { - this.translator.addStrategy("withSack", initialValue, splitOperator); + this.translator.addSource("withSack", initialValue, splitOperator); return this; } @Override public <A> GraphTraversalSource withSack(final A initialValue, final UnaryOperator<A> splitOperator) { - this.translator.addStrategy("withSack", initialValue, splitOperator); + this.translator.addSource("withSack", initialValue, splitOperator); return this; } @Override public <A> GraphTraversalSource withSack(final Supplier<A> initialValue, final BinaryOperator<A> mergeOperator) { - this.translator.addStrategy("withSack", initialValue, mergeOperator); + this.translator.addSource("withSack", initialValue, mergeOperator); return this; } @Override public <A> GraphTraversalSource withSack(final A initialValue, final BinaryOperator<A> mergeOperator) { - this.translator.addStrategy("withSack", initialValue, mergeOperator); + this.translator.addSource("withSack", initialValue, mergeOperator); return this; } public GraphTraversalSource withBulk(final boolean useBulk) { - this.translator.addStrategy("withBulk", useBulk); + this.translator.addSource("withBulk", useBulk); return this; } public GraphTraversalSource withPath() { - this.translator.addStrategy("withPath"); + this.translator.addSource("withPath"); return this; } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/f3364102/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java index 1187a1a..576e8f9 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroupStep.java @@ -22,7 +22,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.map; 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.dsl.graph.DefaultGraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.lambda.ElementValueTraversal; import org.apache.tinkerpop.gremlin.process.traversal.lambda.FunctionTraverser; import org.apache.tinkerpop.gremlin.process.traversal.lambda.IdentityTraversal; @@ -65,7 +65,7 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> public GroupStep(final Traversal.Admin traversal) { super(traversal); - this.valueTraversal = this.integrateChild(__.fold().asAdmin()); + this.valueTraversal = this.integrateChild(new DefaultGraphTraversal<>().fold().asAdmin()); this.preTraversal = this.integrateChild(generatePreTraversal(this.valueTraversal)); this.setReducingBiOperator(new GroupBiOperator<>(this.valueTraversal)); this.setSeedSupplier(HashMapSupplier.instance()); @@ -323,7 +323,7 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> valueTraversal instanceof TokenTraversal || valueTraversal instanceof IdentityTraversal || valueTraversal.getStartStep() instanceof LambdaMapStep && ((LambdaMapStep) valueTraversal.getStartStep()).getMapFunction() instanceof FunctionTraverser) { - return (Traversal.Admin<S, E>) __.map(valueTraversal).fold(); + return (Traversal.Admin<S, E>) new DefaultGraphTraversal<>().map(valueTraversal).fold(); } else { return valueTraversal; } @@ -332,7 +332,7 @@ public final class GroupStep<S, K, V> extends ReducingBarrierStep<S, Map<K, V>> public static Traversal.Admin<?, ?> generatePreTraversal(final Traversal.Admin<?, ?> valueTraversal) { if (!TraversalHelper.hasStepOfAssignableClass(Barrier.class, valueTraversal)) return valueTraversal; - final Traversal.Admin<?, ?> first = __.identity().asAdmin(); + final Traversal.Admin<?, ?> first = new DefaultGraphTraversal<>().identity().asAdmin(); for (final Step step : valueTraversal.getSteps()) { if (step instanceof Barrier) break;