This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 804eeab95473c9dc80b916baa029e115665bc2f8
Author: Stephen Mallette <[email protected]>
AuthorDate: Fri Jan 26 13:36:14 2024 -0500

    TINKERPOP-2456 Added a few language tests CTR
---
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs |  7 +++++
 gremlin-go/driver/cucumber/gremlin.go              |  7 +++++
 .../gremlin-javascript/test/cucumber/gremlin.js    |  7 +++++
 gremlin-python/src/main/python/radish/gremlin.py   |  7 +++++
 .../gremlin/test/features/filter/Dedup.feature     | 34 ++++++++++++++++++++++
 .../gremlin/test/features/filter/Where.feature     | 14 ++++++++-
 .../gremlin/test/features/map/AddVertex.feature    | 29 +++++++++++++++++-
 .../gremlin/test/features/map/Count.feature        | 24 ++++++++++++++-
 .../test/features/sideEffect/Aggregate.feature     | 18 +++++++++++-
 9 files changed, 143 insertions(+), 4 deletions(-)

diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index 4cc6e6401d..eaa8d8c58b 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -197,6 +197,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_V_both_dedup_age_name", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().Both().Dedup().By("age").Values<object>("name")}}, 
                
{"g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V(p["vid1"]).As("a").Both().As("b").Both().As("c").Dedup("a","b").By("age").Select<object>("a","b","c").By("name")}},
 
                {"g_VX1X_valuesXageX_dedupXlocalX_unfold", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V(p["vid1"]).Values<object>("age").Dedup(Scope.Local).Unfold<object>()}}, 
