You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by co...@apache.org on 2025/09/17 23:47:36 UTC

(tinkerpop) branch repeatSemanticsPoC created (now b4db1b3771)

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

colegreer pushed a change to branch repeatSemanticsPoC
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


      at b4db1b3771 PoC attempting to make repeat() act as a global parent not a local parent

This branch includes the following new commits:

     new b4db1b3771 PoC attempting to make repeat() act as a global parent not a local parent

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(tinkerpop) 01/01: PoC attempting to make repeat() act as a global parent not a local parent

Posted by co...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit b4db1b3771dd71e529135069f7f14de39947e7af
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Wed Sep 17 16:47:22 2025 -0700

    PoC attempting to make repeat() act as a global parent not a local parent
---
 .../process/traversal/step/branch/RepeatStep.java  | 42 +++++++++++++++-------
 .../gremlin/test/features/integrated/Paths.feature |  4 +--
 .../TinkerGraphParameterizedFeatureTest.java       |  2 +-
 3 files changed, 33 insertions(+), 15 deletions(-)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
index 17b8a2ef4e..e56b2c06b2 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/RepeatStep.java
@@ -21,9 +21,12 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.branch;
 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.Barrier;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.util.ComputerAwareStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
+import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper;
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
@@ -46,6 +49,7 @@ public final class RepeatStep<S> extends ComputerAwareStep<S, S> implements Trav
     private String loopName = null;
     public boolean untilFirst = false;
     public boolean emitFirst = false;
+    private boolean first = true;
 
     public RepeatStep(final Traversal.Admin traversal) {
         super(traversal);
@@ -206,25 +210,39 @@ public final class RepeatStep<S> extends ComputerAwareStep<S, S> implements Trav
             throw new IllegalStateException("The repeat()-traversal was not defined: " + this);
 
         while (true) {
-            if (this.repeatTraversal.getEndStep().hasNext()) {
+            if (!first && this.repeatTraversal.getEndStep().hasNext()) {
                 return this.repeatTraversal.getEndStep();
             } else {
-                final Traverser.Admin<S> start = this.starts.next();
-                start.initialiseLoops(this.getId(), this.loopName);
-                if (doUntil(start, true)) {
-                    start.resetLoops();
-                    return IteratorUtils.of(start);
-                }
-                this.repeatTraversal.addStart(start);
-                if (doEmit(start, true)) {
-                    final Traverser.Admin<S> emitSplit = start.split();
-                    emitSplit.resetLoops();
-                    return IteratorUtils.of(emitSplit);
+                this.first = false;
+                if (!TraversalHelper.getStepsOfAssignableClassRecursively(Barrier.class, repeatTraversal).isEmpty()) {
+                    if (!this.starts.hasNext())
+                        throw FastNoSuchElementException.instance();
+                    while (this.starts.hasNext()) {
+                        initStart(this.starts.next());
+                    }
+                } else {
+                    Iterator<Traverser.Admin<S>> iter = initStart(this.starts.next());
+                    return iter == null ? Collections.emptyIterator() : iter;
                 }
             }
         }
     }
 
+    private Iterator<Traverser.Admin<S>> initStart(final Traverser.Admin<S> start) {
+        start.initialiseLoops(this.getId(), this.loopName);
+        if (doUntil(start, true)) {
+            start.resetLoops();
+            return IteratorUtils.of(start);
+        }
+        this.repeatTraversal.addStart(start);
+        if (doEmit(start, true)) {
+            final Traverser.Admin<S> emitSplit = start.split();
+            emitSplit.resetLoops();
+            return IteratorUtils.of(emitSplit);
+        }
+        return null;
+    }
+
     @Override
     protected Iterator<Traverser.Admin<S>> computerAlgorithm() throws NoSuchElementException {
         if (null == this.repeatTraversal)
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/Paths.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/Paths.feature
index 172754f81a..ad3a4a74ce 100644
--- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/Paths.feature
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/integrated/Paths.feature
@@ -18,7 +18,7 @@
 @StepClassIntegrated
 Feature: Step - paths
 
-  @GraphComputerVerificationReferenceOnly @InsertionOrderingRequired
+  @GraphComputerVerificationReferenceOnly @InsertionOrderingRequired @PoCIgnore
   Scenario: g_V_shortestpath
     Given the modern graph
     And the traversal of
@@ -82,7 +82,7 @@ Feature: Step - paths
       | l[lop,josh]|
       | l[marko,lop,peter]|
 
-  @GraphComputerVerificationStarGraphExceeded @WithSeedStrategy @InsertionOrderingRequired
+  @GraphComputerVerificationStarGraphExceeded @WithSeedStrategy @InsertionOrderingRequired @PoCIgnore
   Scenario: g_V_playlist_paths
     Given the grateful graph
     And the traversal of
diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphParameterizedFeatureTest.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphParameterizedFeatureTest.java
index 88b6e4f246..198ecfe957 100644
--- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphParameterizedFeatureTest.java
+++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphParameterizedFeatureTest.java
@@ -30,7 +30,7 @@ import org.junit.runner.RunWith;
 
 @RunWith(Cucumber.class)
 @CucumberOptions(
-        tags = "not @GraphComputerOnly and not @AllowNullPropertyValues",
+        tags = "not @GraphComputerOnly and not @AllowNullPropertyValues and not @PoCIgnore",
         glue = { "org.apache.tinkerpop.gremlin.features" },
         objectFactory = TinkerGraphParameterizedFeatureTest.TinkerGraphGuiceFactory.class,
         features = { "classpath:/org/apache/tinkerpop/gremlin/test/features" },