This is an automated email from the ASF dual-hosted git repository. xiazcy pushed a commit to branch steps-taking-traversal-poc in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 4a7f23e52cce919177d548b1876458efd963475e Author: Yang Xia <[email protected]> AuthorDate: Thu Jun 4 22:21:26 2026 -0700 restrict P(Traversal) in union() --- .../traversal/dsl/graph/GraphTraversal.java | 8 +++ .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 10 ++-- gremlin-go/driver/cucumber/gremlin.go | 6 +-- .../gremlin-javascript/test/cucumber/gremlin.js | 6 +-- .../src/main/python/tests/feature/gremlin.py | 6 +-- .../gremlin/language/translator/translations.json | 60 +++++++++++----------- .../test/features/filter/IsTraversal.feature | 6 +-- 7 files changed, 55 insertions(+), 47 deletions(-) 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 e015e708cb..fcf46d23f4 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 @@ -4112,6 +4112,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { if (choosePredicate.isParameterized()) { throw new IllegalArgumentException("Parameterized predicates are not supported by choose()"); } + if (choosePredicate.hasTraversal()) { + throw new IllegalArgumentException("Traversal-bearing predicates are not supported by choose(). " + + "Use choose(__.is(P.op(traversal)), trueChoice, falseChoice) instead."); + } this.asAdmin().getGremlinLang().addStep(Symbols.choose, choosePredicate, trueChoice, falseChoice); return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) __.is(choosePredicate), (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) falseChoice)); } @@ -4149,6 +4153,10 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> { if (choosePredicate.isParameterized()) { throw new IllegalArgumentException("Parameterized predicates are not supported by choose()"); } + if (choosePredicate.hasTraversal()) { + throw new IllegalArgumentException("Traversal-bearing predicates are not supported by choose(). " + + "Use choose(__.is(P.op(traversal)), trueChoice) instead."); + } this.asAdmin().getGremlinLang().addStep(Symbols.choose, choosePredicate, trueChoice); return this.asAdmin().addStep(new ChooseStep<E, E2, Boolean>(this.asAdmin(), (Traversal.Admin<E, ?>) __.is(choosePredicate), (Traversal.Admin<E, E2>) trueChoice, (Traversal.Admin<E, E2>) __.identity())); } diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index e6040f7ba8..8881b5da07 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@ -589,8 +589,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_V_valuesXageX_isXneqXVXvid4X_valuesXageXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.Neq(__.V(p["vid4"]).Values<object>("age")))}}, {"g_V_valuesXageX_isXwithinXVXvid1X_outXknowsX_valuesXageXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.Within(__.V(p["vid1"]).Out("knows").Values<object>("age").Fold()))}}, {"g_V_valuesXageX_isXVXvid1X_valuesXnonexistentXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(__.V(p["vid1"]).Values<object>("nonexistent"))}}, - {"g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Values<object>("age").Choose<object>(P.Gt(__.V(p["vid1"]).Values<object>("age")), __.Constant<object>("older than marko"), __.Constant<object>("not older"))}}, - {"g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Values<object>("age").Choose<object>(P.Gte(__.V().HasLabel("person").Values<object>("age").Mean<object>()), __.Constant<object>("above average"), __.Constant<object>("below average"))}}, + {"g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Values<object>("age").Choose<object>(__.Is(P.Gt(__.V(p["vid1"]).Values<object>("age"))), __.Constant<object>("older than marko"), __.Constant<object>("not older"))}}, + {"g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().HasLabel("person").Values<object>("age").Choose<object>(__.Is(P.Gte(__.V().HasLabel("person").Values<object>("age").Mean<object>())), __.Constant<object>("above average"), __.Constant<object>("below average"))}}, {"g_VXvid1X_outXknowsX_valuesXageX_fold_allXgteXVXvid2X_valuesXageXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out("knows").Values<object>("age").Fold().All(P.Gte(__.V(p["vid2"]).Values<object>("age")))}}, {"g_VXvid1X_outXknowsX_valuesXageX_fold_allXgtXVXvid2X_valuesXageXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out("knows").Values<object>("age").Fold().All(P.Gt(__.V(p["vid2"]).Values<object>("age")))}}, {"g_VXvid1X_outXknowsX_valuesXageX_fold_anyXeqXVXvid3X_valuesXageXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out("knows").Values<object>("age").Fold().Any(P.Eq(__.V(p["vid3"]).Values<object>("age")))}}, @@ -598,7 +598,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_VXvid1X_outXknowsX_valuesXageX_fold_noneXeqXVXvid3X_valuesXageXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid1"]).Out("knows").Values<object>("age").Fold().None(P.Eq(__.V(p["vid3"]).Values<object>("age")))}}, {"g_injectXnullX_isXeqXV9999_valuesXnameXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(null).Is(P.Eq(__.V(9999).Values<object>("name")))}}, {"g_injectXmarkoX_isXV9999_valuesXnameXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("marko").Is(__.V(9999).Values<object>("name"))}}, - {"g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("marko").Choose<object>(P.Eq(__.V(9999).Values<object>("name")), __.Constant<object>("matched"), __.Constant<object>("unmatched"))}}, + {"g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>("marko").Choose<object>(__.Is(P.Eq(__.V(9999).Values<object>("name"))), __.Constant<object>("matched"), __.Constant<object>("unmatched"))}}, {"g_injectXlistX_noneXeqXV9999_valuesXnameXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new List<object> { "marko", "josh" }).None(P.Eq(__.V(9999).Values<object>("name")))}}, {"g_V_hasXname_eqXV9999_valuesXnameXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("name", P.Eq(__.V(9999).Values<object>("name")))}}, {"g_V_valuesXageX_isXwithoutXVXvid1X_valuesXageX_VXvid2X_valuesXageXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Values<object>("age").Is(P.Without(__.V(p["vid1"]).Values<object>("age"), __.V(p["vid2"]).Values<object>("age")))}}, @@ -1012,9 +1012,9 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_addV_propertyXsingle_mapX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property(Cardinality.Single, new Dictionary<object, object> {{ "name", "foo" }, { "age", 42 }}), (g,p) =>g.V().Has("name", "foo")}}, {"g_V_hasXname_fooX_propertyXname_setXbarX_age_43X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property(Cardinality.Single, "name", "foo").Property("age", 42), (g,p) =>g.V().Has("name", "foo").Property(new Dictionary<object, object> {{ "name", CardinalityValue.Set("bar") }, { "age", 43 }}), (g,p) =>g.V().Has("name", "foo"), (g,p) =>g.V().Has("name", "bar"), (g,p) =>g.V().Has("age", 43), (g,p) =>g.V().Has("age", 42)}}, {"g_V_hasXname_fooX_propertyXset_name_bar_age_singleX43XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV().Property(Cardinality.Single, "name", "foo").Property("age", 42), (g,p) =>g.V().Has("name", "foo").Property(Cardinality.Set, new Dictionary<object, object> {{ "name", "bar" }, { "age", CardinalityValue.Single(43) }}), (g,p) =>g.V().Has("name", "foo"), (g,p) =>g.V().Has("name", "bar"), (g,p) =>g.V().Has("age", 43), (g,p) [...] - {"g_addV_propertyXnullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "person").Property(null), (g,p) =>g.V().HasLabel("person").Values<object>()}}, + {"g_addV_propertyXnullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "person").Property((IDictionary<object, object>) null), (g,p) =>g.V().HasLabel("person").Values<object>()}}, {"g_addV_propertyXemptyX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "person").Property(new Dictionary<object, object> {}), (g,p) =>g.V().HasLabel("person").Values<object>()}}, - {"g_addV_propertyXset_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "foo").Property(Cardinality.Set, null), (g,p) =>g.V().HasLabel("foo").Values<object>()}}, + {"g_addV_propertyXset_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "foo").Property(Cardinality.Set, (IDictionary<object, object>) null), (g,p) =>g.V().HasLabel("foo").Values<object>()}}, {"g_addV_propertyXset_emptyX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "foo").Property(Cardinality.Set, new Dictionary<object, object> {}), (g,p) =>g.V().HasLabel("person").Values<object>()}}, {"g_addVXpersonX_propertyXname_joshX_propertyXage_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "person").Property("name", "josh").Property("age", null), (g,p) =>g.V().Has("person", "age", (object) null)}}, {"g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "person").Property("name", "marko").Property("friendWeight", null, "acl", null), (g,p) =>g.V().Has("person", "name", "marko").Has("friendWeight", (object) null), (g,p) =>g.V().Has("person", "name", "marko").Properties<object>("friendWeight").Has("acl", (object) null), (g,p) =>g.V().Has("person", [...] diff --git a/gremlin-go/driver/cucumber/gremlin.go b/gremlin-go/driver/cucumber/gremlin.go index 1a7bf90d0c..21fdbd5b0a 100644 --- a/gremlin-go/driver/cucumber/gremlin.go +++ b/gremlin-go/driver/cucumber/gremlin.go @@ -559,8 +559,8 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[ "g_V_valuesXageX_isXneqXVXvid4X_valuesXageXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("age").Is(gremlingo.P.Neq(gremlingo.T__.V(p["vid4"]).Values("age")))}}, "g_V_valuesXageX_isXwithinXVXvid1X_outXknowsX_valuesXageXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("age").Is(gremlingo.P.Within(gremlingo.T__.V(p["vid1"]).Out("knows").Values("age").Fold()))}}, "g_V_valuesXageX_isXVXvid1X_valuesXnonexistentXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("age").Is(gremlingo.T__.V(p["vid1"]).Values("nonexistent"))}}, - "g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Values("age").Choose(gremlingo.P.Gt(gremlingo.T__.V(p["vid1"]).Values("age")), gremlingo.T__.Constant("older than marko"), gremlingo.T__.Constant("not older"))}}, - "g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Values("age").Choose(gremlingo.P.Gte(gremlingo.T__.V().HasLabel("person").Values("age").Mean()), gremlingo.T__.Constant("above average"), gremlingo.T__.Constant("below average"))}}, + "g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Values("age").Choose(gremlingo.T__.Is(gremlingo.P.Gt(gremlingo.T__.V(p["vid1"]).Values("age"))), gremlingo.T__.Constant("older than marko"), gremlingo.T__.Constant("not older"))}}, + "g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().HasLabel("person").Values("age").Choose(gremlingo.T__.Is(gremlingo.P.Gte(gremlingo.T__.V().HasLabel("person").Values("age").Mean())), gremlingo.T__.Constant("above average"), gremlingo.T__.Constant("below average"))}}, "g_VXvid1X_outXknowsX_valuesXageX_fold_allXgteXVXvid2X_valuesXageXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Out("knows").Values("age").Fold().All(gremlingo.P.Gte(gremlingo.T__.V(p["vid2"]).Values("age")))}}, "g_VXvid1X_outXknowsX_valuesXageX_fold_allXgtXVXvid2X_valuesXageXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Out("knows").Values("age").Fold().All(gremlingo.P.Gt(gremlingo.T__.V(p["vid2"]).Values("age")))}}, "g_VXvid1X_outXknowsX_valuesXageX_fold_anyXeqXVXvid3X_valuesXageXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Out("knows").Values("age").Fold().Any(gremlingo.P.Eq(gremlingo.T__.V(p["vid3"]).Values("age")))}}, @@ -568,7 +568,7 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[ "g_VXvid1X_outXknowsX_valuesXageX_fold_noneXeqXVXvid3X_valuesXageXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid1"]).Out("knows").Values("age").Fold().None(gremlingo.P.Eq(gremlingo.T__.V(p["vid3"]).Values("age")))}}, "g_injectXnullX_isXeqXV9999_valuesXnameXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(nil).Is(gremlingo.P.Eq(gremlingo.T__.V(9999).Values("name")))}}, "g_injectXmarkoX_isXV9999_valuesXnameXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("marko").Is(gremlingo.T__.V(9999).Values("name"))}}, - "g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("marko").Choose(gremlingo.P.Eq(gremlingo.T__.V(9999).Values("name")), gremlingo.T__.Constant("matched"), gremlingo.T__.Constant("unmatched"))}}, + "g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject("marko").Choose(gremlingo.T__.Is(gremlingo.P.Eq(gremlingo.T__.V(9999).Values("name"))), gremlingo.T__.Constant("matched"), gremlingo.T__.Constant("unmatched"))}}, "g_injectXlistX_noneXeqXV9999_valuesXnameXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject([]interface{}{"marko", "josh"}).None(gremlingo.P.Eq(gremlingo.T__.V(9999).Values("name")))}}, "g_V_hasXname_eqXV9999_valuesXnameXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("name", gremlingo.P.Eq(gremlingo.T__.V(9999).Values("name")))}}, "g_V_valuesXageX_isXwithoutXVXvid1X_valuesXageX_VXvid2X_valuesXageXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("age").Is(gremlingo.P.Without(gremlingo.T__.V(p["vid1"]).Values("age"), gremlingo.T__.V(p["vid2"]).Values("age")))}}, diff --git a/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js index ea9b014ee2..dbdbb02d55 100644 --- a/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js +++ b/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js @@ -590,8 +590,8 @@ const gremlins = { g_V_valuesXageX_isXneqXVXvid4X_valuesXageXXX: [function({g, vid4}) { return g.V().values("age").is(P.neq(__.V(vid4).values("age"))) }], g_V_valuesXageX_isXwithinXVXvid1X_outXknowsX_valuesXageXXX: [function({g, vid1}) { return g.V().values("age").is(P.within(__.V(vid1).out("knows").values("age").fold())) }], g_V_valuesXageX_isXVXvid1X_valuesXnonexistentXX: [function({g, vid1}) { return g.V().values("age").is(__.V(vid1).values("nonexistent")) }], - g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX: [function({g, vid1}) { return g.V().hasLabel("person").values("age").choose(P.gt(__.V(vid1).values("age")), __.constant("older than marko"), __.constant("not older")) }], - g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX: [function({g}) { return g.V().hasLabel("person").values("age").choose(P.gte(__.V().hasLabel("person").values("age").mean()), __.constant("above average"), __.constant("below average")) }], + g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX: [function({g, vid1}) { return g.V().hasLabel("person").values("age").choose(__.is(P.gt(__.V(vid1).values("age"))), __.constant("older than marko"), __.constant("not older")) }], + g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX: [function({g}) { return g.V().hasLabel("person").values("age").choose(__.is(P.gte(__.V().hasLabel("person").values("age").mean())), __.constant("above average"), __.constant("below average")) }], g_VXvid1X_outXknowsX_valuesXageX_fold_allXgteXVXvid2X_valuesXageXXX: [function({g, vid2, vid1}) { return g.V(vid1).out("knows").values("age").fold().all(P.gte(__.V(vid2).values("age"))) }], g_VXvid1X_outXknowsX_valuesXageX_fold_allXgtXVXvid2X_valuesXageXXX: [function({g, vid2, vid1}) { return g.V(vid1).out("knows").values("age").fold().all(P.gt(__.V(vid2).values("age"))) }], g_VXvid1X_outXknowsX_valuesXageX_fold_anyXeqXVXvid3X_valuesXageXXX: [function({g, vid3, vid1}) { return g.V(vid1).out("knows").values("age").fold().any(P.eq(__.V(vid3).values("age"))) }], @@ -599,7 +599,7 @@ const gremlins = { g_VXvid1X_outXknowsX_valuesXageX_fold_noneXeqXVXvid3X_valuesXageXXX: [function({g, vid3, vid1}) { return g.V(vid1).out("knows").values("age").fold().none(P.eq(__.V(vid3).values("age"))) }], g_injectXnullX_isXeqXV9999_valuesXnameXXX: [function({g}) { return g.inject(null).is(P.eq(__.V(9999).values("name"))) }], g_injectXmarkoX_isXV9999_valuesXnameXX: [function({g}) { return g.inject("marko").is(__.V(9999).values("name")) }], - g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX: [function({g}) { return g.inject("marko").choose(P.eq(__.V(9999).values("name")), __.constant("matched"), __.constant("unmatched")) }], + g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX: [function({g}) { return g.inject("marko").choose(__.is(P.eq(__.V(9999).values("name"))), __.constant("matched"), __.constant("unmatched")) }], g_injectXlistX_noneXeqXV9999_valuesXnameXXX: [function({g}) { return g.inject(["marko", "josh"]).none(P.eq(__.V(9999).values("name"))) }], g_V_hasXname_eqXV9999_valuesXnameXXX: [function({g}) { return g.V().has("name", P.eq(__.V(9999).values("name"))) }], g_V_valuesXageX_isXwithoutXVXvid1X_valuesXageX_VXvid2X_valuesXageXXX: [function({g, vid2, vid1}) { return g.V().values("age").is(P.without(__.V(vid1).values("age"), __.V(vid2).values("age"))) }], diff --git a/gremlin-python/src/main/python/tests/feature/gremlin.py b/gremlin-python/src/main/python/tests/feature/gremlin.py index eb3fcb11df..b7057b9ebc 100644 --- a/gremlin-python/src/main/python/tests/feature/gremlin.py +++ b/gremlin-python/src/main/python/tests/feature/gremlin.py @@ -564,8 +564,8 @@ world.gremlins = { 'g_V_valuesXageX_isXneqXVXvid4X_valuesXageXXX': [(lambda g, vid4=None:g.V().values('age').is_(P.neq(__.V(vid4).values('age'))))], 'g_V_valuesXageX_isXwithinXVXvid1X_outXknowsX_valuesXageXXX': [(lambda g, vid1=None:g.V().values('age').is_(P.within(__.V(vid1).out('knows').values('age').fold())))], 'g_V_valuesXageX_isXVXvid1X_valuesXnonexistentXX': [(lambda g, vid1=None:g.V().values('age').is_(__.V(vid1).values('nonexistent')))], - 'g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX': [(lambda g, vid1=None:g.V().has_label('person').values('age').choose(P.gt(__.V(vid1).values('age')), __.constant('older than marko'), __.constant('not older')))], - 'g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX': [(lambda g:g.V().has_label('person').values('age').choose(P.gte(__.V().has_label('person').values('age').mean()), __.constant('above average'), __.constant('below average')))], + 'g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX': [(lambda g, vid1=None:g.V().has_label('person').values('age').choose(__.is_(P.gt(__.V(vid1).values('age'))), __.constant('older than marko'), __.constant('not older')))], + 'g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX': [(lambda g:g.V().has_label('person').values('age').choose(__.is_(P.gte(__.V().has_label('person').values('age').mean())), __.constant('above average'), __.constant('below average')))], 'g_VXvid1X_outXknowsX_valuesXageX_fold_allXgteXVXvid2X_valuesXageXXX': [(lambda g, vid2=None,vid1=None:g.V(vid1).out('knows').values('age').fold().all_(P.gte(__.V(vid2).values('age'))))], 'g_VXvid1X_outXknowsX_valuesXageX_fold_allXgtXVXvid2X_valuesXageXXX': [(lambda g, vid2=None,vid1=None:g.V(vid1).out('knows').values('age').fold().all_(P.gt(__.V(vid2).values('age'))))], 'g_VXvid1X_outXknowsX_valuesXageX_fold_anyXeqXVXvid3X_valuesXageXXX': [(lambda g, vid3=None,vid1=None:g.V(vid1).out('knows').values('age').fold().any_(P.eq(__.V(vid3).values('age'))))], @@ -573,7 +573,7 @@ world.gremlins = { 'g_VXvid1X_outXknowsX_valuesXageX_fold_noneXeqXVXvid3X_valuesXageXXX': [(lambda g, vid3=None,vid1=None:g.V(vid1).out('knows').values('age').fold().none(P.eq(__.V(vid3).values('age'))))], 'g_injectXnullX_isXeqXV9999_valuesXnameXXX': [(lambda g:g.inject(None).is_(P.eq(__.V(9999).values('name'))))], 'g_injectXmarkoX_isXV9999_valuesXnameXX': [(lambda g:g.inject('marko').is_(__.V(9999).values('name')))], - 'g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX': [(lambda g:g.inject('marko').choose(P.eq(__.V(9999).values('name')), __.constant('matched'), __.constant('unmatched')))], + 'g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX': [(lambda g:g.inject('marko').choose(__.is_(P.eq(__.V(9999).values('name'))), __.constant('matched'), __.constant('unmatched')))], 'g_injectXlistX_noneXeqXV9999_valuesXnameXXX': [(lambda g:g.inject(['marko', 'josh']).none(P.eq(__.V(9999).values('name'))))], 'g_V_hasXname_eqXV9999_valuesXnameXXX': [(lambda g:g.V().has('name', P.eq(__.V(9999).values('name'))))], 'g_V_valuesXageX_isXwithoutXVXvid1X_valuesXageX_VXvid2X_valuesXageXXX': [(lambda g, vid2=None,vid1=None:g.V().values('age').is_(P.without(__.V(vid1).values('age'), __.V(vid2).values('age'))))], diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json index f59fb17768..64e585b07c 100644 --- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json +++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json @@ -10235,16 +10235,16 @@ "scenario": "g_V_hasLabelXpersonX_valuesXageX_chooseXgtXVXvid1X_valuesXageXX_olderX", "traversals": [ { - "original": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gt(__.V(vid1).values(\"age\")), __.constant(\"older than marko\"), __.constant(\"not older\"))", - "language": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gt(__.V(vid1).values(\"age\")), __.constant(\"older than marko\"), __.constant(\"not older\"))", - "canonical": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gt(__.V(vid1).values(\"age\")), __.constant(\"older than marko\"), __.constant(\"not older\"))", - "anonymized": "g.V().hasLabel(string0).values(string1).choose(P.gt(__.V(vid1).values(string1)), __.constant(string2), __.constant(string3))", - "dotnet": "g.V().HasLabel(\"person\").Values<object>(\"age\").Choose<object>(P.Gt(__.V(vid1).Values<object>(\"age\")), __.Constant<object>(\"older than marko\"), __.Constant<object>(\"not older\"))", - "go": "g.V().HasLabel(\"person\").Values(\"age\").Choose(gremlingo.P.Gt(gremlingo.T__.V(vid1).Values(\"age\")), gremlingo.T__.Constant(\"older than marko\"), gremlingo.T__.Constant(\"not older\"))", - "groovy": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gt(__.V(vid1).values(\"age\")), __.constant(\"older than marko\"), __.constant(\"not older\"))", - "java": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gt(__.V(vid1).values(\"age\")), __.constant(\"older than marko\"), __.constant(\"not older\"))", - "javascript": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gt(__.V(vid1).values(\"age\")), __.constant(\"older than marko\"), __.constant(\"not older\"))", - "python": "g.V().has_label('person').values('age').choose(P.gt(__.V(vid1).values('age')), __.constant('older than marko'), __.constant('not older'))" + "original": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gt(__.V(vid1).values(\"age\"))), __.constant(\"older than marko\"), __.constant(\"not older\"))", + "language": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gt(__.V(vid1).values(\"age\"))), __.constant(\"older than marko\"), __.constant(\"not older\"))", + "canonical": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gt(__.V(vid1).values(\"age\"))), __.constant(\"older than marko\"), __.constant(\"not older\"))", + "anonymized": "g.V().hasLabel(string0).values(string1).choose(__.is(P.gt(__.V(vid1).values(string1))), __.constant(string2), __.constant(string3))", + "dotnet": "g.V().HasLabel(\"person\").Values<object>(\"age\").Choose<object>(__.Is(P.Gt(__.V(vid1).Values<object>(\"age\"))), __.Constant<object>(\"older than marko\"), __.Constant<object>(\"not older\"))", + "go": "g.V().HasLabel(\"person\").Values(\"age\").Choose(gremlingo.T__.Is(gremlingo.P.Gt(gremlingo.T__.V(vid1).Values(\"age\"))), gremlingo.T__.Constant(\"older than marko\"), gremlingo.T__.Constant(\"not older\"))", + "groovy": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gt(__.V(vid1).values(\"age\"))), __.constant(\"older than marko\"), __.constant(\"not older\"))", + "java": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gt(__.V(vid1).values(\"age\"))), __.constant(\"older than marko\"), __.constant(\"not older\"))", + "javascript": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gt(__.V(vid1).values(\"age\"))), __.constant(\"older than marko\"), __.constant(\"not older\"))", + "python": "g.V().has_label('person').values('age').choose(__.is_(P.gt(__.V(vid1).values('age'))), __.constant('older than marko'), __.constant('not older'))" } ] }, @@ -10252,16 +10252,16 @@ "scenario": "g_V_hasLabelXpersonX_valuesXageX_chooseXgteXmeanAgeX_aboveX", "traversals": [ { - "original": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean()), __.constant(\"above average\"), __.constant(\"below average\"))", - "language": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean()), __.constant(\"above average\"), __.constant(\"below average\"))", - "canonical": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean()), __.constant(\"above average\"), __.constant(\"below average\"))", - "anonymized": "g.V().hasLabel(string0).values(string1).choose(P.gte(__.V().hasLabel(string0).values(string1).mean()), __.constant(string2), __.constant(string3))", - "dotnet": "g.V().HasLabel(\"person\").Values<object>(\"age\").Choose<object>(P.Gte(__.V().HasLabel(\"person\").Values<object>(\"age\").Mean<object>()), __.Constant<object>(\"above average\"), __.Constant<object>(\"below average\"))", - "go": "g.V().HasLabel(\"person\").Values(\"age\").Choose(gremlingo.P.Gte(gremlingo.T__.V().HasLabel(\"person\").Values(\"age\").Mean()), gremlingo.T__.Constant(\"above average\"), gremlingo.T__.Constant(\"below average\"))", - "groovy": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean()), __.constant(\"above average\"), __.constant(\"below average\"))", - "java": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean()), __.constant(\"above average\"), __.constant(\"below average\"))", - "javascript": "g.V().hasLabel(\"person\").values(\"age\").choose(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean()), __.constant(\"above average\"), __.constant(\"below average\"))", - "python": "g.V().has_label('person').values('age').choose(P.gte(__.V().has_label('person').values('age').mean()), __.constant('above average'), __.constant('below average'))" + "original": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean())), __.constant(\"above average\"), __.constant(\"below average\"))", + "language": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean())), __.constant(\"above average\"), __.constant(\"below average\"))", + "canonical": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean())), __.constant(\"above average\"), __.constant(\"below average\"))", + "anonymized": "g.V().hasLabel(string0).values(string1).choose(__.is(P.gte(__.V().hasLabel(string0).values(string1).mean())), __.constant(string2), __.constant(string3))", + "dotnet": "g.V().HasLabel(\"person\").Values<object>(\"age\").Choose<object>(__.Is(P.Gte(__.V().HasLabel(\"person\").Values<object>(\"age\").Mean<object>())), __.Constant<object>(\"above average\"), __.Constant<object>(\"below average\"))", + "go": "g.V().HasLabel(\"person\").Values(\"age\").Choose(gremlingo.T__.Is(gremlingo.P.Gte(gremlingo.T__.V().HasLabel(\"person\").Values(\"age\").Mean())), gremlingo.T__.Constant(\"above average\"), gremlingo.T__.Constant(\"below average\"))", + "groovy": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean())), __.constant(\"above average\"), __.constant(\"below average\"))", + "java": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean())), __.constant(\"above average\"), __.constant(\"below average\"))", + "javascript": "g.V().hasLabel(\"person\").values(\"age\").choose(__.is(P.gte(__.V().hasLabel(\"person\").values(\"age\").mean())), __.constant(\"above average\"), __.constant(\"below average\"))", + "python": "g.V().has_label('person').values('age').choose(__.is_(P.gte(__.V().has_label('person').values('age').mean())), __.constant('above average'), __.constant('below average'))" } ] }, @@ -10388,16 +10388,16 @@ "scenario": "g_injectXmarkoX_chooseXeqXV9999_valuesXnameXX_matched_unmatchedX", "traversals": [ { - "original": "g.inject(\"marko\").choose(P.eq(__.V(9999).values(\"name\")), __.constant(\"matched\"), __.constant(\"unmatched\"))", - "language": "g.inject(\"marko\").choose(P.eq(__.V(9999).values(\"name\")), __.constant(\"matched\"), __.constant(\"unmatched\"))", - "canonical": "g.inject(\"marko\").choose(P.eq(__.V(9999).values(\"name\")), __.constant(\"matched\"), __.constant(\"unmatched\"))", - "anonymized": "g.inject(string0).choose(P.eq(__.V(number0).values(string1)), __.constant(string2), __.constant(string3))", - "dotnet": "g.Inject<object>(\"marko\").Choose<object>(P.Eq(__.V(9999).Values<object>(\"name\")), __.Constant<object>(\"matched\"), __.Constant<object>(\"unmatched\"))", - "go": "g.Inject(\"marko\").Choose(gremlingo.P.Eq(gremlingo.T__.V(9999).Values(\"name\")), gremlingo.T__.Constant(\"matched\"), gremlingo.T__.Constant(\"unmatched\"))", - "groovy": "g.inject(\"marko\").choose(P.eq(__.V(9999).values(\"name\")), __.constant(\"matched\"), __.constant(\"unmatched\"))", - "java": "g.inject(\"marko\").choose(P.eq(__.V(9999).values(\"name\")), __.constant(\"matched\"), __.constant(\"unmatched\"))", - "javascript": "g.inject(\"marko\").choose(P.eq(__.V(9999).values(\"name\")), __.constant(\"matched\"), __.constant(\"unmatched\"))", - "python": "g.inject('marko').choose(P.eq(__.V(9999).values('name')), __.constant('matched'), __.constant('unmatched'))" + "original": "g.inject(\"marko\").choose(__.is(P.eq(__.V(9999).values(\"name\"))), __.constant(\"matched\"), __.constant(\"unmatched\"))", + "language": "g.inject(\"marko\").choose(__.is(P.eq(__.V(9999).values(\"name\"))), __.constant(\"matched\"), __.constant(\"unmatched\"))", + "canonical": "g.inject(\"marko\").choose(__.is(P.eq(__.V(9999).values(\"name\"))), __.constant(\"matched\"), __.constant(\"unmatched\"))", + "anonymized": "g.inject(string0).choose(__.is(P.eq(__.V(number0).values(string1))), __.constant(string2), __.constant(string3))", + "dotnet": "g.Inject<object>(\"marko\").Choose<object>(__.Is(P.Eq(__.V(9999).Values<object>(\"name\"))), __.Constant<object>(\"matched\"), __.Constant<object>(\"unmatched\"))", + "go": "g.Inject(\"marko\").Choose(gremlingo.T__.Is(gremlingo.P.Eq(gremlingo.T__.V(9999).Values(\"name\"))), gremlingo.T__.Constant(\"matched\"), gremlingo.T__.Constant(\"unmatched\"))", + "groovy": "g.inject(\"marko\").choose(__.is(P.eq(__.V(9999).values(\"name\"))), __.constant(\"matched\"), __.constant(\"unmatched\"))", + "java": "g.inject(\"marko\").choose(__.is(P.eq(__.V(9999).values(\"name\"))), __.constant(\"matched\"), __.constant(\"unmatched\"))", + "javascript": "g.inject(\"marko\").choose(__.is(P.eq(__.V(9999).values(\"name\"))), __.constant(\"matched\"), __.constant(\"unmatched\"))", + "python": "g.inject('marko').choose(__.is_(P.eq(__.V(9999).values('name'))), __.constant('matched'), __.constant('unmatched'))" } ] }, diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/IsTraversal.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/IsTraversal.feature index 4a70f2ba24..6872769c9b 100644 --- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/IsTraversal.feature +++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/IsTraversal.feature @@ -118,7 +118,7 @@ Feature: Step - is() with traversal-bearing predicates And using the parameter vid1 defined as "v[marko].id" And the traversal of """ - g.V().hasLabel("person").values("age").choose(P.gt(__.V(vid1).values("age")), __.constant("older than marko"), __.constant("not older")) + g.V().hasLabel("person").values("age").choose(__.is(P.gt(__.V(vid1).values("age"))), __.constant("older than marko"), __.constant("not older")) """ When iterated to list Then the result should be unordered @@ -133,7 +133,7 @@ Feature: Step - is() with traversal-bearing predicates Given the modern graph And the traversal of """ - g.V().hasLabel("person").values("age").choose(P.gte(__.V().hasLabel("person").values("age").mean()), __.constant("above average"), __.constant("below average")) + g.V().hasLabel("person").values("age").choose(__.is(P.gte(__.V().hasLabel("person").values("age").mean())), __.constant("above average"), __.constant("below average")) """ When iterated to list Then the result should be unordered @@ -229,7 +229,7 @@ Feature: Step - is() with traversal-bearing predicates Given the modern graph And the traversal of """ - g.inject("marko").choose(P.eq(__.V(9999).values("name")), __.constant("matched"), __.constant("unmatched")) + g.inject("marko").choose(__.is(P.eq(__.V(9999).values("name"))), __.constant("matched"), __.constant("unmatched")) """ When iterated to list Then the result should be unordered
