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 |

Reply via email to