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;
