This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch backport-discard in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 39ee87903a8dcfa74fc32f7e75df9eb2dbe248c6 Author: Stephen Mallette <[email protected]> AuthorDate: Sat Aug 2 11:11:42 2025 -0400 Backported 62a3935152354eea54f2cfadc39edf10ebe2005d from 4.x Renames none() to discard() --- CHANGELOG.asciidoc | 3 +- docs/src/reference/the-traversal.asciidoc | 43 +++++++++++++--------- docs/src/upgrade/release-3.8.x.asciidoc | 13 +++++++ .../grammar/DefaultGremlinBaseVisitor.java | 2 +- .../language/grammar/TraversalMethodVisitor.java | 4 +- .../gremlin/process/traversal/Traversal.java | 14 +++---- .../traversal/dsl/graph/GraphTraversal.java | 8 ++-- .../gremlin/process/traversal/dsl/graph/__.java | 6 +-- .../filter/{NoneStep.java => DiscardStep.java} | 4 +- .../strategy/optimization/EarlyLimitStrategy.java | 22 +++++------ .../strategy/optimization/LazyBarrierStrategy.java | 4 +- .../optimization/PathRetractionStrategy.java | 8 +--- .../verification/StandardVerificationStrategy.java | 9 ++--- .../process/traversal/util/BytecodeHelper.java | 4 +- .../grammar/TraversalMethodVisitorTest.java | 8 ++-- .../language/grammar/TraversalRootVisitorTest.java | 4 +- .../traversal/dsl/graph/GraphTraversalTest.java | 2 +- .../optimization/EarlyLimitStrategyTest.java | 16 ++++---- .../StandardVerificationStrategyTest.java | 2 +- .../traversal/translator/PythonTranslatorTest.java | 6 +-- .../Process/Traversal/DefaultTraversal.cs | 2 +- .../Process/Traversal/GraphTraversal.cs | 18 ++++----- .../src/Gremlin.Net/Process/Traversal/__.cs | 16 ++++---- .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 12 +++--- gremlin-go/driver/anonymousTraversal.go | 14 +++---- gremlin-go/driver/cucumber/gremlin.go | 12 +++--- gremlin-go/driver/graphTraversal.go | 12 +++--- gremlin-go/driver/traversal.go | 2 +- .../lib/process/graph-traversal.js | 22 +++++------ .../gremlin-javascript/lib/process/traversal.js | 2 +- .../gremlin-javascript/test/cucumber/gremlin.js | 12 +++--- gremlin-language/src/main/antlr4/Gremlin.g4 | 12 +++--- .../gremlin_python/process/graph_traversal.py | 28 +++++++------- .../python/gremlin_python/process/traversal.py | 2 +- gremlin-python/src/main/python/radish/gremlin.py | 12 +++--- .../process/traversal/CoreTraversalTest.java | 6 +-- .../filter/{None.feature => Discard.feature} | 28 +++++++------- 37 files changed, 205 insertions(+), 189 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 355bf27d67..dbbcf07024 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima This release also includes changes from <<release-3-7-XXX, 3.7.XXX>>. * Removed Vertex/ReferenceVertex from grammar. Use vertex id in traversals now instead. +* Renamed the traversal discarding `none()` step to `discard()`. * Modified mathematical operators to prevent overflows in steps such as `sum()` and 'sack()' to prefer promotion to the next highest number type. * Added `DateTime` ontop of the existing 'datetime' grammar. * Added `UUID()` and `UUID(value)` to grammar. @@ -3017,7 +3018,7 @@ This release also includes changes from <<release-3-2-8, 3.2.8>>. This release also includes changes from <<release-3-2-7, 3.2.7>>. -* Added `NoneStep` and `Traversal.none()` for full filtering integration with `iterate()`. +* Added `DiscardStep` and `Traversal.none()` for full filtering integration with `iterate()`. * Fixed bug in serialization of `Path` for GraphSON 3.0 in `gremlin-python`. * Added support for GraphSON 3.0 in Gremlin.Net. * Added `math()`-step which supports scientific calculator capabilities for numbers within a traversal. diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc index bbc2f106f3..edd28510cb 100644 --- a/docs/src/reference/the-traversal.asciidoc +++ b/docs/src/reference/the-traversal.asciidoc @@ -1508,6 +1508,32 @@ g.V().values("name").fold().difference(__.V().limit(2).values("name").fold()) link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.html#difference(java.lang.Object)++[`difference(Object)`] link:++https://tinkerpop.apache.org/docs/x.y.z/dev/provider/#difference-step++[`Semantics`] +[[discard-step]] +=== Discard Step + +The `discard()`-step (*filter*) filters all objects from a traversal stream. It is helpful with <<branch-step>> types +of steps where a particular branch of code should "throw away" traversers. In the following example, traversers that +don't match are filtered out of the traversal stream. + +[gremlin-groovy,modern] +---- +g.V().choose(T.label). + option("person", __.out("knows").values("name")). + option("bleep", __.out("created").values("name")). + option(none, discard()) +---- + +It is also useful for traversals that are executed remotely where returning results is not useful and the traversal is +only meant to generate side-effects. Choosing not to return results saves in serialization and network costs as the +objects are filtered on the remote end and not returned to the client side. Typically, this step does not need to be +used directly and is quietly used by the `iterate()` terminal step which appends `discard()` to the traversal before +actually cycling through results. + +*Additional References* + +link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/Traversal.html#discard()++[`discard()`] +link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/Traversal.html#iterate()++[`iterate()`] + [[disjunct-step]] === Disjunct Step @@ -3229,23 +3255,6 @@ link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gre link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.html#min(org.apache.tinkerpop.gremlin.process.traversal.Scope)++[`min(Scope)`], link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/Scope.html++[`Scope`] -[[none-step]] -=== None Step - -The `none()`-step (*filter*) filters all objects from a traversal stream. It is especially useful for traversals -that are executed remotely where returning results is not useful and the traversal is only meant to generate -side-effects. Choosing not to return results saves in serialization and network costs as the objects are filtered on -the remote end and not returned to the client side. Typically, this step does not need to be used directly and is -quietly used by the `iterate()` terminal step which appends `none()` to the traversal before actually cycling through -results. - -NOTE: As of release 4.0.0, `none()` will be renamed to `discard()`. - -*Additional References* - -link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/Traversal.html#none()++[`none()`] -link:++https://tinkerpop.apache.org/javadocs/x.y.z/core/org/apache/tinkerpop/gremlin/process/traversal/Traversal.html#iterate()++[`iterate()`] - [[not-step]] === Not Step diff --git a/docs/src/upgrade/release-3.8.x.asciidoc b/docs/src/upgrade/release-3.8.x.asciidoc index 85c8b495d4..0363f70bb7 100644 --- a/docs/src/upgrade/release-3.8.x.asciidoc +++ b/docs/src/upgrade/release-3.8.x.asciidoc @@ -58,6 +58,13 @@ gremlin> g.V().sack(assign).by(__.hasLabel('person').count().asBool()).sack(and) See: link:https://tinkerpop.apache.org/docs/3.8.0/reference/#asBool-step[asBool()-step] See: link:https://issues.apache.org/jira/browse/TINKERPOP-3175[TINKERPOP-3175] +==== none() and discard() + +There is a complicated relationship with the `none()` and `discard()` steps that begs some discussion. Prior to this +version, the `none()` step was used to "throw away" all traversers that passed into it. In 3.8.0, that step has been +renamed to `discard()`. The `discard()` step with its verb tone arguably makes for a better name for that feature, but +it also helped make room for `none()` to be repurposed as `none(P)` which is a complement to `any(P)` and `all(P) steps. + ==== Set minimum Java version to 11 TinkerPop 3.8 requires a minimum of Java 11 for building and running. Support for Java 1.8 has been dropped. @@ -438,6 +445,12 @@ link:https://issues.apache.org/jira/browse/TINKERPOP-2974[TINKERPOP-2974] ==== Graph System Providers +===== NoneStep Renaming + +The `DiscardStep` is now renamed to `DiscardStep`. Providers who developed strategies or other optimizations around +`DiscardStep` should switch to `DiscardStep`. Note that `DiscardStep` has been repurposed as `none(P)` for filtering +collections as a complement to `any(P)` and `all(P)`. + ==== Set minimum Java version to 11 TinkerPop 3.8 requires a minimum of Java 11 for building and running. Support for Java 1.8 has been dropped. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java index 4b64161115..6a7382c144 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java @@ -614,7 +614,7 @@ public class DefaultGremlinBaseVisitor<T> extends AbstractParseTreeVisitor<T> im /** * {@inheritDoc} */ - @Override public T visitTraversalMethod_none(final GremlinParser.TraversalMethod_noneContext ctx) { notImplemented(ctx); return null; } + @Override public T visitTraversalMethod_discard(final GremlinParser.TraversalMethod_discardContext ctx) { notImplemented(ctx); return null; } /** * {@inheritDoc} */ diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java index 6b1578fb1e..9ff820393b 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java @@ -1111,8 +1111,8 @@ public class TraversalMethodVisitor extends TraversalRootVisitor<GraphTraversal> * {@inheritDoc} */ @Override - public GraphTraversal visitTraversalMethod_none(final GremlinParser.TraversalMethod_noneContext ctx) { - return this.graphTraversal.none(); + public GraphTraversal visitTraversalMethod_discard(final GremlinParser.TraversalMethod_discardContext ctx) { + return this.graphTraversal.discard(); } /** diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java index 494ba58f60..d2b3cb2966 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/Traversal.java @@ -23,7 +23,7 @@ import org.apache.tinkerpop.gremlin.process.computer.GraphComputer; import org.apache.tinkerpop.gremlin.process.remote.traversal.step.map.RemoteStep; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep; @@ -75,7 +75,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A } public static final String profile = "profile"; - public static final String none = "none"; + public static final String discard = "discard"; } /** @@ -201,7 +201,7 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A public default <A, B> Traversal<A, B> iterate() { try { if (!this.asAdmin().isLocked()) { - this.none(); + this.discard(); this.asAdmin().applyStrategies(); } // use the end step so the results are bulked @@ -221,11 +221,11 @@ public interface Traversal<S, E> extends Iterator<E>, Serializable, Cloneable, A * signal to remote servers that {@link #iterate()} was called. While it may be directly used, it is often a sign * that a traversal should be re-written in another form. * - * @return the updated traversal with respective {@link NoneStep}. + * @return the updated traversal with respective {@link DiscardStep}. */ - public default Traversal<S, E> none() { - this.asAdmin().getBytecode().addStep(Symbols.none); - return this.asAdmin().addStep(new NoneStep<>(this.asAdmin())); + public default Traversal<S, E> discard() { + this.asAdmin().getBytecode().addStep(Symbols.discard); + return this.asAdmin().addStep(new DiscardStep<>(this.asAdmin())); } /** 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 8470cb289a..b91e8f5950 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 @@ -67,7 +67,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.PathFilterStep; @@ -2047,11 +2047,11 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { * signal to remote servers that {@link #iterate()} was called. While it may be directly used, it is often a sign * that a traversal should be re-written in another form. * - * @return the updated traversal with respective {@link NoneStep}. + * @return the updated traversal with respective {@link DiscardStep}. */ @Override - default GraphTraversal<S, E> none() { - return (GraphTraversal<S, E>) Traversal.super.none(); + default GraphTraversal<S, E> discard() { + return (GraphTraversal<S, E>) Traversal.super.discard(); } /** diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java index 22bb3b1be0..068a200e9d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/__.java @@ -1078,10 +1078,10 @@ public class __ { } /** - * @see GraphTraversal#none() + * @see GraphTraversal#discard() */ - public static <A> GraphTraversal<A, A> none() { - return __.<A>start().none(); + public static <A> GraphTraversal<A, A> discard() { + return __.<A>start().discard(); } /** diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NoneStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DiscardStep.java similarity index 92% rename from gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NoneStep.java rename to gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DiscardStep.java index 1d43444bd5..45baf81fd7 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NoneStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/DiscardStep.java @@ -26,9 +26,9 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory; /** * @author Marko A. Rodriguez (http://markorodriguez.com) */ -public final class NoneStep<S> extends FilterStep<S> { +public final class DiscardStep<S> extends FilterStep<S> { - public NoneStep(final Traversal.Admin traversal) { + public DiscardStep(final Traversal.Admin traversal) { super(traversal); } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategy.java index cffff8c9ad..b56d65a79c 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategy.java @@ -23,7 +23,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.RangeGlobalStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.MapStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep; @@ -39,15 +39,15 @@ import java.util.List; * This strategy looks for {@link RangeGlobalStep}s that can be moved further left in the traversal and thus be applied * earlier. It will also try to merge multiple {@link RangeGlobalStep}s into one. * If the logical consequence of one or multiple {@link RangeGlobalStep}s is an empty result, the strategy will remove - * as many steps as possible and add a {@link NoneStep} instead. + * as many steps as possible and add a {@link DiscardStep} instead. * * @author Daniel Kuppitz (http://gremlin.guru) * @example <pre> * __.out().valueMap().limit(5) // becomes __.out().limit(5).valueMap() * __.outE().range(2, 10).valueMap().limit(5) // becomes __.outE().range(2, 7).valueMap() * __.outE().limit(5).valueMap().range(2, -1) // becomes __.outE().range(2, 5).valueMap() - * __.outE().limit(5).valueMap().range(5, 10) // becomes __.outE().none() - * __.outE().limit(5).valueMap().range(5, 10).cap("a") // becomes __.outE().none().cap("a") + * __.outE().limit(5).valueMap().range(5, 10) // becomes __.outE().discard() + * __.outE().limit(5).valueMap().range(5, 10).cap("a") // becomes __.outE().discard().cap("a") * </pre> */ public final class EarlyLimitStrategy @@ -74,10 +74,10 @@ public final class EarlyLimitStrategy // previous RangeStep; keep the RangeStep's labels at its preceding step TraversalHelper.copyLabels(step, step.getPreviousStep(), true); insertAfter = moveRangeStep((RangeGlobalStep) step, insertAfter, traversal, merge); - if (insertAfter instanceof NoneStep) { - // any step besides a SideEffectCapStep after a NoneStep would be pointless - final int noneStepIndex = TraversalHelper.stepIndex(insertAfter, traversal); - for (i = j - 2; i > noneStepIndex; i--) { + if (insertAfter instanceof DiscardStep) { + // any step besides a SideEffectCapStep after a DiscardStep would be pointless + final int discardStepIndex = TraversalHelper.stepIndex(insertAfter, traversal); + for (i = j - 2; i > discardStepIndex; i--) { if (!(steps.get(i) instanceof SideEffectCapStep) && !(steps.get(i) instanceof ProfileSideEffectStep)) { traversal.removeStep(i); } @@ -110,7 +110,7 @@ public final class EarlyLimitStrategy if (insertAfter instanceof RangeGlobalStep) { // there's a previous RangeStep which might affect the effective range of the current RangeStep // recompute this step's low and high; if the result is still a valid range, create a new RangeStep, - // otherwise a NoneStep + // otherwise a DiscardStep final RangeGlobalStep other = (RangeGlobalStep) insertAfter; final long low = other.getLowRange() + step.getLowRange(); if (other.getHighRange() == -1L) { @@ -120,11 +120,11 @@ public final class EarlyLimitStrategy if (low < high) { rangeStep = new RangeGlobalStep(traversal, low, high); } else { - rangeStep = new NoneStep<>(traversal); + rangeStep = new DiscardStep<>(traversal); } } else { final long high = Math.min(other.getLowRange() + step.getHighRange(), other.getHighRange()); - rangeStep = high > low ? new RangeGlobalStep(traversal, low, high) : new NoneStep<>(traversal); + rangeStep = high > low ? new RangeGlobalStep(traversal, low, high) : new DiscardStep<>(traversal); } remove = merge; TraversalHelper.replaceStep(merge ? insertAfter : step, rangeStep, traversal); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java index adb7b40460..aa46b59a4e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/LazyBarrierStrategy.java @@ -25,7 +25,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.Barrier; import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.ElementStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.FlatMapStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep; @@ -120,7 +120,7 @@ public final class LazyBarrierStrategy extends AbstractTraversalStrategy<Travers // so additionally injected ProfileSideEffectStep instances should not have effect here. if (foundFlatMap && !labeledPath && !(step.getNextStep() instanceof Barrier) && - !(step.getNextStep() instanceof NoneStep) && + !(step.getNextStep() instanceof DiscardStep) && !(step.getNextStep() instanceof EmptyStep) && !(step.getNextStep() instanceof ProfileSideEffectStep)) { final Step noOpBarrierStep = new NoOpBarrierStep<>(traversal, MAX_BARRIER_SIZE); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java index fc4e845797..4a007c910a 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/PathRetractionStrategy.java @@ -27,13 +27,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.LambdaHolder; import org.apache.tinkerpop.gremlin.process.traversal.step.PathProcessor; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DedupGlobalStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.FilterStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchStep; import org.apache.tinkerpop.gremlin.process.traversal.step.map.NoOpBarrierStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectOneStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.SelectStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep; import org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy; import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; @@ -140,7 +136,7 @@ public final class PathRetractionStrategy extends AbstractTraversalStrategy<Trav !(currentStep instanceof Barrier) && !(currentStep.getNextStep() instanceof Barrier) && !(currentStep.getTraversal().getParent() instanceof MatchStep) && - !(currentStep.getNextStep() instanceof NoneStep) && + !(currentStep.getNextStep() instanceof DiscardStep) && !(currentStep.getNextStep() instanceof EmptyStep)) TraversalHelper.insertAfterStep(new NoOpBarrierStep<>(traversal, this.standardBarrierSize), currentStep, traversal); } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java index 33bf519252..99e015d957 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java @@ -23,9 +23,8 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.finaliza import org.apache.tinkerpop.gremlin.process.traversal.Step; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy; -import org.apache.tinkerpop.gremlin.process.traversal.step.ReadWriting; import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep; import org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep; import org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep; @@ -73,15 +72,15 @@ public final class StandardVerificationStrategy extends AbstractTraversalStrateg // The ProfileSideEffectStep must be one of the following // (1) the last step - // (2) 2nd last step when accompanied by the cap step or none step (i.e. iterate() to nothing) + // (2) 2nd last step when accompanied by the cap step or discard step (i.e. iterate() to nothing) // (3) 3rd to last when the traversal ends with a RequirementsStep. final Step<?, ?> endStep = traversal.asAdmin().getEndStep(); if (TraversalHelper.hasStepOfClass(ProfileSideEffectStep.class, traversal) && !(endStep instanceof ProfileSideEffectStep || (endStep instanceof SideEffectCapStep && endStep.getPreviousStep() instanceof ProfileSideEffectStep) || - (endStep instanceof NoneStep && endStep.getPreviousStep() instanceof SideEffectCapStep && endStep.getPreviousStep().getPreviousStep() instanceof ProfileSideEffectStep) || + (endStep instanceof DiscardStep && endStep.getPreviousStep() instanceof SideEffectCapStep && endStep.getPreviousStep().getPreviousStep() instanceof ProfileSideEffectStep) || (endStep instanceof RequirementsStep && endStep.getPreviousStep() instanceof SideEffectCapStep && endStep.getPreviousStep().getPreviousStep() instanceof ProfileSideEffectStep) || - (endStep instanceof RequirementsStep && endStep.getPreviousStep() instanceof NoneStep && endStep.getPreviousStep().getPreviousStep() instanceof SideEffectCapStep && endStep.getPreviousStep().getPreviousStep().getPreviousStep() instanceof ProfileSideEffectStep))) { + (endStep instanceof RequirementsStep && endStep.getPreviousStep() instanceof DiscardStep && endStep.getPreviousStep().getPreviousStep() instanceof SideEffectCapStep && endStep.getPreviousStep().getPreviousStep().getPreviousStep() instanceof ProfileSideEffectStep))) { throw new VerificationException("When specified, the profile()-Step must be the last step or followed only by the cap()-step.", traversal); } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/BytecodeHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/BytecodeHelper.java index 0ad7c53764..5eb5ef252b 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/BytecodeHelper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/BytecodeHelper.java @@ -51,7 +51,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.HasStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.IsStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.LambdaFilterStep; -import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NoneStep; +import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.NotStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.OrStep; import org.apache.tinkerpop.gremlin.process.traversal.step.filter.PathFilterStep; @@ -325,7 +325,7 @@ public final class BytecodeHelper { put(GraphTraversal.Symbols.as, Collections.emptyList()); put(GraphTraversal.Symbols.option, Collections.emptyList()); put(Traversal.Symbols.profile, Collections.singletonList(ProfileStep.class)); - put(Traversal.Symbols.none, Collections.singletonList(NoneStep.class)); + put(Traversal.Symbols.discard, Collections.singletonList(DiscardStep.class)); put(TraversalSource.Symbols.withSack, Collections.emptyList()); put(TraversalSource.Symbols.withoutStrategies, Collections.emptyList()); put(TraversalSource.Symbols.withStrategies, Collections.emptyList()); diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitorTest.java index 6e4a26f5ab..e8866f18df 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitorTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitorTest.java @@ -1300,9 +1300,9 @@ public class TraversalMethodVisitorTest { } @Test - public void shouldParseTraversalMethod_none_somethingAfter() throws Exception { - compare(g.V().none().path(), eval("g.V().none().path()")); - compare(g.V().none().E(), eval("g.V().none().E()")); - compare(g.V().none().none(), eval("g.V().none().none()")); + public void shouldParseTraversalMethod_discard_somethingAfter() throws Exception { + compare(g.V().discard().path(), eval("g.V().discard().path()")); + compare(g.V().discard().E(), eval("g.V().discard().E()")); + compare(g.V().discard().discard(), eval("g.V().discard().discard()")); } } diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalRootVisitorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalRootVisitorTest.java index a6bc04f0e6..c153b091bf 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalRootVisitorTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalRootVisitorTest.java @@ -42,8 +42,8 @@ public class TraversalRootVisitorTest { @Test public void shouldParseTraversalMethod_none() { - compare(g.V().none(), eval("g.V().none()")); - compare(g.V().union(__.identity().none()), eval("g.V().union(__.identity().none())")); + compare(g.V().discard(), eval("g.V().discard()")); + compare(g.V().union(__.identity().discard()), eval("g.V().union(__.identity().discard())")); } private void compare(Object expected, Object actual) { diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java index 32c81f4fc8..7f58f0b748 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversalTest.java @@ -53,7 +53,7 @@ public class GraphTraversalTest { private static final Logger logger = LoggerFactory.getLogger(GraphTraversalTest.class); private static final GraphTraversalSource g = traversal().withEmbedded(EmptyGraph.instance()); - private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin", "by", "read", "write", "with", "option", "iterate", "to", "from", "profile", "pageRank", "connectedComponent", "peerPressure", "shortestPath", "program", "none")); + private static Set<String> NO_GRAPH = new HashSet<>(Arrays.asList("asAdmin", "by", "read", "write", "with", "option", "iterate", "to", "from", "profile", "pageRank", "connectedComponent", "peerPressure", "shortestPath", "program", "discard")); private static Set<String> NO_ANONYMOUS = new HashSet<>(Arrays.asList("start", "__")); private static Set<String> IGNORES_BYTECODE = new HashSet<>(Arrays.asList("asAdmin", "read", "write", "iterate")); diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategyTest.java index d6578dda24..55bd397f63 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategyTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/optimization/EarlyLimitStrategyTest.java @@ -77,8 +77,8 @@ public class EarlyLimitStrategyTest { public static Iterable<Object[]> generateTestParameters() { return Arrays.asList(new Object[][]{ {__.out().valueMap().limit(1), __.out().limit(1).valueMap(), Collections.emptyList()}, - {__.out().limit(5).valueMap().range(5, 10), __.start().out().none(), Collections.emptyList()}, - {__.out().limit(5).valueMap().range(6, 10), __.start().out().none(), Collections.emptyList()}, + {__.out().limit(5).valueMap().range(5, 10), __.start().out().discard(), Collections.emptyList()}, + {__.out().limit(5).valueMap().range(6, 10), __.start().out().discard(), Collections.emptyList()}, {__.V().out().valueMap().limit(1), __.V().out().limit(1).valueMap(), Collections.singleton(LazyBarrierStrategy.instance())}, {__.out().out().limit(1).in().in(), __.out().out().limit(1).in().barrier(LazyBarrierStrategy.MAX_BARRIER_SIZE).in(), Collections.singleton(LazyBarrierStrategy.instance())}, {__.out().has("name","marko").limit(1).in().in(), __.out().has("name","marko").limit(1).in().in(), Collections.emptyList()}, @@ -92,12 +92,12 @@ public class EarlyLimitStrategyTest { {__.out().map(__.identity()).map(__.identity()).range(50, -1).map(__.identity()).map(__.identity()).range(10, 60), __.out().range(60, 110).map(__.identity()).map(__.identity()).map(__.identity()).map(__.identity()), Collections.emptyList()}, {__.out().map(__.identity()).map(__.identity()).range(50, 100).map(__.identity()).map(__.identity()).range(10, -1), __.out().range(60, 100).map(__.identity()).map(__.identity()).map(__.identity()).map(__.identity()), Collections.emptyList()}, {__.out().map(__.identity()).map(__.identity()).range(50, 100).as("a").map(__.identity()).map(__.identity()).range(10, -1).as("b"), __.out().range(60, 100).map(__.identity()).map(__.identity()).as("a").map(__.identity()).map(__.identity()).as("b"), Collections.emptyList()}, - {__.out().map(__.identity()).map(__.identity()).range(50, 100).map(__.identity()).map(__.identity()).range(50, -1), __.out().none(), Collections.emptyList()}, - {__.out().map(__.identity()).map(__.identity()).range(50, 100).map(__.identity()).map(__.identity()).range(60, -1), __.out().none(), Collections.emptyList()}, - {__.out().map(__.identity()).map(__.identity()).range(50, 100).as("a").map(__.identity()).map(__.identity()).range(60, -1).as("b"), __.out().none(), Collections.emptyList()}, - {__.out().range(50, 100).store("a").range(50, -1), __.out().range(50, 100).store("a").none(), Collections.emptyList()}, - {__.out().range(50, 100).store("a").range(50, -1).cap("a"), ((GraphTraversal) __.out().range(50, 100).store("a").none()).cap("a"), Collections.emptyList()}, - {__.out().range(50, 100).map(__.identity()).range(50, -1).profile(), __.out().none().profile(), Collections.singleton(ProfileStrategy.instance())}, + {__.out().map(__.identity()).map(__.identity()).range(50, 100).map(__.identity()).map(__.identity()).range(50, -1), __.out().discard(), Collections.emptyList()}, + {__.out().map(__.identity()).map(__.identity()).range(50, 100).map(__.identity()).map(__.identity()).range(60, -1), __.out().discard(), Collections.emptyList()}, + {__.out().map(__.identity()).map(__.identity()).range(50, 100).as("a").map(__.identity()).map(__.identity()).range(60, -1).as("b"), __.out().discard(), Collections.emptyList()}, + {__.out().range(50, 100).store("a").range(50, -1), __.out().range(50, 100).store("a").discard(), Collections.emptyList()}, + {__.out().range(50, 100).store("a").range(50, -1).cap("a"), ((GraphTraversal) __.out().range(50, 100).store("a").discard()).cap("a"), Collections.emptyList()}, + {__.out().range(50, 100).map(__.identity()).range(50, -1).profile(), __.out().discard().profile(), Collections.singleton(ProfileStrategy.instance())}, {__.out().store("a").limit(10), __.out().limit(10).store("a"), Collections.emptyList()}, {__.out().aggregate("a").limit(10), __.out().aggregate("a").limit(10), Collections.emptyList()}, {__.V().branch(__.label()).option("person", __.out("knows").valueMap().limit(1)).option("software", __.out("created").valueMap().limit(2).fold()), diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java index 084b795273..6bc20e4e21 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java @@ -77,7 +77,7 @@ public class StandardVerificationStrategyTest { if (legalTraversal) { copy.asAdmin().applyStrategies(); - // try to also apply strategies with iterate() so that a NoneStep is added - for consistency sake we want + // try to also apply strategies with iterate() so that a DiscardStep is added - for consistency sake we want // to be able to run a profile and get no result back with this. final Traversal forIteration = copyAndConfigureTraversal(traversal); forIteration.iterate(); diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/PythonTranslatorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/PythonTranslatorTest.java index 45d5a33ebe..89bda921b9 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/PythonTranslatorTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/PythonTranslatorTest.java @@ -69,10 +69,10 @@ public class PythonTranslatorTest { } @Test - public void shouldTranslateNone() { + public void shouldTranslateDiscard() { final String gremlinAsPython = translator.translate( - g.V().none().asAdmin().getBytecode()).getScript(); - assertEquals("g.V().none()", gremlinAsPython); + g.V().discard().asAdmin().getBytecode()).getScript(); + assertEquals("g.V().discard()", gremlinAsPython); } @Test diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs index 9d7909324e..1b64474fbb 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/DefaultTraversal.cs @@ -229,7 +229,7 @@ namespace Gremlin.Net.Process.Traversal /// <returns>The fully drained traversal.</returns> public ITraversal<TStart, TEnd> Iterate() { - Bytecode.AddStep("none"); + Bytecode.AddStep("discard"); while (MoveNext()) { } diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs index d9091d1afb..162a89c0fe 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GraphTraversal.cs @@ -714,6 +714,15 @@ namespace Gremlin.Net.Process.Traversal return Wrap<TStart, TEnd>(this); } + /// <summary> + /// Adds the discard step to this <see cref="GraphTraversal{SType, EType}" />. + /// </summary> + public GraphTraversal<TStart, TEnd> Discard () + { + Bytecode.AddStep("discard"); + return Wrap<TStart, TEnd>(this); + } + /// <summary> /// Adds the disjunct step to this <see cref="GraphTraversal{SType, EType}" />. /// </summary> @@ -1510,15 +1519,6 @@ namespace Gremlin.Net.Process.Traversal return Wrap<TStart, TNewEnd>(this); } - /// <summary> - /// Adds the none step to this <see cref="GraphTraversal{SType, EType}" />. - /// </summary> - public GraphTraversal<TStart, TEnd> None () - { - Bytecode.AddStep("none"); - return Wrap<TStart, TEnd>(this); - } - /// <summary> /// Adds the not step to this <see cref="GraphTraversal{SType, EType}" />. /// </summary> diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs index 7e077f7fc5..6e5644da70 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/__.cs @@ -478,6 +478,14 @@ namespace Gremlin.Net.Process.Traversal return new GraphTraversal<object, object>().Difference(differenceObject); } + /// <summary> + /// Spawns a <see cref="GraphTraversal{SType, EType}" /> and adds the discard step to that traversal. + /// </summary> + public static GraphTraversal<object, object> discard() + { + return new GraphTraversal<object, object>().Discard(); + } + /// <summary> /// Spawns a <see cref="GraphTraversal{SType, EType}" /> and adds the disjunct step to that traversal. /// </summary> @@ -1104,14 +1112,6 @@ namespace Gremlin.Net.Process.Traversal return new GraphTraversal<object, E2>().Min<E2>(scope); } - /// <summary> - /// Spawns a <see cref="GraphTraversal{SType, EType}" /> and adds the none step to that traversal. - /// </summary> - public static GraphTraversal<object, object> None() - { - return new GraphTraversal<object, object>().None(); - } - /// <summary> /// Spawns a <see cref="GraphTraversal{SType, EType}" /> and adds the not step to that traversal. /// </summary> diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index df5ac0d3cb..81bb7242df 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@ -203,6 +203,12 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_V_properties_dedup_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh"), (g,p) =>g.V().Properties<object>("name").Dedup().Count()}}, {"g_V_properties_dedup_byXvalueX_count", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh"), (g,p) =>g.V().Properties<object>("name").Dedup().By(T.Value).Count()}}, {"g_V_both_hasXlabel_softwareX_dedup_byXlangX_byXnameX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Both().Has(T.Label, "software").Dedup().By("lang").By("name").Values<object>("name")}}, + {"g_V_discard", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Discard()}}, + {"g_V_discard_discard", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Discard().Discard()}}, + {"g_V_discard_fold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Discard().Fold()}}, + {"g_V_discard_fold_discard", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Discard().Fold().Discard()}}, + {"g_V_discard_fold_constantX1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Discard().Fold().Constant<object>(1)}}, + {"g_V_projectXxX_byXcoalesceXage_isXgtX29XX_discardXX_selectXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Project<object>("x").By(__.Coalesce<object>(__.Values<object>("age").Is(P.Gt(29)), __.Discard())).Select<object>("x")}}, {"g_V_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().As("a").AddV().As("b").AddE("knows").To("a"), (g,p) =>g.V().Drop(), (g,p) =>g.V(), (g,p) =>g.E()}}, {"g_V_outE_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().As("a").AddV().As("b").AddE("knows").To("a"), (g,p) =>g.V().OutE().Drop(), (g,p) =>g.V(), (g,p) =>g.E()}}, {"g_V_properties_drop", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property("name", "bob").AddV().Property("name", "alice"), (g,p) =>g.V().Properties<object>().Drop(), (g,p) =>g.V(), (g,p) =>g.V().Properties<object>()}}, @@ -318,12 +324,6 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_V_valuesXageX_isXgte_29X_isXlt_34X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.Gte(29)).Is(P.Lt(34))}}, {"g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Where(__.In("created").Count().Is(1)).Values<object>("name")}}, {"g_V_whereXinXcreatedX_count_isXgte_2XX_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Where(__.In("created").Count().Is(P.Gte(2))).Values<object>("name")}}, - {"g_V_none", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().None()}}, - {"g_V_none_none", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().None().None()}}, - {"g_V_none_fold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().None().Fold()}}, - {"g_V_none_fold_none", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().None().Fold().None()}}, - {"g_V_none_fold_constantX1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().None().Fold().Constant<object>(1)}}, - {"g_V_projectXxX_byXcoalesceXage_isXgtX29XX_noneXX_selectXxX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Project<object>("x").By(__.Coalesce<object>(__.Values<object>("age").Is(P.Gt(29)), __.None())).Select<object>("x")}}, {"g_V_orXhasXage_gt_27X__outE_count_gte_2X_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Or(__.Has("age", P.Gt(27)), __.OutE().Count().Is(P.Gte(2))).Values<object>("name")}}, {"g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Or(__.OutE("knows"), __.Has(T.Label, "software").Or().Has("age", P.Gte(35))).Values<object>("name")}}, {"g_V_asXaX_orXselectXaX_selectXaXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().As("a").Or(__.Select<object>("a"), __.Select<object>("a"))}}, diff --git a/gremlin-go/driver/anonymousTraversal.go b/gremlin-go/driver/anonymousTraversal.go index 67b107ab07..ac6c9a5348 100644 --- a/gremlin-go/driver/anonymousTraversal.go +++ b/gremlin-go/driver/anonymousTraversal.go @@ -117,6 +117,8 @@ type AnonymousTraversal interface { Dedup(args ...interface{}) *GraphTraversal // Difference adds the difference step to the GraphTraversal. Difference(args ...interface{}) *GraphTraversal + // Discard adds the discard step to the GraphTraversal. + Discard(args ...interface{}) *GraphTraversal // Disjunct adds the disjunct step to the GraphTraversal. Disjunct(args ...interface{}) *GraphTraversal // Drop adds the drop step to the GraphTraversal. @@ -205,8 +207,6 @@ type AnonymousTraversal interface { MergeV(args ...interface{}) *GraphTraversal // Min adds the min step to the GraphTraversal. Min(args ...interface{}) *GraphTraversal - // None adds the none step to the GraphTraversal. - None(args ...interface{}) *GraphTraversal // Not adds the not step to the GraphTraversal. Not(args ...interface{}) *GraphTraversal // Option adds the option step to the GraphTraversal. @@ -506,6 +506,11 @@ func (anonymousTraversal *anonymousTraversal) Difference(args ...interface{}) *G return anonymousTraversal.graphTraversal().Difference(args...) } +// Discard adds the discard step to the GraphTraversal. +func (anonymousTraversal *anonymousTraversal) Discard(args ...interface{}) *GraphTraversal { + return anonymousTraversal.graphTraversal().Discard(args...) +} + // Disjunct adds the disjunct step to the GraphTraversal. func (anonymousTraversal *anonymousTraversal) Disjunct(args ...interface{}) *GraphTraversal { return anonymousTraversal.graphTraversal().Disjunct(args...) @@ -726,11 +731,6 @@ func (anonymousTraversal *anonymousTraversal) Min(args ...interface{}) *GraphTra return anonymousTraversal.graphTraversal().Min(args...) } -// None adds the none step to the GraphTraversal. -func (anonymousTraversal *anonymousTraversal) None(args ...interface{}) *GraphTraversal { - return anonymousTraversal.graphTraversal().None(args...) -} - // Not adds the not step to the GraphTraversal. func (anonymousTraversal *anonymousTraversal) Not(args ...interface{}) *GraphTraversal { return anonymousTraversal.graphTraversal().Not(args...) diff --git a/gremlin-go/driver/cucumber/gremlin.go b/gremlin-go/driver/cucumber/gremlin.go index 0aca8a216b..b09f540c46 100644 --- a/gremlin-go/driver/cucumber/gremlin.go +++ b/gremlin-go/driver/cucumber/gremlin.go @@ -173,6 +173,12 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[ "g_V_properties_dedup_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Properties("name").Dedup().Count()}}, "g_V_properties_dedup_byXvalueX_count": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("person").Property("name", "josh").AddV("person").Property("name", "josh").AddV("person").Property("name", "josh")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Properties("name").Dedup().By(gremlingo.T.Value).Count()}}, "g_V_both_hasXlabel_softwareX_dedup_byXlangX_byXnameX_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Both().Has(gremlingo.T.Label, "software").Dedup().By("lang").By("name").Values("name")}}, + "g_V_discard": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Discard()}}, + "g_V_discard_discard": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Discard().Discard()}}, + "g_V_discard_fold": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Discard().Fold()}}, + "g_V_discard_fold_discard": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Discard().Fold().Discard()}}, + "g_V_discard_fold_constantX1X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Discard().Fold().Constant(1)}}, + "g_V_projectXxX_byXcoalesceXage_isXgtX29XX_discardXX_selectXxX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Project("x").By(gremlingo.T__.Coalesce(gremlingo.T__.Values("age").Is(gremlingo.P.Gt(29)), gremlingo.T__.Discard())).Select("x")}}, "g_V_drop": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV().As("a").AddV().As("b").AddE("knows").To("a")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Drop()}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V()}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {ret [...] "g_V_outE_drop": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV().As("a").AddV().As("b").AddE("knows").To("a")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().OutE().Drop()}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V()}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTr [...] "g_V_properties_drop": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV().Property("name", "bob").AddV().Property("name", "alice")}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Properties().Drop()}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V()}, func(g *gremlingo.GraphTraversalSource, p map[string]interfa [...] @@ -288,12 +294,6 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[ "g_V_valuesXageX_isXgte_29X_isXlt_34X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("age").Is(gremlingo.P.Gte(29)).Is(gremlingo.P.Lt(34))}}, "g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Where(gremlingo.T__.In("created").Count().Is(1)).Values("name")}}, "g_V_whereXinXcreatedX_count_isXgte_2XX_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Where(gremlingo.T__.In("created").Count().Is(gremlingo.P.Gte(2))).Values("name")}}, - "g_V_none": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().None()}}, - "g_V_none_none": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().None().None()}}, - "g_V_none_fold": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().None().Fold()}}, - "g_V_none_fold_none": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().None().Fold().None()}}, - "g_V_none_fold_constantX1X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().None().Fold().Constant(1)}}, - "g_V_projectXxX_byXcoalesceXage_isXgtX29XX_noneXX_selectXxX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Project("x").By(gremlingo.T__.Coalesce(gremlingo.T__.Values("age").Is(gremlingo.P.Gt(29)), gremlingo.T__.None())).Select("x")}}, "g_V_orXhasXage_gt_27X__outE_count_gte_2X_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Or(gremlingo.T__.Has("age", gremlingo.P.Gt(27)), gremlingo.T__.OutE().Count().Is(gremlingo.P.Gte(2))).Values("name")}}, "g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Or(gremlingo.T__.OutE("knows"), gremlingo.T__.Has(gremlingo.T.Label, "software").Or().Has("age", gremlingo.P.Gte(35))).Values("name")}}, "g_V_asXaX_orXselectXaX_selectXaXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().As("a").Or(gremlingo.T__.Select("a"), gremlingo.T__.Select("a"))}}, diff --git a/gremlin-go/driver/graphTraversal.go b/gremlin-go/driver/graphTraversal.go index ae9aa7f262..6573db7485 100644 --- a/gremlin-go/driver/graphTraversal.go +++ b/gremlin-go/driver/graphTraversal.go @@ -258,6 +258,12 @@ func (g *GraphTraversal) Difference(args ...interface{}) *GraphTraversal { return g } +// Discard adds the discard step to the GraphTraversal. +func (g *GraphTraversal) Discard(args ...interface{}) *GraphTraversal { + g.Bytecode.AddStep("discard", args...) + return g +} + // Disjunct adds the disjunct step to the GraphTraversal. func (g *GraphTraversal) Disjunct(args ...interface{}) *GraphTraversal { g.Bytecode.AddStep("disjunct", args...) @@ -524,12 +530,6 @@ func (g *GraphTraversal) Min(args ...interface{}) *GraphTraversal { return g } -// None adds the none step to the GraphTraversal. -func (g *GraphTraversal) None(args ...interface{}) *GraphTraversal { - g.Bytecode.AddStep("none", args...) - return g -} - // Not adds the not step to the GraphTraversal. func (g *GraphTraversal) Not(args ...interface{}) *GraphTraversal { g.Bytecode.AddStep("not", args...) diff --git a/gremlin-go/driver/traversal.go b/gremlin-go/driver/traversal.go index 6d82f6d0af..66f8cd3c2e 100644 --- a/gremlin-go/driver/traversal.go +++ b/gremlin-go/driver/traversal.go @@ -77,7 +77,7 @@ func (t *Traversal) Iterate() <-chan error { return } - if err := t.Bytecode.AddStep("none"); err != nil { + if err := t.Bytecode.AddStep("discard"); err != nil { r <- err return } diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js index e86dd4af47..b2aa34afba 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js @@ -682,6 +682,16 @@ class GraphTraversal extends Traversal { return this; } + /** + * Graph traversal discard method. + * @param {...Object} args + * @returns {GraphTraversal} + */ + discard(...args) { + this.bytecode.addStep('discard', args); + return this; + } + /** * Graph traversal disjunct method. * @param {...Object} args @@ -1121,16 +1131,6 @@ class GraphTraversal extends Traversal { return this; } - /** - * Graph traversal none method. - * @param {...Object} args - * @returns {GraphTraversal} - */ - none(...args) { - this.bytecode.addStep('none', args); - return this; - } - /** * Graph traversal not method. * @param {...Object} args @@ -1770,6 +1770,7 @@ const statics = { dateAdd: (...args) => callOnEmptyTraversal('dateAdd', args), dateDiff: (...args) => callOnEmptyTraversal('dateDiff', args), dedup: (...args) => callOnEmptyTraversal('dedup', args), + discard: (...args) => callOnEmptyTraversal('discard', args), disjunct: (...args) => callOnEmptyTraversal('disjunct', args), drop: (...args) => callOnEmptyTraversal('drop', args), element: (...args) => callOnEmptyTraversal('element', args), @@ -1811,7 +1812,6 @@ const statics = { mergeE: (...args) => callOnEmptyTraversal('mergeE', args), mergeV: (...args) => callOnEmptyTraversal('mergeV', args), min: (...args) => callOnEmptyTraversal('min', args), - none: (...args) => callOnEmptyTraversal('none', args), not: (...args) => callOnEmptyTraversal('not', args), optional: (...args) => callOnEmptyTraversal('optional', args), or: (...args) => callOnEmptyTraversal('or', args), diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js index a1ff9316dd..f925a72624 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/traversal.js @@ -84,7 +84,7 @@ class Traversal { * @returns {Promise} */ iterate() { - this.bytecode.addStep('none'); + this.bytecode.addStep('discard'); return this._applyStrategies().then(() => { let it; while ((it = this._getNext()) && !it.done) { diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js index e84bbbcaf9..03840c482b 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js @@ -203,6 +203,12 @@ const gremlins = { g_V_properties_dedup_count: [function({g}) { return g.addV("person").property("name", "josh").addV("person").property("name", "josh").addV("person").property("name", "josh") }, function({g}) { return g.V().properties("name").dedup().count() }], g_V_properties_dedup_byXvalueX_count: [function({g}) { return g.addV("person").property("name", "josh").addV("person").property("name", "josh").addV("person").property("name", "josh") }, function({g}) { return g.V().properties("name").dedup().by(T.value).count() }], g_V_both_hasXlabel_softwareX_dedup_byXlangX_byXnameX_name: [function({g}) { return g.V().both().has(T.label, "software").dedup().by("lang").by("name").values("name") }], + g_V_discard: [function({g}) { return g.V().discard() }], + g_V_discard_discard: [function({g}) { return g.V().discard().discard() }], + g_V_discard_fold: [function({g}) { return g.V().discard().fold() }], + g_V_discard_fold_discard: [function({g}) { return g.V().discard().fold().discard() }], + g_V_discard_fold_constantX1X: [function({g}) { return g.V().discard().fold().constant(1) }], + g_V_projectXxX_byXcoalesceXage_isXgtX29XX_discardXX_selectXxX: [function({g}) { return g.V().project("x").by(__.coalesce(__.values("age").is(P.gt(29)), __.discard())).select("x") }], g_V_drop: [function({g}) { return g.addV().as("a").addV().as("b").addE("knows").to("a") }, function({g}) { return g.V().drop() }, function({g}) { return g.V() }, function({g}) { return g.E() }], g_V_outE_drop: [function({g}) { return g.addV().as("a").addV().as("b").addE("knows").to("a") }, function({g}) { return g.V().outE().drop() }, function({g}) { return g.V() }, function({g}) { return g.E() }], g_V_properties_drop: [function({g}) { return g.addV().property("name", "bob").addV().property("name", "alice") }, function({g}) { return g.V().properties().drop() }, function({g}) { return g.V() }, function({g}) { return g.V().properties() }], @@ -318,12 +324,6 @@ const gremlins = { g_V_valuesXageX_isXgte_29X_isXlt_34X: [function({g}) { return g.V().values("age").is(P.gte(29)).is(P.lt(34)) }], g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX: [function({g}) { return g.V().where(__.in_("created").count().is(1)).values("name") }], g_V_whereXinXcreatedX_count_isXgte_2XX_valuesXnameX: [function({g}) { return g.V().where(__.in_("created").count().is(P.gte(2))).values("name") }], - g_V_none: [function({g}) { return g.V().none() }], - g_V_none_none: [function({g}) { return g.V().none().none() }], - g_V_none_fold: [function({g}) { return g.V().none().fold() }], - g_V_none_fold_none: [function({g}) { return g.V().none().fold().none() }], - g_V_none_fold_constantX1X: [function({g}) { return g.V().none().fold().constant(1) }], - g_V_projectXxX_byXcoalesceXage_isXgtX29XX_noneXX_selectXxX: [function({g}) { return g.V().project("x").by(__.coalesce(__.values("age").is(P.gt(29)), __.none())).select("x") }], g_V_orXhasXage_gt_27X__outE_count_gte_2X_name: [function({g}) { return g.V().or(__.has("age", P.gt(27)), __.outE().count().is(P.gte(2))).values("name") }], g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name: [function({g}) { return g.V().or(__.outE("knows"), __.has(T.label, "software").or().has("age", P.gte(35))).values("name") }], g_V_asXaX_orXselectXaX_selectXaXX: [function({g}) { return g.V().as("a").or(__.select("a"), __.select("a")) }], diff --git a/gremlin-language/src/main/antlr4/Gremlin.g4 b/gremlin-language/src/main/antlr4/Gremlin.g4 index 0b60761f35..9fbcae894e 100644 --- a/gremlin-language/src/main/antlr4/Gremlin.g4 +++ b/gremlin-language/src/main/antlr4/Gremlin.g4 @@ -202,6 +202,7 @@ traversalMethod | traversalMethod_cyclicPath | traversalMethod_dedup | traversalMethod_difference + | traversalMethod_discard | traversalMethod_disjunct | traversalMethod_drop | traversalMethod_elementMap @@ -238,7 +239,6 @@ traversalMethod | traversalMethod_max | traversalMethod_mean | traversalMethod_min - | traversalMethod_none | traversalMethod_not | traversalMethod_option | traversalMethod_optional @@ -474,6 +474,10 @@ traversalMethod_difference : K_DIFFERENCE LPAREN genericArgument RPAREN #traversalMethod_difference_Object ; +traversalMethod_discard + : K_DISCARD LPAREN RPAREN + ; + traversalMethod_disjunct : K_DISJUNCT LPAREN genericArgument RPAREN #traversalMethod_disjunct_Object ; @@ -683,10 +687,6 @@ traversalMethod_min | K_MIN LPAREN traversalScope RPAREN #traversalMethod_min_Scope ; -traversalMethod_none - : K_NONE LPAREN RPAREN - ; - traversalMethod_not : K_NOT LPAREN nestedTraversal RPAREN ; @@ -1715,6 +1715,7 @@ keyword | K_DESC | K_DIFFERENCE | K_DIRECTION + | K_DISCARD | K_DISJUNCT | K_DISTANCE | K_DIV @@ -1974,6 +1975,7 @@ K_DECR: 'decr'; K_DEDUP: 'dedup'; K_DESC: 'desc'; K_DIFFERENCE: 'difference'; +K_DISCARD: 'discard'; K_DIRECTION: 'Direction'; K_DISJUNCT: 'disjunct'; K_DISTANCE: 'distance'; diff --git a/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py b/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py index 9a33d899fd..df7c3d4e65 100644 --- a/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py +++ b/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py @@ -442,6 +442,10 @@ class GraphTraversal(Traversal): self.bytecode.add_step("difference", *args) return self + def discard(self, *args): + self.bytecode.add_step("discard", *args) + return self + def disjunct(self, *args): self.bytecode.add_step("disjunct", *args) return self @@ -703,10 +707,6 @@ class GraphTraversal(Traversal): self.bytecode.add_step("min", *args) return self - def none(self, *args): - self.bytecode.add_step("none", *args) - return self - def not_(self, *args): self.bytecode.add_step("not", *args) return self @@ -1215,6 +1215,10 @@ class __(object, metaclass=MagicType): def difference(cls, *args): return cls.graph_traversal(None, None, Bytecode()).difference(*args) + @classmethod + def discard(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).discard(*args) + @classmethod def disjunct(cls, *args): return cls.graph_traversal(None, None, Bytecode()).disjunct(*args) @@ -1483,10 +1487,6 @@ class __(object, metaclass=MagicType): def min_(cls, *args): return cls.graph_traversal(None, None, Bytecode()).min_(*args) - @classmethod - def none(cls, *args): - return cls.graph_traversal(None, None, Bytecode()).none(*args) - @classmethod def not_(cls, *args): return cls.graph_traversal(None, None, Bytecode()).not_(*args) @@ -1967,6 +1967,10 @@ def dedup(*args): return __.dedup(*args) +def discard(*args): + return __.discard(*args) + + def disjunct(*args): return __.disjunct(*args) @@ -2177,10 +2181,6 @@ def min_(*args): return __.min_(*args) -def none(*args): - return __.none(*args) - - def not_(*args): return __.not_(*args) @@ -2471,6 +2471,8 @@ statics.add_static('date_diff', date_diff) statics.add_static('dedup', dedup) +statics.add_static('discard', discard) + statics.add_static('disjunct', disjunct) statics.add_static('drop', drop) @@ -2573,8 +2575,6 @@ statics.add_static('merge_v', merge_v) statics.add_static('min_', min_) -statics.add_static('none', none) - statics.add_static('not_', not_) statics.add_static('optional', optional) diff --git a/gremlin-python/src/main/python/gremlin_python/process/traversal.py b/gremlin-python/src/main/python/gremlin_python/process/traversal.py index fb74433348..e806e7aa69 100644 --- a/gremlin-python/src/main/python/gremlin_python/process/traversal.py +++ b/gremlin-python/src/main/python/gremlin_python/process/traversal.py @@ -75,7 +75,7 @@ class Traversal(object): return set(iter(self)) def iterate(self): - self.bytecode.add_step("none") + self.bytecode.add_step("discard") while True: try: self.next_traverser() except StopIteration: return self diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py index 9f9d5aed6e..1351a0a4a1 100644 --- a/gremlin-python/src/main/python/radish/gremlin.py +++ b/gremlin-python/src/main/python/radish/gremlin.py @@ -176,6 +176,12 @@ world.gremlins = { 'g_V_properties_dedup_count': [(lambda g:g.add_v('person').property('name', 'josh').add_v('person').property('name', 'josh').add_v('person').property('name', 'josh')), (lambda g:g.V().properties('name').dedup().count())], 'g_V_properties_dedup_byXvalueX_count': [(lambda g:g.add_v('person').property('name', 'josh').add_v('person').property('name', 'josh').add_v('person').property('name', 'josh')), (lambda g:g.V().properties('name').dedup().by(T.value).count())], 'g_V_both_hasXlabel_softwareX_dedup_byXlangX_byXnameX_name': [(lambda g:g.V().both().has(T.label, 'software').dedup().by('lang').by('name').values('name'))], + 'g_V_discard': [(lambda g:g.V().discard())], + 'g_V_discard_discard': [(lambda g:g.V().discard().discard())], + 'g_V_discard_fold': [(lambda g:g.V().discard().fold())], + 'g_V_discard_fold_discard': [(lambda g:g.V().discard().fold().discard())], + 'g_V_discard_fold_constantX1X': [(lambda g:g.V().discard().fold().constant(1))], + 'g_V_projectXxX_byXcoalesceXage_isXgtX29XX_discardXX_selectXxX': [(lambda g:g.V().project('x').by(__.coalesce(__.values('age').is_(P.gt(29)), __.discard())).select('x'))], 'g_V_drop': [(lambda g:g.add_v().as_('a').add_v().as_('b').add_e('knows').to('a')), (lambda g:g.V().drop()), (lambda g:g.V()), (lambda g:g.E())], 'g_V_outE_drop': [(lambda g:g.add_v().as_('a').add_v().as_('b').add_e('knows').to('a')), (lambda g:g.V().out_e().drop()), (lambda g:g.V()), (lambda g:g.E())], 'g_V_properties_drop': [(lambda g:g.add_v().property('name', 'bob').add_v().property('name', 'alice')), (lambda g:g.V().properties().drop()), (lambda g:g.V()), (lambda g:g.V().properties())], @@ -291,12 +297,6 @@ world.gremlins = { 'g_V_valuesXageX_isXgte_29X_isXlt_34X': [(lambda g:g.V().values('age').is_(P.gte(29)).is_(P.lt(34)))], 'g_V_whereXinXcreatedX_count_isX1XX_valuesXnameX': [(lambda g:g.V().where(__.in_('created').count().is_(1)).values('name'))], 'g_V_whereXinXcreatedX_count_isXgte_2XX_valuesXnameX': [(lambda g:g.V().where(__.in_('created').count().is_(P.gte(2))).values('name'))], - 'g_V_none': [(lambda g:g.V().none())], - 'g_V_none_none': [(lambda g:g.V().none().none())], - 'g_V_none_fold': [(lambda g:g.V().none().fold())], - 'g_V_none_fold_none': [(lambda g:g.V().none().fold().none())], - 'g_V_none_fold_constantX1X': [(lambda g:g.V().none().fold().constant(1))], - 'g_V_projectXxX_byXcoalesceXage_isXgtX29XX_noneXX_selectXxX': [(lambda g:g.V().project('x').by(__.coalesce(__.values('age').is_(P.gt(29)), __.none())).select('x'))], 'g_V_orXhasXage_gt_27X__outE_count_gte_2X_name': [(lambda g:g.V().or_(__.has('age', P.gt(27)), __.out_e().count().is_(P.gte(2))).values('name'))], 'g_V_orXoutEXknowsX__hasXlabel_softwareX_or_hasXage_gte_35XX_name': [(lambda g:g.V().or_(__.out_e('knows'), __.has(T.label, 'software').or_().has('age', P.gte(35))).values('name'))], 'g_V_asXaX_orXselectXaX_selectXaXX': [(lambda g:g.V().as_('a').or_(__.select('a'), __.select('a')))], diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java index af61f822b5..bbf59db189 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/CoreTraversalTest.java @@ -30,7 +30,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.step.util.BulkSet; import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.VerificationException; import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal; import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; -import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Graph; import org.apache.tinkerpop.gremlin.structure.Transaction; import org.apache.tinkerpop.gremlin.structure.Vertex; @@ -38,12 +37,10 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import org.junit.Ignore; import org.junit.Test; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.NoSuchElementException; import java.util.Set; -import java.util.stream.Collectors; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal; @@ -52,7 +49,6 @@ import static org.apache.tinkerpop.gremlin.structure.Graph.Features.GraphFeature import static org.hamcrest.core.StringStartsWith.startsWith; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNull; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.Is.is; import static org.junit.Assert.assertTrue; @@ -110,7 +106,7 @@ public class CoreTraversalTest extends AbstractGremlinProcessTest { assertEquals(2, traversal.asAdmin().getSideEffects().<BulkSet>get("x").size()); assertTrue(traversal.asAdmin().getSideEffects().<BulkSet>get("x").contains("ripple")); assertTrue(traversal.asAdmin().getSideEffects().<BulkSet>get("x").contains("lop")); - assertEquals(Traversal.Symbols.none, traversal.asAdmin().getBytecode().getStepInstructions().get(traversal.asAdmin().getBytecode().getStepInstructions().size()-1).getOperator()); + assertEquals(Traversal.Symbols.discard, traversal.asAdmin().getBytecode().getStepInstructions().get(traversal.asAdmin().getBytecode().getStepInstructions().size()-1).getOperator()); } @Test diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/None.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Discard.feature similarity index 78% rename from gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/None.feature rename to gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Discard.feature index 59f9788497..25e0dadff0 100644 --- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/None.feature +++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Discard.feature @@ -15,63 +15,63 @@ # specific language governing permissions and limitations # under the License. -@StepClassFilter @StepNone -Feature: Step - none() +@StepClassFilter @StepDiscard +Feature: Step - discard() - Scenario: g_V_none + Scenario: g_V_discard Given the modern graph And the traversal of """ - g.V().none() + g.V().discard() """ When iterated to list Then the result should be empty - Scenario: g_V_none_none + Scenario: g_V_discard_discard Given the modern graph And the traversal of """ - g.V().none().none() + g.V().discard().discard() """ When iterated to list Then the result should be empty - Scenario: g_V_none_fold + Scenario: g_V_discard_fold Given the modern graph And the traversal of """ - g.V().none().fold() + g.V().discard().fold() """ When iterated to list Then the result should be unordered | result | | l[] | - Scenario: g_V_none_fold_none + Scenario: g_V_discard_fold_discard Given the modern graph And the traversal of """ - g.V().none().fold().none() + g.V().discard().fold().discard() """ When iterated to list Then the result should be empty - Scenario: g_V_none_fold_constantX1X + Scenario: g_V_discard_fold_constantX1X Given the modern graph And the traversal of """ - g.V().none().fold().constant(1) + g.V().discard().fold().constant(1) """ When iterated to list Then the result should be unordered | result | | d[1].i | - Scenario: g_V_projectXxX_byXcoalesceXage_isXgtX29XX_noneXX_selectXxX + Scenario: g_V_projectXxX_byXcoalesceXage_isXgtX29XX_discardXX_selectXxX Given the modern graph And the traversal of """ - g.V().project("x").by(__.coalesce(__.values("age").is(P.gt(29)), __.none())). + g.V().project("x").by(__.coalesce(__.values("age").is(P.gt(29)), __.discard())). select("x") """ When iterated to list
