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

andreac pushed a commit to branch 3.8-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


The following commit(s) were added to refs/heads/3.8-dev by this push:
     new 49456ebe48 Prevent inject in repeat (#3253)
49456ebe48 is described below

commit 49456ebe484f694141f25ba0cf560e5ec4da6d75
Author: andreachild <[email protected]>
AuthorDate: Mon Oct 27 21:02:15 2025 -0700

    Prevent inject in repeat (#3253)
    
    Modified StandardVerificationStrategy to throw error if inject() is used 
inside repeat() as the injections would be exhausted after the first iteration 
now that the RepeatUnrollStrategy no longer auto-unrolls such traversals. It is 
possible to use union() as an alternative step if the old behaviour is desired 
although there are limited use cases for inject() in repeat(). If it is 
determined there is a need to have injections per iteration it is possible to 
implement a proper solution  [...]
---
 CHANGELOG.asciidoc                                 |  2 +-
 docs/src/upgrade/release-3.8.x.asciidoc            | 83 ++++++++++++++--------
 .../jsr223/GephiRemoteAcceptorIntegrateTest.java   |  2 +-
 .../traversal/step/filter/RangeGlobalStep.java     | 15 +---
 .../verification/StandardVerificationStrategy.java |  5 ++
 .../process/traversal/util/TraversalHelper.java    | 14 ++++
 .../StandardVerificationStrategyTest.java          |  5 ++
 .../traversal/util/TraversalHelperTest.java        | 50 +++++++++++++
 .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 10 +--
 gremlin-go/driver/cucumber/gremlin.go              | 10 +--
 .../gremlin-javascript/test/cucumber/gremlin.js    | 10 +--
 gremlin-python/src/main/python/radish/gremlin.py   | 10 +--
 .../gremlin/test/features/branch/Repeat.feature    | 36 ++++++++--
 13 files changed, 189 insertions(+), 63 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index fdfb4cb6ba..c3e2a98ec4 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -81,7 +81,7 @@ This release also includes changes from <<release-3-7-XXX, 
3.7.XXX>>.
 * Updated `ElementIdStrategy.getConfiguration()` to help with serialization.
 * Fixed issue in `gremlin-go` where `Next()` didn't return the error from the 
server.
 * Changed type for `ReservedKeysVerificationStrategy.keys` in .NET to take a 
`Set<string>` rather than `List<string>`.
-* Changed `StandardVerificationStrategy` to prevent the use of 
`SupplyingBarriers` inside `repeat()`.
+* Changed `StandardVerificationStrategy` to prevent the use of 
`SupplyingBarriers` and `inject()` inside `repeat()`.
 * Fixed bug in `group()` value traversal of the second `by()` where a 
`CollectingBarrierStep` could produce an unexpected filtering effect when 
`ReducingBarrierStep` or `SupplyingBarrierStep` instances were not taken into 
account.
 * Changed `DetachedFactory` to special case the handling of 
`ComputerAdjacentVertex` which doesn't carry properties but still needs to be 
detachable for OLAP cases.
 * Deprecated `ProfilingAware.prepareForProfiling` method preferring to simply 
`resetBarrierFromValueTraversal` from the `Grouping` interface after strategy 
application.
diff --git a/docs/src/upgrade/release-3.8.x.asciidoc 
b/docs/src/upgrade/release-3.8.x.asciidoc
index e5e321522e..2b325162d9 100644
--- a/docs/src/upgrade/release-3.8.x.asciidoc
+++ b/docs/src/upgrade/release-3.8.x.asciidoc
@@ -192,7 +192,7 @@ version, the `none()` step was used to "throw away" all 
traversers that passed i
 renamed to `discard()`. The `discard()` step with its verb tone arguably makes 
for a better name for that feature, but
 it also helped make room for `none()` to be repurposed as `none(P)` which is a 
complement to `any(P)` and `all(P) steps.
 
-==== Prevented using cap() inside repeat()
+==== Prevented using cap(), inject() inside repeat()
 
 `cap()` inside `repeat()` is now disallowed by the 
`StandardVerificationStrategy`. Using `cap()` inside `repeat()` would
 have led to unexpected results since `cap()` isn't "repeat-aware". Because 
`cap()` is a `SupplyingBarrier` that reduces
@@ -200,6 +200,58 @@ the number of traversers to one, its use inside `repeat()` 
is limited.
 
 See: link:https://issues.apache.org/jira/browse/TINKERPOP-3195[TINKERPOP-3195]
 
+`inject()` inside `repeat()` is now also disallowed by the 
`StandardVerificationStrategy`. The usefulness of `inject()` 
+inside `repeat()` is questionable as the injections are exhausted after one 
iteration. Consider the following examples, 
+noting that the examples for version 3.7.4 demonstrate the effect of 
`RepeatUnrollStrategy` on `inject()` semantics, 
+which is problematic as strategies should not affect results. 3.8.0 examples 
do not disable the `RepeatUnrollStrategy` 
+as the strategy was modified to be more restrictive in this version.
+
+[source,text]
+----
+// 3.7.4 results in data injected for each repeat loop
+gremlin> g.inject('x').repeat(inject('a')).times(5)
+==>a
+==>a
+==>a
+==>a
+==>a
+==>x
+
+// 3.7.4 without RepeatUnrollStrategy injections occur only once
+gremlin> 
g.withoutStrategies(RepeatUnrollStrategy).inject('x').repeat(inject('a')).times(5)
+==>a
+==>x
+
+// 3.8.0 inject() inside repeat() now produces an error
+gremlin> g.inject('x').repeat(inject('a')).times(5)
+The parent of inject()-step can not be repeat()-step: 
InjectStep(java.util.ArrayList$Itr@543da15)
+----
+
+Before upgrading, users should look for usages of `inject()` inside `repeat()` 
and if it is determined that per-loop 
+injections are desired, it is possible to use `union()` and `constant()` 
instead.
+
+[source,text]
+----
+// 3.8.0 can use union() and constant() inside repeat() instead of inject()
+gremlin> 
g.inject('x').repeat(union(constant('a').limit(1),identity())).times(5)
+==>a
+==>a
+==>a
+==>a
+==>a
+==>x
+
+// can also use union() and constant() inside repeat() with multiple values
+gremlin> 
g.inject('x').repeat(union(constant(['a','b']).limit(1).unfold(),identity())).times(3)
+==>a
+==>b
+==>a
+==>a
+==>b
+==>b
+==>x
+----
+
 ==== Simplified Comparability Semantics
 
 The previous system of ternary boolean semantics has been replaced with 
simplified binary semantics. The triggers for
@@ -1190,36 +1242,11 @@ Repeat traversals containing other steps will no longer 
be unrolled. There may b
 traversals that previously benefited from automatic unrolling but the 
consistency of semantics outweighs the performance 
 impact.
 
-===== Examples of Affected Traversals =====
-
-Usage of `inject()` inside `repeat()` is an example of a traversal that will 
no longer be unrolled. The following results
-returned from the `modern` graph demonstrate the change of semantics if the 
`inject()` in `repeat()` were to be unrolled:
-
-[source,text]
-----
-gremlin> g.V().values('name').inject('foo').inject('foo')
-==>foo
-==>foo
-==>marko
-==>vadas
-==>lop
-==>josh
-==>ripple
-==>peter
-gremlin> 
g.withoutStrategies(RepeatUnrollStrategy).V().values('name').repeat(inject('foo')).times(2)
-==>foo
-==>marko
-==>vadas
-==>lop
-==>josh
-==>ripple
-==>peter
-----
-
-Other examples of affected traversals include (but are not limited to):
+Examples of affected traversals include (but are not limited to):
 
 [source,groovy]
 ----
+g.V().repeat(both().aggregate('x')).times(2).limit(10)
 g.V().repeat(out().limit(10)).times(3)
 g.V().repeat(in().order().by("name")).times(2)
 g.V().repeat(both().simplePath()).times(4)
diff --git 
a/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/jsr223/GephiRemoteAcceptorIntegrateTest.java
 
b/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/jsr223/GephiRemoteAcceptorIntegrateTest.java
index 7781d8721e..8bf0aa5514 100644
--- 
a/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/jsr223/GephiRemoteAcceptorIntegrateTest.java
+++ 
b/gremlin-console/src/test/java/org/apache/tinkerpop/gremlin/console/jsr223/GephiRemoteAcceptorIntegrateTest.java
@@ -149,7 +149,7 @@ public class GephiRemoteAcceptorIntegrateTest {
 
         // call iterate() as groovysh isn't rigged to auto-iterate
         acceptor.submit(Arrays.asList(
-                
"vg.V(1).repeat(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.__().out()).times(2).iterate()"));
+                
"vg.V(1).repeat(org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.start().out()).times(2).iterate()"));
 
         wireMockRule.verify(13, 
postRequestedFor(urlPathEqualTo("/workspace1")));
     }
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
index 08f34879c1..1e4d024c01 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStep.java
@@ -31,10 +31,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
 import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 
 /**
@@ -184,7 +184,7 @@ public final class RangeGlobalStep<S> extends FilterStep<S> 
implements RangeGlob
      */
     private boolean isInsideLoop() {
         if (this.insideLoop == null) {
-            this.insideLoop = hasRepeatStepParent();
+            this.insideLoop = 
TraversalHelper.hasRepeatStepParent(this.getTraversal());
         }
         return this.insideLoop;
     }
@@ -215,17 +215,6 @@ public final class RangeGlobalStep<S> extends 
FilterStep<S> implements RangeGlob
         return String.join(":", counterKeyParts);
     }
 
-    private boolean hasRepeatStepParent() {
-        Traversal.Admin<?, ?> traversal = this.getTraversal();
-        while (!traversal.isRoot()) {
-            if (traversal.getParent() instanceof RepeatStep) {
-                return true;
-            }
-            traversal = traversal.getParent().asStep().getTraversal();
-        }
-        return false;
-    }
-
     ////////////////
 
     public static final class RangeBiOperator<S> implements 
BinaryOperator<TraverserSet<S>>, Serializable {
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
index 2c698c7063..c6430ccf7e 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategy.java
@@ -25,6 +25,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
 import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DiscardStep;
+import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.InjectStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.ProfileSideEffectStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.SideEffectCapStep;
 import 
org.apache.tinkerpop.gremlin.process.traversal.step.util.ReducingBarrierStep;
@@ -62,6 +63,10 @@ public final class StandardVerificationStrategy extends 
AbstractTraversalStrateg
                 if (Graph.Hidden.isHidden(label))
                     step.removeLabel(label);
             }
+            
+            if (step instanceof InjectStep && 
TraversalHelper.hasRepeatStepParent(step.getTraversal()))
+                throw new VerificationException("The parent of inject()-step 
can not be repeat()-step: " + step, traversal);
+
             if ((step instanceof ReducingBarrierStep || step instanceof 
SupplyingBarrierStep) &&
                     step.getTraversal().getParent() instanceof RepeatStep &&
                     
step.getTraversal().getParent().getGlobalChildren().get(0).getSteps().contains(step))
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
index c3cc3db5f6..c1beb58bcc 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java
@@ -1129,4 +1129,18 @@ public final class TraversalHelper {
         return scopingInfos;
     }
 
+    /**
+     * @param traversal the {@link Traversal.Admin} to check for a {@link 
RepeatStep} parent
+     * @return true if a {@link RepeatStep} is a direct or indirect parent of 
the given {@link Traversal.Admin}, false otherwise
+     */
+    public static boolean hasRepeatStepParent(Traversal.Admin<?, ?> traversal) 
{
+        while (!traversal.isRoot()) {
+            if (traversal.getParent() instanceof RepeatStep) {
+                return true;
+            }
+            traversal = traversal.getParent().asStep().getTraversal();
+        }
+        return false;
+    }
+
 }
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java
index a794cca224..2f8f92a738 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/StandardVerificationStrategyTest.java
@@ -34,6 +34,8 @@ import org.junit.runners.Parameterized;
 import java.util.Arrays;
 
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.cap;
+import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.constant;
+import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inject;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.repeat;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.sum;
@@ -60,6 +62,9 @@ public class StandardVerificationStrategyTest {
                 {repeat(sum()).times(2), false},
                 {repeat(out().count()), false},
                 {repeat(cap("x")), false},
+                {repeat(inject("a")), false},
+                {repeat(out().values("age").inject(10)).times(2), false},
+                {repeat(out().choose(constant(true), inject(1), 
inject(2))).times(5), false},
                 {__.V().profile(), true},
                 {__.V().profile("metrics").cap("metrics"), true}
         });
diff --git 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelperTest.java
 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelperTest.java
index bacf17622e..bf102c2d54 100644
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelperTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelperTest.java
@@ -24,6 +24,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.Pop;
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
 import org.apache.tinkerpop.gremlin.process.traversal.step.PopContaining;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
@@ -50,6 +51,7 @@ import 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect.IdentitySt
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.structure.PropertyType;
 import org.apache.tinkerpop.gremlin.structure.T;
+import org.apache.tinkerpop.gremlin.structure.Vertex;
 import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
 import org.junit.Test;
 import org.mockito.Mockito;
@@ -60,13 +62,18 @@ import java.util.Optional;
 import java.util.Set;
 import java.util.stream.Collectors;
 
+import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.choose;
+import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.constant;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.in;
+import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.limit;
+import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.loops;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE;
 import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.path;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.repeat;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.select;
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.tail;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.union;
 import static 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.valueMap;
 import static org.hamcrest.CoreMatchers.is;
@@ -647,4 +654,47 @@ public class TraversalHelperTest {
     public void hasOnlyShouldReturnFalseForEmptyAllowedClasses() {
         
assertThat(TraversalHelper.hasOnlyStepsOfAssignableClassesRecursively(Set.of(), 
__.V().out().asAdmin()), is(false));
     }
+    
+    @Test
+    public void shouldReturnTrueForParentRepeatStep() {
+        GraphTraversal.Admin<Vertex, Vertex> child = out().asAdmin();
+        __.V().repeat(child).times(2).asAdmin();
+        assertThat(TraversalHelper.hasRepeatStepParent(child), is(true));
+    }
+
+    @Test
+    public void shouldReturnTrueForGrandparentRepeatStep() {
+        GraphTraversal<Vertex, Vertex> grandchild1 = limit(1);
+        GraphTraversal<Vertex, Vertex> grandchild2 = tail();
+        GraphTraversal<Object, Vertex> child = choose(constant(true), 
grandchild1, grandchild2);
+        __.V().repeat(child).until(__.V().has("name", "peter"));
+        assertThat(TraversalHelper.hasRepeatStepParent(grandchild1.asAdmin()), 
is(true));
+        assertThat(TraversalHelper.hasRepeatStepParent(grandchild2.asAdmin()), 
is(true));
+    }
+
+    @Test
+    public void shouldReturnTrueForNestedRepeatStep() {
+        GraphTraversal<Vertex, Vertex> nestedChild = in();
+        GraphTraversal<Vertex, Vertex> child = out();
+        GraphTraversal<Vertex, Vertex> repeatChild = 
child.repeat(nestedChild).times(3);
+        __.V().repeat(repeatChild).until(loops().is(2));
+        assertThat(TraversalHelper.hasRepeatStepParent(nestedChild.asAdmin()), 
is(true));
+        assertThat(TraversalHelper.hasRepeatStepParent(child.asAdmin()), 
is(true));
+        assertThat(TraversalHelper.hasRepeatStepParent(repeatChild.asAdmin()), 
is(true));
+    }
+
+    @Test
+    public void shouldReturnFalseForNonRepeatStepParent() {
+        GraphTraversal<Vertex, Vertex> child = out();
+        __.V().union(child).repeat(in()).times(1);
+        assertThat(TraversalHelper.hasRepeatStepParent(child.asAdmin()), 
is(false));
+    }
+
+    @Test
+    public void shouldReturnFalseForRootTraversal() {
+        GraphTraversal<Object, Vertex> root = __.V();
+        GraphTraversal<Object, Vertex> repeat = root.repeat(in());
+        assertThat(TraversalHelper.hasRepeatStepParent(root.asAdmin()), 
is(false));
+        assertThat(TraversalHelper.hasRepeatStepParent(repeat.asAdmin()), 
is(false));
+    }
 }
diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs 
b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
index 05174930af..e1f2a0c263 100644
--- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
+++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs
@@ -154,10 +154,10 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_V_emit", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Emit()}}, 
                {"g_V_untilXidentityX", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.V().Until(__.Identity())}}, 
                {"g_V_timesX5X", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) =>g.V().Times(5)}}, 
-               
{"g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Repeat(__.Out("created")).Times(1).Values<object>("name")}}, 
-               
{"g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Repeat(__.Out("created")).Times(0).Values<object>("name")}}, 
-               
{"g_V_haxXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Times(1).Repeat(__.Out("created")).Values<object>("name")}}, 
-               
{"g_V_haxXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Times(0).Repeat(__.Out("created")).Values<object>("name")}}, 
+               
{"g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Repeat(__.Out("created")).Times(1).Values<object>("name")}}, 
+               
{"g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Repeat(__.Out("created")).Times(0).Values<object>("name")}}, 
+               
{"g_V_hasXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Times(1).Repeat(__.Out("created")).Values<object>("name")}}, 
+               
{"g_V_hasXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("person", "name", 
"marko").Times(0).Repeat(__.Out("created")).Values<object>("name")}}, 
                {"g_V_repeatXboth_hasXnot_productiveXX_timesX3X_constantX1X", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Repeat(__.Both().Has("not", 
"productive")).Times(3).Constant<object>(1)}}, 
                {"g_V_hasXnot_productiveX_repeatXbothX_timesX3X_constantX1X", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Has("not", 
"productive").Repeat(__.Both()).Times(3).Constant<object>(1)}}, 
                {"g_VX1_2_3X_repeatXboth_barrierX_emit_timesX2X_path", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V(p["vid1"], p["vid2"], 
p["vid3"]).Repeat(__.Both().Barrier()).Emit().Times(2).Path()}}, 
@@ -171,6 +171,8 @@ namespace Gremlin.Net.IntegrationTest.Gherkin
                {"g_V_repeatXaggregateXxXX_timesX2X_selectXxX_limitX1X_unfold", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Repeat(__.Aggregate("x")).Times(2).Select<object>("x").Limit<object>(1).Unfold<object>()}},
 
                {"g_V_valuesXstrX_repeatXsplitXabcX_conjoinX_timesX2X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.AddV().Property("str", "ababcczababcc").AddV().Property("str", 
"abcyabc"), (g,p) 
=>g.V().Values<object>("str").Repeat(__.Split("abc").Conjoin((string) 
"")).Times(2)}}, 
                
{"g_withSackX0X_V_repeatXsackXsumX_byXageX_whereXsack_isXltX59XXXX_timesX2X", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.WithSack(0l).V().Repeat(__.Sack(Operator.Sum).By("age").Where(__.Sack<object>().Is(P.Lt(59)))).Times(2)}},
 
+               {"g_V_repeatXinjectXyXX_timesX2X", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.V().Repeat(__.Inject("y")).Times(2)}}, 
+               {"g_V_repeatXunionXconstantXyX_limitX1X_identityXX_timesX3X", 
new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) 
=>g.V().Repeat(__.Union<object>(__.Constant<object>("y").Limit<object>(1), 
__.Identity())).Times(2)}}, 
                {"g_unionXX", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) =>g.Union<object>()}}, 
                {"g_unionXV_name", new List<Func<GraphTraversalSource, 
IDictionary<string, object>, ITraversal>> {(g,p) 
=>g.Union<object>(__.V().Values<object>("name"))}}, 
                {"g_unionXVXv1X_VX4XX_name", new 
List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> 
{(g,p) =>g.Union<object>(__.V(p["vid1"]), 
__.V(p["vid4"])).Values<object>("name")}}, 
diff --git a/gremlin-go/driver/cucumber/gremlin.go 
b/gremlin-go/driver/cucumber/gremlin.go
index 47668c7fa7..834875ff88 100644
--- a/gremlin-go/driver/cucumber/gremlin.go
+++ b/gremlin-go/driver/cucumber/gremlin.go
@@ -124,10 +124,10 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_V_emit": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Emit()}}, 
     "g_V_untilXidentityX": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Until(gremlingo.T__.Identity())}}, 
     "g_V_timesX5X": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Times(5)}}, 
-    "g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Repeat(gremlingo.T__.Out("created")).Times(1).Values("name")}}, 
-    "g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Repeat(gremlingo.T__.Out("created")).Times(0).Values("name")}}, 
-    "g_V_haxXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Times(1).Repeat(gremlingo.T__.Out("created")).Values("name")}}, 
-    "g_V_haxXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Times(0).Repeat(gremlingo.T__.Out("created")).Values("name")}}, 
+    "g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Repeat(gremlingo.T__.Out("created")).Times(1).Values("name")}}, 
+    "g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Repeat(gremlingo.T__.Out("created")).Times(0).Values("name")}}, 
+    "g_V_hasXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Times(1).Repeat(gremlingo.T__.Out("created")).Values("name")}}, 
+    "g_V_hasXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("person", "name", 
"marko").Times(0).Repeat(gremlingo.T__.Out("created")).Values("name")}}, 
     "g_V_repeatXboth_hasXnot_productiveXX_timesX3X_constantX1X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Repeat(gremlingo.T__.Both().Has("not", 
"productive")).Times(3).Constant(1)}}, 
     "g_V_hasXnot_productiveX_repeatXbothX_timesX3X_constantX1X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V().Has("not", 
"productive").Repeat(gremlingo.T__.Both()).Times(3).Constant(1)}}, 
     "g_VX1_2_3X_repeatXboth_barrierX_emit_timesX2X_path": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.V(p["vid1"], p["vid2"], 
p["vid3"]).Repeat(gremlingo.T__.Both().Barrier()).Emit().Times(2).Path()}}, 
@@ -141,6 +141,8 @@ var translationMap = map[string][]func(g 
*gremlingo.GraphTraversalSource, p map[
     "g_V_repeatXaggregateXxXX_timesX2X_selectXxX_limitX1X_unfold": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Repeat(gremlingo.T__.Aggregate("x")).Times(2).Select("x").Limit(1).Unfold()}},
 
     "g_V_valuesXstrX_repeatXsplitXabcX_conjoinX_timesX2X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return g.AddV().Property("str", 
"ababcczababcc").AddV().Property("str", "abcyabc")}, func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Values("str").Repeat(gremlingo.T__.Split("abc").Conjoin("")).Times(2)}}, 
     
"g_withSackX0X_V_repeatXsackXsumX_byXageX_whereXsack_isXltX59XXXX_timesX2X": 
{func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.WithSack(int64(0)).V().Repeat(gremlingo.T__.Sack(gremlingo.Operator.Sum).By("age").Where(gremlingo.T__.Sack().Is(gremlingo.P.Lt(59)))).Times(2)}},
 
+    "g_V_repeatXinjectXyXX_timesX2X": {func(g *gremlingo.GraphTraversalSource, 
p map[string]interface{}) *gremlingo.GraphTraversal {return 
g.V().Repeat(gremlingo.T__.Inject("y")).Times(2)}}, 
+    "g_V_repeatXunionXconstantXyX_limitX1X_identityXX_timesX3X": {func(g 
*gremlingo.GraphTraversalSource, p map[string]interface{}) 
*gremlingo.GraphTraversal {return 
g.V().Repeat(gremlingo.T__.Union(gremlingo.T__.Constant("y").Limit(1), 
gremlingo.T__.Identity())).Times(2)}}, 
     "g_unionXX": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return g.Union()}}, 
     "g_unionXV_name": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Union(gremlingo.T__.V().Values("name"))}}, 
     "g_unionXVXv1X_VX4XX_name": {func(g *gremlingo.GraphTraversalSource, p 
map[string]interface{}) *gremlingo.GraphTraversal {return 
g.Union(gremlingo.T__.V(p["vid1"]), 
gremlingo.T__.V(p["vid4"])).Values("name")}}, 
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 f76429d77b..bc9f6ace25 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
@@ -155,10 +155,10 @@ const gremlins = {
     g_V_emit: [function({g}) { return g.V().emit() }], 
     g_V_untilXidentityX: [function({g}) { return g.V().until(__.identity()) 
}], 
     g_V_timesX5X: [function({g}) { return g.V().times(5) }], 
-    g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").repeat(__.out("created")).times(1).values("name") }], 
-    g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").repeat(__.out("created")).times(0).values("name") }], 
-    g_V_haxXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").times(1).repeat(__.out("created")).values("name") }], 
-    g_V_haxXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").times(0).repeat(__.out("created")).values("name") }], 
+    g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").repeat(__.out("created")).times(1).values("name") }], 
+    g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").repeat(__.out("created")).times(0).values("name") }], 
+    g_V_hasXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").times(1).repeat(__.out("created")).values("name") }], 
+    g_V_hasXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name: 
[function({g}) { return g.V().has("person", "name", 
"marko").times(0).repeat(__.out("created")).values("name") }], 
     g_V_repeatXboth_hasXnot_productiveXX_timesX3X_constantX1X: [function({g}) 
{ return g.V().repeat(__.both().has("not", "productive")).times(3).constant(1) 
}], 
     g_V_hasXnot_productiveX_repeatXbothX_timesX3X_constantX1X: [function({g}) 
{ return g.V().has("not", "productive").repeat(__.both()).times(3).constant(1) 
}], 
     g_VX1_2_3X_repeatXboth_barrierX_emit_timesX2X_path: [function({g, vid3, 
vid2, vid1}) { return g.V(vid1, vid2, 
vid3).repeat(__.both().barrier()).emit().times(2).path() }], 
@@ -172,6 +172,8 @@ const gremlins = {
     g_V_repeatXaggregateXxXX_timesX2X_selectXxX_limitX1X_unfold: 
[function({g}) { return 
g.V().repeat(__.aggregate("x")).times(2).select("x").limit(1).unfold() }], 
     g_V_valuesXstrX_repeatXsplitXabcX_conjoinX_timesX2X: [function({g}) { 
return g.addV().property("str", "ababcczababcc").addV().property("str", 
"abcyabc") }, function({g}) { return 
g.V().values("str").repeat(__.split("abc").conjoin("")).times(2) }], 
     g_withSackX0X_V_repeatXsackXsumX_byXageX_whereXsack_isXltX59XXXX_timesX2X: 
[function({g}) { return 
g.withSack(0).V().repeat(__.sack(Operator.sum).by("age").where(__.sack().is(P.lt(59)))).times(2)
 }], 
+    g_V_repeatXinjectXyXX_timesX2X: [function({g}) { return 
g.V().repeat(__.inject("y")).times(2) }], 
+    g_V_repeatXunionXconstantXyX_limitX1X_identityXX_timesX3X: [function({g}) 
{ return g.V().repeat(__.union(__.constant("y").limit(1), 
__.identity())).times(2) }], 
     g_unionXX: [function({g}) { return g.union() }], 
     g_unionXV_name: [function({g}) { return g.union(__.V().values("name")) }], 
     g_unionXVXv1X_VX4XX_name: [function({g, vid4, vid1}) { return 
g.union(__.V(vid1), __.V(vid4)).values("name") }], 
diff --git a/gremlin-python/src/main/python/radish/gremlin.py 
b/gremlin-python/src/main/python/radish/gremlin.py
index 403114e6b9..7d76bbc133 100644
--- a/gremlin-python/src/main/python/radish/gremlin.py
+++ b/gremlin-python/src/main/python/radish/gremlin.py
@@ -127,10 +127,10 @@ world.gremlins = {
     'g_V_emit': [(lambda g:g.V().emit())], 
     'g_V_untilXidentityX': [(lambda g:g.V().until(__.identity()))], 
     'g_V_timesX5X': [(lambda g:g.V().times(5))], 
-    'g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').repeat(__.out('created')).times(1).values('name'))], 
-    'g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').repeat(__.out('created')).times(0).values('name'))], 
-    'g_V_haxXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').times(1).repeat(__.out('created')).values('name'))], 
-    'g_V_haxXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').times(0).repeat(__.out('created')).values('name'))], 
+    'g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').repeat(__.out('created')).times(1).values('name'))], 
+    'g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').repeat(__.out('created')).times(0).values('name'))], 
+    'g_V_hasXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').times(1).repeat(__.out('created')).values('name'))], 
+    'g_V_hasXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name': [(lambda 
g:g.V().has('person', 'name', 
'marko').times(0).repeat(__.out('created')).values('name'))], 
     'g_V_repeatXboth_hasXnot_productiveXX_timesX3X_constantX1X': [(lambda 
g:g.V().repeat(__.both().has('not', 'productive')).times(3).constant(1))], 
     'g_V_hasXnot_productiveX_repeatXbothX_timesX3X_constantX1X': [(lambda 
g:g.V().has('not', 'productive').repeat(__.both()).times(3).constant(1))], 
     'g_VX1_2_3X_repeatXboth_barrierX_emit_timesX2X_path': [(lambda g, 
vid3=None,vid2=None,vid1=None:g.V(vid1, vid2, 
vid3).repeat(__.both().barrier()).emit().times(2).path())], 
@@ -144,6 +144,8 @@ world.gremlins = {
     'g_V_repeatXaggregateXxXX_timesX2X_selectXxX_limitX1X_unfold': [(lambda 
g:g.V().repeat(__.aggregate('x')).times(2).select('x').limit(1).unfold())], 
     'g_V_valuesXstrX_repeatXsplitXabcX_conjoinX_timesX2X': [(lambda 
g:g.add_v().property('str', 'ababcczababcc').add_v().property('str', 
'abcyabc')), (lambda 
g:g.V().values('str').repeat(__.split('abc').conjoin('')).times(2))], 
     
'g_withSackX0X_V_repeatXsackXsumX_byXageX_whereXsack_isXltX59XXXX_timesX2X': 
[(lambda 
g:g.with_sack(long(0)).V().repeat(__.sack(Operator.sum_).by('age').where(__.sack().is_(P.lt(59)))).times(2))],
 
+    'g_V_repeatXinjectXyXX_timesX2X': [(lambda 
g:g.V().repeat(__.inject('y')).times(2))], 
+    'g_V_repeatXunionXconstantXyX_limitX1X_identityXX_timesX3X': [(lambda 
g:g.V().repeat(__.union(__.constant('y').limit(1), __.identity())).times(2))], 
     'g_unionXX': [(lambda g:g.union())], 
     'g_unionXV_name': [(lambda g:g.union(__.V().values('name')))], 
     'g_unionXVXv1X_VX4XX_name': [(lambda g, 
vid4=None,vid1=None:g.union(__.V(vid1), __.V(vid4)).values('name'))], 
diff --git 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
index ef3b7f15af..fab0d3e3d7 100644
--- 
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
+++ 
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/branch/Repeat.feature
@@ -387,7 +387,7 @@ Feature: Step - repeat()
     When iterated to list
     Then the traversal will raise an error with message containing text of 
"The repeat()-traversal was not defined"
 
-  Scenario: g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name
+  Scenario: g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX1X_name
     Given the modern graph
     And the traversal of
       """
@@ -398,7 +398,7 @@ Feature: Step - repeat()
       | result |
       | lop |
 
-  Scenario: g_V_haxXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name
+  Scenario: g_V_hasXperson_name_markoX_repeatXoutXcreatedXX_timesX0X_name
     Given the modern graph
     And the traversal of
       """
@@ -409,7 +409,7 @@ Feature: Step - repeat()
       | result |
       | lop |
 
-  Scenario: g_V_haxXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name
+  Scenario: g_V_hasXperson_name_markoX_timesX1X_repeatXoutXcreatedXX_name
     Given the modern graph
     And the traversal of
       """
@@ -420,7 +420,7 @@ Feature: Step - repeat()
       | result |
       | lop |
 
-  Scenario: g_V_haxXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name
+  Scenario: g_V_hasXperson_name_markoX_timesX0X_repeatXoutXcreatedXX_name
     Given the modern graph
     And the traversal of
       """
@@ -684,3 +684,31 @@ Feature: Step - repeat()
       | result |
       | v[marko] |
       | v[vadas] |
+
+  @GraphComputerVerificationInjectionNotSupported
+  Scenario: g_V_repeatXinjectXyXX_timesX2X
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().repeat(inject('y')).times(2)
+      """
+    When iterated to list
+    Then the traversal will raise an error with message containing text of 
"The parent of inject()-step can not be repeat()-step"
+    
+  Scenario: g_V_repeatXunionXconstantXyX_limitX1X_identityXX_timesX3X
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().repeat(union(constant('y').limit(1),identity())).times(2)
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | y |
+      | y |
+      | v[marko] |
+      | v[vadas] |
+      | v[lop] |
+      | v[josh] |
+      | v[ripple] |
+      | v[peter] |
\ No newline at end of file


Reply via email to