+               {"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_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>()}}, 
@@ -390,6 +392,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                
{"g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.WithStrategies(new ProductiveByStrategy(productiveKeys: new 
List<object> 
{})).V(p["vid3"]).As("a").In().Out().As("b").Where("a",P.Eq("b")).By("age").Values<object>("name")}},
 
                
{"g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().As("n").Where(__.Or(__.HasLabel("software"),__.HasLabel("person"))).Select<object>("n").By("name")}},
 
                
{"g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().As("n").Where(__.Or(__.Select<object>("n").HasLabel("software"),__.Select<object>("n").HasLabel("person"))).Select<object>("n").By("name")}},
 
+               
{"g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().HasLabel("person").As("x").Where(__.InE("knows").Count().Is(P.Gte(1))).Select<object>("x")}},
 
                {"g_V_coworker", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().HasLabel("person").Filter(__.OutE("created")).Aggregate("p").As("p1").Values<object>("name").As("p1n").Select<object>("p").Unfold<object>().Where(P.Neq("p1")).As("p2").Values<object>("name").As("p2n").Select<object>("p2").Out("created").Choose<object>(__.In("created").Where(P.Eq("p1")),__.Values<object>("name"),__.Constant<object>(p["xx1"])).Group<object,object>().
 [...]
                {"g_V_coworker_with_midV", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().HasLabel("person").Filter(__.OutE("created")).As("p1").V().HasLabel("person").Where(P.Neq("p1")).Filter(__.OutE("created")).As("p2").Map<object>(__.Out("created").Where(__.In("created").As("p1")).Values<object>("name").Fold()).Group<object,object>().By(__.Select<object>("p1").By("name")).By(__.Group<object,object>().By(__.Select<object>("p2").By("name")).
 [...]
                {"g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.AddV("person").Property("_partition","a").Property("name","alice").AddV("person").Property("_partition","b").Property("name","bob"),
 (g,p) =>g.WithStrategies(new PartitionStrategy(includeMetaProperties: false, 
partitionKey: "_partition", readPartitions: new HashSet<string> {"a"}, 
writePartition: "a")).V().Values<object>("na [...]
@@ -524,6 +527,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_addVXpersonX_propertyXname_joshX_propertyXage_nullX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV("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("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","name","marko").Prop [...]
                
{"g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.AddV("person").Property("name","alice").Property(Cardinality.Single,"age",50),
 (g,p) 
=>g.V().Has("person","name","alice").Property("age",__.Union<object>(__.Values<object>("age"),__.Constant<object>(1)).Sum<object>()),
 (g,p) =>g.V().Has("person","age",50), (g,p) =>g.V().Has("person","age",51)}}, 
+               
{"g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.AddV("person").Property("name","marko").Property("age",29).As("marko").AddV("person").Property("name","vadas").Property("age",27).As("vadas").AddV("software").Property("name","lop").Property("lang","java").As("lop").AddV("person").Property("name","josh").Property("age
 [...]
                {"g_injectXstrX_asDate", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.Inject("2023-08-02T00:00:00Z").AsDate()}}, 
                {"g_injectX1694017707000X_asDate", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.Inject(1694017707000).AsDate()}}, 
                {"g_injectX1694017708000LX_asDate", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.Inject(p["xx1"]).AsDate()}}, 
@@ -635,6 +639,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_E_sampleX1X_count", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) =>g.E().Sample(1).Count()}}, 
                {"g_V_sampleX1X_byXageX_count", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Sample(1).By("age").Count()}}, 
                {"g_V_order_byXnoX_count", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().Order().By("no").Count()}}, 
+               {"g_V_group_byXlabelX_count", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Group<object,object>().By(T.Label).Count()}}, 
+               {"g_V_group_byXlabelX_countXlocalX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Group<object,object>().By(T.Label).Count(Scope.Local)}}, 
                {"g_injectXdatetimeXstrXX_dateAddXDT_hour_2X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.Inject(DateTimeOffset.FromUnixTimeMilliseconds(1690934400000)).DateAdd(DT.Hour,2)}},
 
                {"g_injectXdatetimeXstrXX_dateAddXhour_2X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.Inject(DateTimeOffset.FromUnixTimeMilliseconds(1690934400000)).DateAdd(DT.Hour,2)}},
 
                {"g_injectXdatetimeXstrXX_dateAddXhour_1X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.Inject(DateTimeOffset.FromUnixTimeMilliseconds(1690934400000)).DateAdd(DT.Hour,-1)}},
 
@@ -1407,6 +1413,7 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                
{"g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.WithStrategies(new ProductiveByStrategy(productiveKeys: new 
List<object> 
{})).V().Aggregate("x").By(__.Values<object>("age").Is(P.Gt(29))).Cap<object>("x")}},
 
                {"g_V_aggregateXxX_byXout_order_byXnameXX_capXxX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Aggregate("x").By(__.Out().Order().By("name")).Cap<object>("x")}}, 
                
{"g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX",
 new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.WithStrategies(new ProductiveByStrategy(productiveKeys: new 
List<object> 
{})).V().Aggregate("x").By(__.Out().Order().By("name")).Cap<object>("x")}}, 
+               
{"g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Aggregate("a").Has("person","age",P.Gte(30)).Cap<object>("a").Unfold<object>().Values<object>("name")}},
 
                {"g_V_fail", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Fail()}}, 
                {"g_V_failXmsgX", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Fail("msg")}}, 
                {"g_V_unionXout_failX", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().Union<object>(__.Out(),__.Fail())}}, 
diff --git a/gremlin-go/driver/cucumber/gremlin.go 
b/gremlin-go/driver/cucumber/gremlin.go
index 7cbf449ed7..cef068fe95 100644
--- a/gremlin-go/driver/cucumber/gremlin.go
+++ b/gremlin-go/driver/cucumber/gremlin.go
@@ -168,6 +168,8 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_V_both_dedup_age_name": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Both().Dedup().By("age").Values("name")}}, 
     "g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V(p["vid1"]).As("a").Both().As("b").Both().As("c").Dedup("a", 
"b").By("age").Select("a", "b", "c").By("name")}}, 
     "g_VX1X_valuesXageX_dedupXlocalX_unfold": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V(p["vid1"]).Values("age").Dedup(gremlingo.Scope.Local).Unfold()}}, 
+    "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_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 [...]
@@ -361,6 +363,7 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     
"g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.WithStrategies(gremlingo.ProductiveByStrategy(gremlingo.ProductiveByStrategyConfig{ProductiveKeys:
 []string{}})).V(p["vid3"]).As("a").In().Out().As("b").Where("a", 
gremlingo.P.Eq("b")).By("age").Values("name")}}, 
     
"g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().As("n").Where(gremlingo.T__.Or(gremlingo.T__.HasLabel("software"), 
gremlingo.T__.HasLabel("person"))).Select("n").By("name")}}, 
     
"g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().As("n").Where(gremlingo.T__.Or(gremlingo.T__.Select("n").HasLabel("software"),
 gremlingo.T__.Select("n").HasLabel("person"))).Select("n").By("name")}}, 
