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

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

commit e513d9f8106b15a4782bac27592ddf4efcf928d6
Author: Cole-Greer <[email protected]>
AuthorDate: Wed Oct 22 16:25:35 2025 -0700

    Introduce SideEffectBarrierStep, which is a variant of SideEffectStep which 
is also a LocalBarrier.
    
    Update GroupCountSideEffectStep, GroupSideEffectStep, TreeSideEffectStep, 
and SubgraphStep to use
    this new base class.
---
 .../step/sideEffect/GroupCountSideEffectStep.java  |  5 +-
 .../step/sideEffect/GroupSideEffectStep.java       |  2 +-
 .../step/sideEffect/SideEffectBarrierStep.java     | 96 ++++++++++++++++++++++
 .../traversal/step/sideEffect/SubgraphStep.java    |  2 +-
 .../step/sideEffect/TreeSideEffectStep.java        |  2 +-
 5 files changed, 103 insertions(+), 4 deletions(-)

diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
index 186153647d..662ca50046 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupCountSideEffectStep.java
@@ -21,10 +21,12 @@ package 
org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
 import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
 import org.apache.tinkerpop.gremlin.process.traversal.step.ByModulating;
+import org.apache.tinkerpop.gremlin.process.traversal.step.LocalBarrier;
 import org.apache.tinkerpop.gremlin.process.traversal.step.SideEffectCapable;
 import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
 import org.apache.tinkerpop.gremlin.process.traversal.step.map.GroupCountStep;
 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.TraversalUtil;
 import org.apache.tinkerpop.gremlin.structure.util.StringFactory;
 import org.apache.tinkerpop.gremlin.util.function.HashMapSupplier;
@@ -33,12 +35,13 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.NoSuchElementException;
 import java.util.Set;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public class GroupCountSideEffectStep<S, E> extends SideEffectStep<S> 
implements SideEffectCapable<Map<E, Long>, Map<E, Long>>, TraversalParent, 
ByModulating {
+public class GroupCountSideEffectStep<S, E> extends SideEffectBarrierStep<S> 
implements SideEffectCapable<Map<E, Long>, Map<E, Long>>, TraversalParent, 
ByModulating {
 
     private Traversal.Admin<S, E> keyTraversal = null;
     private String sideEffectKey;
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
index 7fe9626495..3afb36dd28 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroupSideEffectStep.java
@@ -47,7 +47,7 @@ import java.util.Set;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class GroupSideEffectStep<S, K, V> extends SideEffectStep<S>
+public final class GroupSideEffectStep<S, K, V> extends 
SideEffectBarrierStep<S>
         implements SideEffectCapable<Map<K, ?>, Map<K, V>>, TraversalParent, 
ByModulating, Grouping<S, K, V> {
 
     private char state = 'k';
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectBarrierStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectBarrierStep.java
new file mode 100644
index 0000000000..4a74994e2a
--- /dev/null
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SideEffectBarrierStep.java
@@ -0,0 +1,96 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.process.traversal.step.sideEffect;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
+import org.apache.tinkerpop.gremlin.process.traversal.step.LocalBarrier;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep;
+import 
org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet;
+import 
org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException;
+
+import java.util.NoSuchElementException;
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public abstract class SideEffectBarrierStep<S> extends AbstractStep<S, S> 
implements LocalBarrier<S> {
+    protected TraverserSet<S> barrier;
+
+    public SideEffectBarrierStep(final Traversal.Admin traversal) {
+        super(traversal);
+        this.barrier = (TraverserSet<S>) 
this.traversal.getTraverserSetSupplier().get();
+    }
+
+    protected abstract void sideEffect(final Traverser.Admin<S> traverser);
+
+    @Override
+    protected Traverser.Admin<S> processNextStart() {
+        if (this.barrier.isEmpty()) {
+            this.processAllStarts();
+        }
+        return this.barrier.remove();
+    }
+
+    @Override
+    public void processAllStarts() {
+        while (this.starts.hasNext()) {
+            final Traverser.Admin<S> traverser = this.starts.next();
+            sideEffect(traverser);
+
+            traverser.setStepId(this.getNextStep().getId());
+            // when barrier is reloaded, the traversers should be at the next 
step
+            this.barrier.add(traverser);
+        }
+
+    }
+
+    @Override
+    public boolean hasNextBarrier() {
+        if (this.barrier.isEmpty()) {
+            this.processAllStarts();
+        }
+        return !this.barrier.isEmpty();
+    }
+
+    @Override
+    public TraverserSet<S> nextBarrier() throws NoSuchElementException {
+        if (this.barrier.isEmpty()) {
+            this.processAllStarts();
+        }
+        if (this.barrier.isEmpty())
+            throw FastNoSuchElementException.instance();
+        else {
+            final TraverserSet<S> temp = this.barrier;
+            this.barrier = (TraverserSet<S>) 
this.traversal.getTraverserSetSupplier().get();
+            return temp;
+        }
+    }
+
+    @Override
+    public void addBarrier(TraverserSet<S> barrier) {
+        this.barrier.addAll(barrier);
+    }
+
+    @Override
+    public void reset() {
+        super.reset();
+        this.barrier.clear();
+    }
+}
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
index 0bd81970ef..3d10239bd9 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/SubgraphStep.java
@@ -45,7 +45,7 @@ import java.util.Set;
  * @author Stephen Mallette (http://stephen.genoprime.com)
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class SubgraphStep extends SideEffectStep<Edge> implements 
SideEffectCapable {
+public final class SubgraphStep extends SideEffectBarrierStep<Edge> implements 
SideEffectCapable {
 
     private static final Set<TraverserRequirement> REQUIREMENTS = EnumSet.of(
             TraverserRequirement.OBJECT,
diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
index 1f34bf210f..2a89268920 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/TreeSideEffectStep.java
@@ -41,7 +41,7 @@ import java.util.function.Supplier;
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
-public final class TreeSideEffectStep<S> extends SideEffectStep<S> implements 
SideEffectCapable<Tree, Tree>, TraversalParent, ByModulating, PathProcessor {
+public final class TreeSideEffectStep<S> extends SideEffectBarrierStep<S> 
implements SideEffectCapable<Tree, Tree>, TraversalParent, ByModulating, 
PathProcessor {
 
     private TraversalRing<Object, Object> traversalRing;
     private String sideEffectKey;

Reply via email to