This is an automated email from the ASF dual-hosted git repository. kenhuuu pushed a commit to branch TINKERPOP-3201 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 9c3fc926f68ca148f2c52be54c8846b833a6cc12 Author: Ken Hu <[email protected]> AuthorDate: Tue Oct 14 15:32:13 2025 -0700 fix tail interfering with itself accross iterations Co-authored-by: Cole-Greer <[email protected]> --- CHANGELOG.asciidoc | 1 + .../traversal/step/filter/TailGlobalStep.java | 7 +- .../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/Tail.feature | 108 ++++++++++++++++++++- 7 files changed, 142 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index e457b44e41..bf0c11fb2f 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -35,6 +35,7 @@ This release also includes changes from <<release-3-7-XXX, 3.7.XXX>>. * Added `DateTime` ontop of the existing 'datetime' grammar. * Added `UUID()` and `UUID(value)` to grammar. * Deprecated the `UnifiedChannelizer`. +* Fixed bug that caused incorrect results when `tail()` used inside `repeat()`. * Modified `TraversalStrategy` construction in Javascript where configurations are now supplied as a `Map` of options. * Fixed bug in GraphSON v2 and v3 where full round trip of `TraversalStrategy` implementations was failing. * Added missing strategies to the `TraversalStrategies` global cache as well as `CoreImports` in `gremlin-groovy`. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java index 420e3f02d4..a6585763c6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStep.java @@ -40,6 +40,7 @@ public final class TailGlobalStep<S> extends AbstractStep<S, S> implements TailG private Deque<Traverser.Admin<S>> tail; private long tailBulk = 0L; private boolean bypass = false; + private boolean consuming = true; public TailGlobalStep(final Traversal.Admin traversal, final long limit) { super(traversal); @@ -58,9 +59,13 @@ public final class TailGlobalStep<S> extends AbstractStep<S, S> implements TailG // If we are bypassing this step, let everything through. return this.starts.next(); } else { + if (this.tail.isEmpty()) { + consuming = true; + } // Pull everything available before we start delivering from the tail buffer. - if (this.starts.hasNext()) { + if (consuming && this.starts.hasNext()) { this.starts.forEachRemaining(this::addTail); + consuming = false; } // Pull the oldest traverser from the tail buffer. final Traverser.Admin<S> oldest = this.tail.pop(); diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index 698b6ca21c..11d71e0e92 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@ -463,6 +463,13 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_injectX1_2_3X_tailXlocal_1X_unfold", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new List<object> { 1, 2, 3 }).Tail<object>(Scope.Local, 1).Unfold<object>()}}, {"g_injectX1_2_3_4_5_6X_tailXlocal_1X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new List<object> { 1, 2, 3 }, new List<object> { 4, 5, 6 }).Tail<object>(Scope.Local, 1)}}, {"g_injectX1_2_3_4_5X_tailXlocal_2X", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(new List<object> { 1, 2, 3, 4, 5 }).Tail<object>(Scope.Local, 2)}}, + {"g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX1X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid3"]).Repeat(__.Out().Order().By("performances").Tail<object>(2)).Times(1).Values<object>("name")}}, + {"g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX2X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid3"]).Repeat(__.Out().Order().By("performances").Tail<object>(2)).Times(2).Values<object>("name")}}, + {"g_VX2X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX1X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid2"]).Repeat(__.Out().Local<object>(__.Order().By("performances").Tail<object>(1))).Times(1).Values<object>("name")}}, + {"g_VX250X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX2X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid250"]).Repeat(__.Out().Local<object>(__.Order().By("performances").Tail<object>(1))).Times(2).Values<object>("name")}}, + {"g_VX3X_repeatXout_order_byXperformancesX_tailX3X_limitX1XX_timesX2X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid3"]).Repeat(__.Out().Order().By("performances").Tail<object>(3).Limit<object>(1)).Times(2).Values<object>("name")}}, + {"g_VX3X_repeatXout_order_byXperformancesX_limitX5X_tailX1XX_timesX2X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid3"]).Repeat(__.Out().Order().By("performances").Limit<object>(5).Tail<object>(1)).Times(2).Values<object>("name")}}, + {"g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V(p["vid3"]).Repeat(__.OutE().Order().By("weight").Tail<object>(2).InV()).Times(2).Values<object>("name")}}, {"g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("age").As("a").Out().In().Has("age").As("b").Select<object>("a", "b").Where("a", P.Eq("b"))}}, {"g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("age").As("a").Out().In().Has("age").As("b").Select<object>("a", "b").Where("a", P.Neq("b"))}}, {"g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Has("age").As("a").Out().In().Has("age").As("b").Select<object>("a", "b").Where(__.As("b").Has("name", "marko"))}}, diff --git a/gremlin-go/driver/cucumber/gremlin.go b/gremlin-go/driver/cucumber/gremlin.go index acaeb5389d..1baa33deab 100644 --- a/gremlin-go/driver/cucumber/gremlin.go +++ b/gremlin-go/driver/cucumber/gremlin.go @@ -433,6 +433,13 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[ "g_injectX1_2_3X_tailXlocal_1X_unfold": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject([]interface{}{1, 2, 3}).Tail(gremlingo.Scope.Local, 1).Unfold()}}, "g_injectX1_2_3_4_5_6X_tailXlocal_1X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject([]interface{}{1, 2, 3}, []interface{}{4, 5, 6}).Tail(gremlingo.Scope.Local, 1)}}, "g_injectX1_2_3_4_5X_tailXlocal_2X": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject([]interface{}{1, 2, 3, 4, 5}).Tail(gremlingo.Scope.Local, 2)}}, + "g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX1X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid3"]).Repeat(gremlingo.T__.Out().Order().By("performances").Tail(2)).Times(1).Values("name")}}, + "g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX2X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid3"]).Repeat(gremlingo.T__.Out().Order().By("performances").Tail(2)).Times(2).Values("name")}}, + "g_VX2X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX1X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid2"]).Repeat(gremlingo.T__.Out().Local(gremlingo.T__.Order().By("performances").Tail(1))).Times(1).Values("name")}}, + "g_VX250X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX2X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid250"]).Repeat(gremlingo.T__.Out().Local(gremlingo.T__.Order().By("performances").Tail(1))).Times(2).Values("name")}}, + "g_VX3X_repeatXout_order_byXperformancesX_tailX3X_limitX1XX_timesX2X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid3"]).Repeat(gremlingo.T__.Out().Order().By("performances").Tail(3).Limit(1)).Times(2).Values("name")}}, + "g_VX3X_repeatXout_order_byXperformancesX_limitX5X_tailX1XX_timesX2X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid3"]).Repeat(gremlingo.T__.Out().Order().By("performances").Limit(5).Tail(1)).Times(2).Values("name")}}, + "g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V(p["vid3"]).Repeat(gremlingo.T__.OutE().Order().By("weight").Tail(2).InV()).Times(2).Values("name")}}, "g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("age").As("a").Out().In().Has("age").As("b").Select("a", "b").Where("a", gremlingo.P.Eq("b"))}}, "g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("age").As("a").Out().In().Has("age").As("b").Select("a", "b").Where("a", gremlingo.P.Neq("b"))}}, "g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Has("age").As("a").Out().In().Has("age").As("b").Select("a", "b").Where(gremlingo.T__.As("b").Has("name", "marko"))}}, 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 3da1ae986d..ae4c3d09a2 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 @@ -464,6 +464,13 @@ const gremlins = { g_injectX1_2_3X_tailXlocal_1X_unfold: [function({g}) { return g.inject([1, 2, 3]).tail(Scope.local, 1).unfold() }], g_injectX1_2_3_4_5_6X_tailXlocal_1X: [function({g}) { return g.inject([1, 2, 3], [4, 5, 6]).tail(Scope.local, 1) }], g_injectX1_2_3_4_5X_tailXlocal_2X: [function({g}) { return g.inject([1, 2, 3, 4, 5]).tail(Scope.local, 2) }], + g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX1X_valuesXnameX: [function({g, vid3}) { return g.V(vid3).repeat(__.out().order().by("performances").tail(2)).times(1).values("name") }], + g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX2X_valuesXnameX: [function({g, vid3}) { return g.V(vid3).repeat(__.out().order().by("performances").tail(2)).times(2).values("name") }], + g_VX2X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX1X_valuesXnameX: [function({g, vid2}) { return g.V(vid2).repeat(__.out().local(__.order().by("performances").tail(1))).times(1).values("name") }], + g_VX250X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX2X_valuesXnameX: [function({g, vid250}) { return g.V(vid250).repeat(__.out().local(__.order().by("performances").tail(1))).times(2).values("name") }], + g_VX3X_repeatXout_order_byXperformancesX_tailX3X_limitX1XX_timesX2X_valuesXnameX: [function({g, vid3}) { return g.V(vid3).repeat(__.out().order().by("performances").tail(3).limit(1)).times(2).values("name") }], + g_VX3X_repeatXout_order_byXperformancesX_limitX5X_tailX1XX_timesX2X_valuesXnameX: [function({g, vid3}) { return g.V(vid3).repeat(__.out().order().by("performances").limit(5).tail(1)).times(2).values("name") }], + g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX: [function({g, vid3}) { return g.V(vid3).repeat(__.outE().order().by("weight").tail(2).inV()).times(2).values("name") }], g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX: [function({g}) { return g.V().has("age").as("a").out().in_().has("age").as("b").select("a", "b").where("a", P.eq("b")) }], g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX: [function({g}) { return g.V().has("age").as("a").out().in_().has("age").as("b").select("a", "b").where("a", P.neq("b")) }], g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX: [function({g}) { return g.V().has("age").as("a").out().in_().has("age").as("b").select("a", "b").where(__.as("b").has("name", "marko")) }], diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py index 9c6be0d1a7..a31dd26d42 100644 --- a/gremlin-python/src/main/python/radish/gremlin.py +++ b/gremlin-python/src/main/python/radish/gremlin.py @@ -436,6 +436,13 @@ world.gremlins = { 'g_injectX1_2_3X_tailXlocal_1X_unfold': [(lambda g:g.inject([1, 2, 3]).tail(Scope.local, 1).unfold())], 'g_injectX1_2_3_4_5_6X_tailXlocal_1X': [(lambda g:g.inject([1, 2, 3], [4, 5, 6]).tail(Scope.local, 1))], 'g_injectX1_2_3_4_5X_tailXlocal_2X': [(lambda g:g.inject([1, 2, 3, 4, 5]).tail(Scope.local, 2))], + 'g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX1X_valuesXnameX': [(lambda g, vid3=None:g.V(vid3).repeat(__.out().order().by('performances').tail(2)).times(1).values('name'))], + 'g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX2X_valuesXnameX': [(lambda g, vid3=None:g.V(vid3).repeat(__.out().order().by('performances').tail(2)).times(2).values('name'))], + 'g_VX2X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX1X_valuesXnameX': [(lambda g, vid2=None:g.V(vid2).repeat(__.out().local(__.order().by('performances').tail(1))).times(1).values('name'))], + 'g_VX250X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX2X_valuesXnameX': [(lambda g, vid250=None:g.V(vid250).repeat(__.out().local(__.order().by('performances').tail(1))).times(2).values('name'))], + 'g_VX3X_repeatXout_order_byXperformancesX_tailX3X_limitX1XX_timesX2X_valuesXnameX': [(lambda g, vid3=None:g.V(vid3).repeat(__.out().order().by('performances').tail(3).limit(1)).times(2).values('name'))], + 'g_VX3X_repeatXout_order_byXperformancesX_limitX5X_tailX1XX_timesX2X_valuesXnameX': [(lambda g, vid3=None:g.V(vid3).repeat(__.out().order().by('performances').limit(5).tail(1)).times(2).values('name'))], + 'g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX': [(lambda g, vid3=None:g.V(vid3).repeat(__.out_e().order().by('weight').tail(2).in_v()).times(2).values('name'))], 'g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_eqXbXX': [(lambda g:g.V().has('age').as_('a').out().in_().has('age').as_('b').select('a', 'b').where('a', P.eq('b')))], 'g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXa_neqXbXX': [(lambda g:g.V().has('age').as_('a').out().in_().has('age').as_('b').select('a', 'b').where('a', P.neq('b')))], 'g_V_hasXageX_asXaX_out_in_hasXageX_asXbX_selectXa_bX_whereXb_hasXname_markoXX': [(lambda g:g.V().has('age').as_('a').out().in_().has('age').as_('b').select('a', 'b').where(__.as_('b').has('name', 'marko')))], diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Tail.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Tail.feature index b62fd93736..ab3de159af 100644 --- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Tail.feature +++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/Tail.feature @@ -286,4 +286,110 @@ Feature: Step - tail() When iterated to list Then the result should be unordered | result | - | l[d[4].i,d[5].i] | \ No newline at end of file + | l[d[4].i,d[5].i] | + + # Test tail works in repeat with a single loop + Scenario: g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX1X_valuesXnameX + Given the grateful graph + And using the parameter vid3 defined as "v[NOT FADE AWAY].id" + And the traversal of + """ + g.V(vid3).repeat(__.out().order().by("performances").tail(2)).times(1).values("name") + """ + When iterated to list + Then the result should be unordered + | result | + | ME AND MY UNCLE | + | DRUMS | + + # Test tail runs per iteration in repeat with multiple iterations + @GraphComputerVerificationOrderingNotSupported + Scenario: g_VX3X_repeatXout_order_byXperformancesX_tailX2XX_timesX2X_valuesXnameX + Given the grateful graph + And using the parameter vid3 defined as "v[NOT FADE AWAY].id" + And the traversal of + """ + g.V(vid3).repeat(__.out().order().by("performances").tail(2)).times(2).values("name") + """ + When iterated to list + Then the result should be unordered + | result | + | THE OTHER ONE | + | SUGAR MAGNOLIA | + + # Test object-local tail works in repeat with a single loop + Scenario: g_VX2X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX1X_valuesXnameX + Given the grateful graph + And using the parameter vid2 defined as "v[IM A MAN].id" + And the traversal of + """ + g.V(vid2).repeat(__.out().local(order().by("performances").tail(1))).times(1).values("name") + """ + When iterated to list + Then the result should be unordered + | result | + | JAM | + | JACK STRAW | + + # Test object-local tail runs per iteration in repeat with multiple iterations + Scenario: g_VX250X_repeatXout_localXorder_byXperformancesX_tailX1XXX_timesX2X_valuesXnameX + Given the grateful graph + And using the parameter vid250 defined as "v[SIMPLE TWIST OF FATE].id" + And the traversal of + """ + g.V(vid250).repeat(__.out().local(__.order().by("performances").tail(1))).times(2).values("name") + """ + When iterated to list + Then the result should be unordered + | result | + | STUCK INSIDE OF MOBILE | + | STUCK INSIDE OF MOBILE | + | WICKED MESSENGER | + | TANGLED UP IN BLUE | + | SHELTER FROM THE STORM | + | RAINY DAY WOMAN | + | CUMBERLAND BLUES | + | WHEN PUSH COMES TO SHOVE | + | JOHN BROWN | + | SIMPLE TWIST OF FATE | + | BABY BLUE | + + # Test tail inside repeat can be followed by other range-based steps + Scenario: g_VX3X_repeatXout_order_byXperformancesX_tailX3X_limitX1XX_timesX2X_valuesXnameX + Given the grateful graph + And using the parameter vid3 defined as "v[NOT FADE AWAY].id" + And the traversal of + """ + g.V(vid3).repeat(__.out().order().by("performances").tail(3).limit(1)).times(2).values("name") + """ + When iterated to list + Then the result should be unordered + | result | + | THE OTHER ONE | + + # Test tail inside repeat can be preceded by other range-based steps + Scenario: g_VX3X_repeatXout_order_byXperformancesX_limitX5X_tailX1XX_timesX2X_valuesXnameX + Given the grateful graph + And using the parameter vid3 defined as "v[NOT FADE AWAY].id" + And the traversal of + """ + g.V(vid3).repeat(__.out().order().by("performances").limit(5).tail(1)).times(2).values("name") + """ + When iterated to list + Then the result should be unordered + | result | + | LET THE GOOD TIMES ROLL | + + # Test order on edge weight with tail in repeat leads to ordered walk + Scenario: g_VX3X_repeatXoutE_order_byXweightX_tailX2X_inVX_timesX2X_valuesXnameX + Given the grateful graph + And using the parameter vid3 defined as "v[NOT FADE AWAY].id" + And the traversal of + """ + g.V(vid3).repeat(outE().order().by("weight").tail(2).inV()).times(2).values("name") + """ + When iterated to list + Then the result should be unordered + | result | + | SUGAR MAGNOLIA | + | AROUND AND AROUND |