+    "g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().HasLabel("person").As("x").Where(gremlingo.T__.InE("knows").Count().Is(gremlingo.P.Gte(1))).Select("x")}},
 
     "g_V_coworker": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().HasLabel("person").Filter(gremlingo.T__.OutE("created")).Aggregate("p").As("p1").Values("name").As("p1n").Select("p").Unfold().Where(gremlingo.P.Neq("p1")).As("p2").Values("name").As("p2n").Select("p2").Out("created").Choose(gremlingo.T__.In("created").Where(gremlingo.P.Eq("p1")),
 gremlingo.T__.Values("name"), 
gremlingo.T__.Constant(p["xx1"])).Group().By(gremling [...]
     "g_V_coworker_with_midV": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().HasLabel("person").Filter(gremlingo.T__.OutE("created")).As("p1").V().HasLabel("person").Where(gremlingo.P.Neq("p1")).Filter(gremlingo.T__.OutE("created")).As("p2").Map(gremlingo.T__.Out("created").Where(gremlingo.T__.In("created").As("p1")).Values("name").Fold()).Group().By(gremlingo.T__.Select("p1").By("name")).By(gremlingo.T__.Group().By(gremlingo.T_
 [...]
     "g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("_partition", 
"a").Property("name", "alice").AddV("person").Property("_partition", 
"b").Property("name", "bob")}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.WithStrategies(gremlingo.PartitionStrategy(gremlingo.PartitionStrategyConfig{Includ
 [...]
@@ -495,6 +498,7 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_addVXpersonX_propertyXname_joshX_propertyXage_nullX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"josh").Property("age", nil)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("person", 
"age", nil)}}, 
     
"g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("friendWeight", nil, "acl", nil)}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Has("friendWeight", nil)}, func(g *gremlingo.GraphTraversalSource, p 
map[string]interfa [...]
     
"g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"alice").Property(gremlingo.Cardinality.Single, "age", 50)}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"alice").Property("age", gremlingo.T__.Union(gremlingo.T__.Values("age"), 
gremlingo.T_ [...]
+    
"g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV("person").Property("name", 
"marko").Property("age", 29).As("marko").AddV("person").Property("name", 
"vadas").Property("age", 27).As("vadas").AddV("software").Property("name", 
"lop").Property("lang", "java").As("lop").AddV("person").Property("name", 
"josh").Prop [...]
     "g_injectXstrX_asDate": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject("2023-08-02T00:00:00Z").AsDate()}}, 
     "g_injectX1694017707000X_asDate": {func(g *gremlingo.GraphTraversalSource, 
p map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Inject(1694017707000).AsDate()}}, 
     "g_injectX1694017708000LX_asDate": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.Inject(p["xx1"]).AsDate()}}, 
@@ -606,6 +610,8 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_E_sampleX1X_count": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.E().Sample(1).Count()}}, 
     "g_V_sampleX1X_byXageX_count": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Sample(1).By("age").Count()}}, 
     "g_V_order_byXnoX_count": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Order().By("no").Count()}}, 
+    "g_V_group_byXlabelX_count": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Group().By(gremlingo.T.Label).Count()}}, 
+    "g_V_group_byXlabelX_countXlocalX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Group().By(gremlingo.T.Label).Count(gremlingo.Scope.Local)}}, 
     "g_injectXdatetimeXstrXX_dateAddXDT_hour_2X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.Inject(time.UnixMilli(1690934400000)).DateAdd(gremlingo.DT.Hour, 2)}}, 
     "g_injectXdatetimeXstrXX_dateAddXhour_2X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.Inject(time.UnixMilli(1690934400000)).DateAdd(gremlingo.DT.Hour, 2)}}, 
     "g_injectXdatetimeXstrXX_dateAddXhour_1X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.Inject(time.UnixMilli(1690934400000)).DateAdd(gremlingo.DT.Hour, -1)}}, 
@@ -1378,6 +1384,7 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     
"g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.WithStrategies(gremlingo.ProductiveByStrategy(gremlingo.ProductiveByStrategyConfig{ProductiveKeys:
 
[]string{}})).V().Aggregate("x").By(gremlingo.T__.Values("age").Is(gremlingo.P.Gt(29))).Cap("x")}},
 
     "g_V_aggregateXxX_byXout_order_byXnameXX_capXxX": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Aggregate("x").By(gremlingo.T__.Out().Order().By("name")).Cap("x")}}, 
     
"g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX":
 {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.WithStrategies(gremlingo.ProductiveByStrategy(gremlingo.ProductiveByStrategyConfig{ProductiveKeys:
 
[]string{}})).V().Aggregate("x").By(gremlingo.T__.Out().Order().By("name")).Cap("x")}},
 
+    "g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Aggregate("a").Has("person", "age", 
gremlingo.P.Gte(30)).Cap("a").Unfold().Values("name")}}, 
     "g_V_fail": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Fail()}}, 
     "g_V_failXmsgX": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Fail("msg")}}, 
     "g_V_unionXout_failX": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Union(gremlingo.T__.Out(), gremlingo.T__.Fail())}}, 
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 7a96ea60be..7b013d6911 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
@@ -188,6 +188,8 @@ const gremlins = {
     g_V_both_dedup_age_name: [function({g}) { return 
g.V().both().dedup().by("age").values("name") }], 
     g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name: 
[function({g, vid1}) { return 
g.V(vid1).as("a").both().as("b").both().as("c").dedup("a","b").by("age").select("a","b","c").by("name")
 }], 
     g_VX1X_valuesXageX_dedupXlocalX_unfold: [function({g, vid1}) { return 
g.V(vid1).values("age").dedup(Scope.local).unfold() }], 
+    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_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() }], 
@@ -381,6 +383,7 @@ const gremlins = {
     
g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name:
 [function({g, vid3}) { return g.withStrategies(new 
ProductiveByStrategy({productiveKeys:[]})).V(vid3).as("a").in_().out().as("b").where("a",P.eq("b")).by("age").values("name")
 }], 
     
g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX: 
[function({g}) { return 
g.V().as("n").where(__.or(__.hasLabel("software"),__.hasLabel("person"))).select("n").by("name")
 }], 
     
g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX:
 [function({g}) { return 
g.V().as("n").where(__.or(__.select("n").hasLabel("software"),__.select("n").hasLabel("person"))).select("n").by("name")
 }], 
+    g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX: 
[function({g}) { return 
g.V().hasLabel("person").as("x").where(__.inE("knows").count().is(P.gte(1))).select("x")
 }], 
     g_V_coworker: [function({g, xx1}) { return 
g.V().hasLabel("person").filter(__.outE("created")).aggregate("p").as("p1").values("name").as("p1n").select("p").unfold().where(P.neq("p1")).as("p2").values("name").as("p2n").select("p2").out("created").choose(__.in_("created").where(P.eq("p1")),__.values("name"),__.constant(xx1)).group().by(__.select("p1n")).by(__.group().by(__.select("p2n")).by(__.unfold().fold().project("numCoCreated","coCreated").by(__.count(Scope.local)).by())).unfold()
 }], 
     g_V_coworker_with_midV: [function({g}) { return 
g.V().hasLabel("person").filter(__.outE("created")).as("p1").V().hasLabel("person").where(P.neq("p1")).filter(__.outE("created")).as("p2").map(__.out("created").where(__.in_("created").as("p1")).values("name").fold()).group().by(__.select("p1").by("name")).by(__.group().by(__.select("p2").by("name")).by(__.project("numCoCreated","coCreated").by(__.count(Scope.local)).by())).unfold()
 }], 
     g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name: [function({g}) 
{ return 
g.addV("person").property("_partition","a").property("name","alice").addV("person").property("_partition","b").property("name","bob")
 }, function({g}) { return g.withStrategies(new 
PartitionStrategy({includeMetaProperties:false,partitionKey:"_partition",readPartitions:["a"],writePartition:"a"})).V().values("name")
 }], 
@@ -515,6 +518,7 @@ const gremlins = {
     g_addVXpersonX_propertyXname_joshX_propertyXage_nullX: [function({g}) { 
return g.addV("person").property("name","josh").property("age",null) }, 
function({g}) { return g.V().has("person","age",null) }], 
     g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX: 
[function({g}) { return 
g.addV("person").property("name","marko").property("friendWeight",null,"acl",null)
 }, function({g}) { return 
g.V().has("person","name","marko").has("friendWeight",null) }, function({g}) { 
return 
g.V().has("person","name","marko").properties("friendWeight").has("acl",null) 
}, function({g}) { return 
g.V().has("person","name","marko").properties("friendWeight").count() }], 
     
g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX: 
[function({g}) { return 
g.addV("person").property("name","alice").property(Cardinality.single,"age",50) 
}, function({g}) { return 
g.V().has("person","name","alice").property("age",__.union(__.values("age"),__.constant(1)).sum())
 }, function({g}) { return g.V().has("person","age",50) }, function({g}) { 
return g.V().has("person","age",51) }], 
+    
g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX:
 [function({g}) { return 
g.addV("person").property("name","marko").property("age",29).as("marko").addV("person").property("name","vadas").property("age",27).as("vadas").addV("software").property("name","lop").property("lang","java").as("lop").addV("person").property("name","josh").property("age",32).as("josh").addV("software").property("name","ripple").property("lang","
 [...]
     g_injectXstrX_asDate: [function({g}) { return 
g.inject("2023-08-02T00:00:00Z").asDate() }], 
     g_injectX1694017707000X_asDate: [function({g}) { return 
g.inject(1694017707000).asDate() }], 
     g_injectX1694017708000LX_asDate: [function({g, xx1}) { return 
g.inject(xx1).asDate() }], 
@@ -626,6 +630,8 @@ const gremlins = {
     g_E_sampleX1X_count: [function({g}) { return g.E().sample(1).count() }], 
     g_V_sampleX1X_byXageX_count: [function({g}) { return 
g.V().sample(1).by("age").count() }], 
     g_V_order_byXnoX_count: [function({g}) { return 
g.V().order().by("no").count() }], 
+    g_V_group_byXlabelX_count: [function({g}) { return 
g.V().group().by(T.label).count() }], 
+    g_V_group_byXlabelX_countXlocalX: [function({g}) { return 
g.V().group().by(T.label).count(Scope.local) }], 
     g_injectXdatetimeXstrXX_dateAddXDT_hour_2X: [function({g}) { return 
g.inject(new Date(1690934400000)).dateAdd(DT.hour,2) }], 
     g_injectXdatetimeXstrXX_dateAddXhour_2X: [function({g}) { return 
g.inject(new Date(1690934400000)).dateAdd(DT.hour,2) }], 
     g_injectXdatetimeXstrXX_dateAddXhour_1X: [function({g}) { return 
g.inject(new Date(1690934400000)).dateAdd(DT.hour,-1) }], 
@@ -1398,6 +1404,7 @@ const gremlins = {
     
g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX:
 [function({g}) { return g.withStrategies(new 
ProductiveByStrategy({productiveKeys:[]})).V().aggregate("x").by(__.values("age").is(P.gt(29))).cap("x")
 }], 
     g_V_aggregateXxX_byXout_order_byXnameXX_capXxX: [function({g}) { return 
g.V().aggregate("x").by(__.out().order().by("name")).cap("x") }], 
     
g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX:
 [function({g}) { return g.withStrategies(new 
ProductiveByStrategy({productiveKeys:[]})).V().aggregate("x").by(__.out().order().by("name")).cap("x")
 }], 
+    g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX: 
[function({g}) { return 
g.V().aggregate("a").has("person","age",P.gte(30)).cap("a").unfold().values("name")
 }], 
     g_V_fail: [function({g}) { return g.V().fail() }], 
     g_V_failXmsgX: [function({g}) { return g.V().fail("msg") }], 
     g_V_unionXout_failX: [function({g}) { return 
g.V().union(__.out(),__.fail()) }], 
diff --git a/gremlin-python/src/main/python/radish/gremlin.py 
b/gremlin-python/src/main/python/radish/gremlin.py
index abf5963478..2d143fcc03 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -170,6 +170,8 @@ world.gremlins = {
     'g_V_both_dedup_age_name': [(lambda 
g:g.V().both().dedup().by('age').name)], 
     'g_VX1X_asXaX_both_asXbX_both_asXcX_dedupXa_bX_age_selectXa_b_cX_name': 
[(lambda g, 
vid1=None:g.V(vid1).as_('a').both().as_('b').both().as_('c').dedup('a','b').by('age').select('a','b','c').by('name'))],
 
     'g_VX1X_valuesXageX_dedupXlocalX_unfold': [(lambda g, 
vid1=None:g.V(vid1).age.dedup(Scope.local).unfold())], 
+    'g_V_properties_dedup_count': [(lambda 
g:g.addV('person').property('name','josh').addV('person').property('name','josh').addV('person').property('name','josh')),
 (lambda g:g.V().properties('name').dedup().count())], 
+    'g_V_properties_dedup_byXvalueX_count': [(lambda 
g:g.addV('person').property('name','josh').addV('person').property('name','josh').addV('person').property('name','josh')),
 (lambda g:g.V().properties('name').dedup().by(T.value).count())], 
     'g_V_drop': [(lambda 
g:g.addV().as_('a').addV().as_('b').addE('knows').to('a')), (lambda 
g:g.V().drop()), (lambda g:g.V()), (lambda g:g.E())], 
     'g_V_outE_drop': [(lambda 
g:g.addV().as_('a').addV().as_('b').addE('knows').to('a')), (lambda 
g:g.V().outE().drop()), (lambda g:g.V()), (lambda g:g.E())], 
     'g_V_properties_drop': [(lambda 
g:g.addV().property('name','bob').addV().property('name','alice')), (lambda 
g:g.V().properties().drop()), (lambda g:g.V()), (lambda g:g.V().properties())], 
@@ -363,6 +365,7 @@ world.gremlins = {
     
'g_withStrategiesXProductiveByStrategyX_VX3X_asXaX_in_out_asXbX_whereXa_eqXbXX_byXageX_name':
 [(lambda g, 
vid3=None:g.withStrategies(*[TraversalStrategy('ProductiveByStrategy',{'productiveKeys':[],'strategy':'org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy'},
 
'org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy')]).V(vid3).as_('a').in_().out().as_('b').where('a',P.eq('b')).by('age').name)],
 
     
'g_V_asXnX_whereXorXhasLabelXsoftwareX_hasLabelXpersonXXX_selectXnX_byXnameX': 
[(lambda 
g:g.V().as_('n').where(__.or_(__.hasLabel('software'),__.hasLabel('person'))).select('n').by('name'))],
 
     
'g_V_asXnX_whereXorXselectXnX_hasLabelXsoftwareX_selectXnX_hasLabelXpersonXXX_selectXnX_byXnameX':
 [(lambda 
g:g.V().as_('n').where(__.or_(__.select('n').hasLabel('software'),__.select('n').hasLabel('person'))).select('n').by('name'))],
 
+    'g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX': 
[(lambda 
g:g.V().hasLabel('person').as_('x').where(__.inE('knows').count().is_(P.gte(1))).select('x'))],
 
     'g_V_coworker': [(lambda g, 
xx1=None:g.V().hasLabel('person').filter_(__.outE('created')).aggregate('p').as_('p1').name.as_('p1n').select('p').unfold().where(P.neq('p1')).as_('p2').name.as_('p2n').select('p2').out('created').choose(__.in_('created').where(P.eq('p1')),__.name,__.constant(xx1)).group().by(__.select('p1n')).by(__.group().by(__.select('p2n')).by(__.unfold().fold().project('numCoCreated','coCreated').by(__.count(Scope.local)).by())).unfold())],
 
     'g_V_coworker_with_midV': [(lambda 
g:g.V().hasLabel('person').filter_(__.outE('created')).as_('p1').V().hasLabel('person').where(P.neq('p1')).filter_(__.outE('created')).as_('p2').map(__.out('created').where(__.in_('created').as_('p1')).name.fold()).group().by(__.select('p1').by('name')).by(__.group().by(__.select('p2').by('name')).by(__.project('numCoCreated','coCreated').by(__.count(Scope.local)).by())).unfold())],
 
     'g_withStrategiesXPartitionStrategyXwrite_a_read_aXX_V_name': [(lambda 
g:g.addV('person').property('_partition','a').property('name','alice').addV('person').property('_partition','b').property('name','bob')),
 (lambda 
g:g.withStrategies(*[TraversalStrategy('PartitionStrategy',{'includeMetaProperties':False,'partitionKey':'_partition','readPartitions':set(('a')),'strategy':'org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy','writePartition':'a'},
 'org [...]
@@ -497,6 +500,7 @@ world.gremlins = {
     'g_addVXpersonX_propertyXname_joshX_propertyXage_nullX': [(lambda 
g:g.addV('person').property('name','josh').property('age',None)), (lambda 
g:g.V().has('person','age',None))], 
     
'g_addVXpersonX_propertyXname_markoX_propertyXfriendWeight_null_acl_nullX': 
[(lambda 
g:g.addV('person').property('name','marko').property('friendWeight',None,'acl',None)),
 (lambda g:g.V().has('person','name','marko').has('friendWeight',None)), 
(lambda 
g:g.V().has('person','name','marko').properties('friendWeight').has('acl',None)),
 (lambda 
g:g.V().has('person','name','marko').properties('friendWeight').count())], 
     
'g_V_hasXperson_name_aliceX_propertyXsingle_age_unionXage_constantX1XX_sumX': 
[(lambda 
g:g.addV('person').property('name','alice').property(Cardinality.single,'age',50)),
 (lambda 
g:g.V().has('person','name','alice').property('age',__.union(__.age,__.constant(1)).sum_())),
 (lambda g:g.V().has('person','age',50)), (lambda 
g:g.V().has('person','age',51))], 
+    
'g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX':
 [(lambda 
g:g.addV('person').property('name','marko').property('age',29).as_('marko').addV('person').property('name','vadas').property('age',27).as_('vadas').addV('software').property('name','lop').property('lang','java').as_('lop').addV('person').property('name','josh').property('age',32).as_('josh').addV('software').property('name','ripple').property('lang','java').
 [...]
     'g_injectXstrX_asDate': [(lambda 
g:g.inject('2023-08-02T00:00:00Z').as_date())], 
     'g_injectX1694017707000X_asDate': [(lambda 
g:g.inject(long(1694017707000)).as_date())], 
     'g_injectX1694017708000LX_asDate': [(lambda g, 
xx1=None:g.inject(xx1).as_date())], 
@@ -608,6 +612,8 @@ world.gremlins = {
     'g_E_sampleX1X_count': [(lambda g:g.E().sample(1).count())], 
     'g_V_sampleX1X_byXageX_count': [(lambda 
g:g.V().sample(1).by('age').count())], 
     'g_V_order_byXnoX_count': [(lambda g:g.V().order().by('no').count())], 
+    'g_V_group_byXlabelX_count': [(lambda 
g:g.V().group().by(T.label).count())], 
+    'g_V_group_byXlabelX_countXlocalX': [(lambda 
g:g.V().group().by(T.label).count(Scope.local))], 
     'g_injectXdatetimeXstrXX_dateAddXDT_hour_2X': [(lambda 
g:g.inject(datetime.datetime.utcfromtimestamp(1690934400000 / 
1000.0)).date_add(DT.hour,2))], 
     'g_injectXdatetimeXstrXX_dateAddXhour_2X': [(lambda 
g:g.inject(datetime.datetime.utcfromtimestamp(1690934400000 / 
1000.0)).date_add(DT.hour,2))], 
     'g_injectXdatetimeXstrXX_dateAddXhour_1X': [(lambda 
g:g.inject(datetime.datetime.utcfromtimestamp(1690934400000 / 
1000.0)).date_add(DT.hour,-1))], 
@@ -1380,6 +1386,7 @@ world.gremlins = {
     
'g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXvaluesXageX_isXgtX29XXX_capXxX':
 [(lambda 
g:g.withStrategies(*[TraversalStrategy('ProductiveByStrategy',{'productiveKeys':[],'strategy':'org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy'},
 
'org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy')]).V().aggregate('x').by(__.age.is_(P.gt(29))).cap('x'))],
 
     'g_V_aggregateXxX_byXout_order_byXnameXX_capXxX': [(lambda 
g:g.V().aggregate('x').by(__.out().order().by('name')).cap('x'))], 
     
'g_withStrategiesXProductiveByStrategyX_V_aggregateXxX_byXout_order_byXnameXX_capXxX':
 [(lambda 
g:g.withStrategies(*[TraversalStrategy('ProductiveByStrategy',{'productiveKeys':[],'strategy':'org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy'},
 
'org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy')]).V().aggregate('x').by(__.out().order().by('name')).cap('x'))],
 
+    'g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX': 
[(lambda 
g:g.V().aggregate('a').has('person','age',P.gte(30)).cap('a').unfold().name)], 
     'g_V_fail': [(lambda g:g.V().fail())], 
     'g_V_failXmsgX': [(lambda g:g.V().fail('msg'))], 
     'g_V_unionXout_failX': [(lambda g:g.V().union(__.out(),__.fail()))], 
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Dedup.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Dedup.feature
index 4b2774d27c..e236aac196 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Dedup.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Dedup.feature
@@ -405,3 +405,37 @@ Feature: Step - dedup()
       Then the result should be unordered
         | result |
         | d[29].i |
+
+  Scenario: g_V_properties_dedup_count
+    Given the empty graph
+    And the graph initializer of
+      """
+      g.addV('person').property('name','josh').
+        addV('person').property('name','josh').
+        addV('person').property('name','josh')
+      """
+    And the traversal of
+      """
+      g.V().properties("name").dedup().count()
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[3].l |
+
+  Scenario: g_V_properties_dedup_byXvalueX_count
+    Given the empty graph
+    And the graph initializer of
+      """
+      g.addV('person').property('name','josh').
+        addV('person').property('name','josh').
+        addV('person').property('name','josh')
+      """
+    And the traversal of
+      """
+      g.V().properties("name").dedup().by(value).count()
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | d[1].l |
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Where.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Where.feature
index 7b4f50be7d..160951b4bd 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Where.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Where.feature
@@ -396,4 +396,16 @@ Feature: Step - where()
       | josh |
       | peter |
       | lop |
-      | ripple |
\ No newline at end of file
+      | ripple |
+
+  Scenario: 
g_V_hasLabelXpersonX_asXxX_whereXinEXknowsX_count_isXgteX1XXX_selectXxX
+    Given the modern graph
+    And the traversal of
+      """
+      
g.V().hasLabel("person").as("x").where(__.inE("knows").count().is(P.gte(1))).select("x")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | v[vadas] |
+      | v[josh] |
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
index 76c954fd80..6b124e2cf6 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/AddVertex.feature
@@ -565,4 +565,31 @@ Feature: Step - addV()
     When iterated to list
     Then the result should have a count of 1
     And the graph should return 0 for count of 
"g.V().has(\"person\",\"age\",50)"
-    And the graph should return 1 for count of 
"g.V().has(\"person\",\"age\",51)"
\ No newline at end of file
+    And the graph should return 1 for count of 
"g.V().has(\"person\",\"age\",51)"
+
+  Scenario: 
g_V_limitX3X_addVXsoftwareX_aggregateXa1X_byXlabelX_aggregateXa2X_byXlabelX_capXa1_a2X_selectXa_bX_byXunfoldX_foldX
+    Given the empty graph
+    And the graph initializer of
+      """
+      g.addV("person").property("name", "marko").property("age", 
29).as("marko").
+        addV("person").property("name", "vadas").property("age", 
27).as("vadas").
+        addV("software").property("name", "lop").property("lang", 
"java").as("lop").
+        addV("person").property("name","josh").property("age", 32).as("josh").
+        addV("software").property("name", "ripple").property("lang", 
"java").as("ripple").
+        addV("person").property("name", "peter").property("age", 
35).as('peter').
+        addE("knows").from("marko").to("vadas").property("weight", 0.5d).
+        addE("knows").from("marko").to("josh").property("weight", 1.0d).
+        addE("created").from("marko").to("lop").property("weight", 0.4d).
+        addE("created").from("josh").to("ripple").property("weight", 1.0d).
+        addE("created").from("josh").to("lop").property("weight", 0.4d).
+        addE("created").from("peter").to("lop").property("weight", 0.2d)
+      """
+    And the traversal of
+      """
+      
g.V().limit(3).addV("software").aggregate("a1").by(T.label).aggregate("a2").by(T.label).cap("a1",
 "a2").
+        select("a1","a2").by(unfold().fold())
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | m[{"a1": ["software", "software", "software"], "a2": ["software", 
"software", "software"]}] |
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/Count.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/Count.feature
index 0deedd1916..e2a55de64e 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/Count.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/map/Count.feature
@@ -168,4 +168,26 @@ Feature: Step - count()
     When iterated to list
     Then the result should be ordered
       | result |
-      | d[0].l |
\ No newline at end of file
+      | d[0].l |
+
+  Scenario: g_V_group_byXlabelX_count
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().group().by(label).count()
+      """
+    When iterated to list
+    Then the result should be ordered
+      | result |
+      | d[1].l |
+
+  Scenario: g_V_group_byXlabelX_countXlocalX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().group().by(label).count(local)
+      """
+    When iterated to list
+    Then the result should be ordered
+      | result |
+      | d[2].l |
\ No newline at end of file
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/sideEffect/Aggregate.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/sideEffect/Aggregate.feature
index 5f8287bc9e..994e3cbd8f 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/sideEffect/Aggregate.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/sideEffect/Aggregate.feature
@@ -269,4 +269,20 @@ Feature: Step - aggregate()
       | v[lop] |
       | null |
       | null |
-      | null |
\ No newline at end of file
+      | null |
+
+  Scenario: 
g_V_aggregateXaX_hasXperson_age_gteX30XXX_capXaX_unfold_valuesXnameX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().aggregate("a").has("person","age", 
P.gte(30)).cap("a").unfold().values("name")
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | marko |
+      | josh |
+      | peter |
+      | lop |
+      | vadas |
+      | ripple |
\ No newline at end of file


Reply via email to