This is an automated email from the ASF dual-hosted git repository. colegreer 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 e8b011f308 CTR Fix overrides of clone() in GValue, GValueManager, GValueConstantTraversal, and StepPlaceholder classes e8b011f308 is described below commit e8b011f30881cd4b85072dfe4a2eb04da4a90764 Author: Cole-Greer <cole.gr...@improving.com> AuthorDate: Tue Sep 23 10:12:13 2025 -0700 CTR Fix overrides of clone() in GValue, GValueManager, GValueConstantTraversal, and StepPlaceholder classes --- .../gremlin/process/traversal/GValueManager.java | 3 +- .../traversal/lambda/AbstractLambdaTraversal.java | 1 + .../traversal/lambda/GValueConstantTraversal.java | 10 ++----- .../gremlin/process/traversal/step/GValue.java | 4 +-- .../traversal/step/filter/RangeGlobalStep.java | 2 -- .../step/filter/RangeGlobalStepPlaceholder.java | 8 ++---- .../step/filter/RangeLocalStepPlaceholder.java | 8 ++---- .../step/filter/TailGlobalStepPlaceholder.java | 2 ++ .../step/filter/TailLocalStepPlaceholder.java | 1 + .../map/AbstractAddElementStepPlaceholder.java | 6 +--- .../map/AbstractMergeElementStepPlaceholder.java | 6 +--- .../traversal/step/map/CallStepPlaceholder.java | 1 + .../traversal/step/map/GraphStepPlaceholder.java | 12 +++++++- .../traversal/step/map/VertexStepPlaceholder.java | 13 ++++++++- .../sideEffect/AddPropertyStepPlaceholder.java | 32 ++++++++++++++++++++-- 15 files changed, 69 insertions(+), 40 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java index 6ef7c1db71..381f690fa6 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GValueManager.java @@ -141,10 +141,9 @@ public final class GValueManager implements Serializable, Cloneable { * Creates a deep copy of this GValueManager with cloned GValue instances. * * @return a new GValueManager instance with cloned state - * @throws CloneNotSupportedException if cloning fails */ @Override - public GValueManager clone() throws CloneNotSupportedException { + public GValueManager clone() { final Map<String, GValue<?>> clonedRegistry = new HashMap<>(); for (final Map.Entry<String, GValue<?>> entry : gValueRegistry.entrySet()) { // clone each gValue diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java index 5003006634..247daac73d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/AbstractLambdaTraversal.java @@ -145,6 +145,7 @@ public abstract class AbstractLambdaTraversal<S, E> implements Traversal.Admin<S public Traversal.Admin<S, E> clone() { try { final AbstractLambdaTraversal<S, E> clone = (AbstractLambdaTraversal<S, E>) super.clone(); + clone.gValueManager = this.gValueManager.clone(); if (null != this.bypassTraversal) clone.bypassTraversal = this.bypassTraversal.clone(); return clone; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java index 414c842658..f1c9f827cf 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/lambda/GValueConstantTraversal.java @@ -60,13 +60,9 @@ public final class GValueConstantTraversal<S, E> extends AbstractLambdaTraversal @Override public GValueConstantTraversal<S, E> clone() { GValueConstantTraversal<S, E> clone = (GValueConstantTraversal<S, E>) super.clone(); - try { - clone.end = this.end.clone(); - clone.constantTraversal = (ConstantTraversal<S, E>) this.constantTraversal.clone(); - clone.setGValueManager(this.getGValueManager().clone()); - } catch (CloneNotSupportedException e) { //TODO:: handle properly - throw new RuntimeException(e); - } + clone.end = this.end.clone(); + clone.constantTraversal = (ConstantTraversal<S, E>) this.constantTraversal.clone(); + clone.setGValueManager(this.getGValueManager().clone()); return clone; } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java index 769986fcdd..35dda09348 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/GValue.java @@ -39,7 +39,7 @@ import java.util.stream.Stream; * the name is not given, the value was provided literally in the traversal. The value of the variable can be any * object. */ -public class GValue<V> implements Serializable { +public class GValue<V> implements Serializable, Cloneable { private final String name; private final V value; @@ -107,7 +107,7 @@ public class GValue<V> implements Serializable { } @Override - public GValue<V> clone() throws CloneNotSupportedException { + public GValue<V> clone() { if (this.value == null) { return new GValue<>(this.name, null); } 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 9df56e91df..e5095bb74b 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 @@ -24,11 +24,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequire import org.apache.tinkerpop.gremlin.process.traversal.traverser.util.TraverserSet; import org.apache.tinkerpop.gremlin.process.traversal.util.FastNoSuchElementException; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils; import java.io.Serializable; import java.util.Collections; -import java.util.NoSuchElementException; import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import java.util.function.BinaryOperator; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java index 0b910c7464..27596a1fec 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeGlobalStepPlaceholder.java @@ -159,12 +159,8 @@ public class RangeGlobalStepPlaceholder<S> extends FilterStep<S> implements Rang public RangeGlobalStepPlaceholder<S> clone() { RangeGlobalStepPlaceholder<S> clone = (RangeGlobalStepPlaceholder<S>) super.clone(); clone.bypass = this.bypass; - try { - clone.low = this.low.clone(); //TODO:: cleanup unnecessary try-catch - clone.high = this.high.clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } + clone.low = this.low.clone(); + clone.high = this.high.clone(); return clone; } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java index cc345ea566..72fdcfe870 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/RangeLocalStepPlaceholder.java @@ -144,12 +144,8 @@ public class RangeLocalStepPlaceholder<S> extends ScalarMapStep<S,S> implements @Override public RangeLocalStepPlaceholder<S> clone() { RangeLocalStepPlaceholder<S> clone = (RangeLocalStepPlaceholder<S>) super.clone(); - try { - clone.low = this.low.clone(); //TODO:: cleanup unnecessary try-catch - clone.high = this.high.clone(); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } + clone.low = this.low.clone(); + clone.high = this.high.clone(); return clone; } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java index 6aac6e6f0b..8c56ca149d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailGlobalStepPlaceholder.java @@ -67,6 +67,8 @@ public final class TailGlobalStepPlaceholder<S> extends AbstractStep<S, S> imple @Override public TailGlobalStepPlaceholder<S> clone() { final TailGlobalStepPlaceholder<S> clone = (TailGlobalStepPlaceholder<S>) super.clone(); + clone.limit = this.limit.clone(); + clone.bypass = this.bypass; return clone; } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java index d4f62ef597..29d8bf6da0 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/TailLocalStepPlaceholder.java @@ -54,6 +54,7 @@ public final class TailLocalStepPlaceholder<S> extends ScalarMapStep<S, S> imple @Override public TailLocalStepPlaceholder<S> clone() { final TailLocalStepPlaceholder<S> clone = (TailLocalStepPlaceholder<S>) super.clone(); + clone.limit = this.limit.clone(); return clone; } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java index dbd391023b..4083168269 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractAddElementStepPlaceholder.java @@ -355,11 +355,7 @@ public abstract class AbstractAddElementStepPlaceholder<S, E extends Element, X if (v instanceof Traversal) { newValues.add(((Traversal<?, ?>) v).asAdmin().clone()); } else if (v instanceof GValue) { - try { - newValues.add(((GValue) v).clone()); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } + newValues.add(((GValue) v).clone()); } else { newValues.add(v); } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java index 135c5fcee4..da0de4e300 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AbstractMergeElementStepPlaceholder.java @@ -83,11 +83,7 @@ public abstract class AbstractMergeElementStepPlaceholder<S, E> extends FlatMapS if (v instanceof Traversal) { newValues.add(((Traversal<?, ?>) v).asAdmin().clone()); } else if (v instanceof GValue) { - try { - newValues.add(((GValue) v).clone()); - } catch (CloneNotSupportedException e) { - throw new RuntimeException(e); - } + newValues.add(((GValue) v).clone()); } else { newValues.add(v); } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java index 3e96bed777..da31839d84 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/CallStepPlaceholder.java @@ -217,6 +217,7 @@ public final class CallStepPlaceholder<S, E> extends AbstractStep<S, E> implemen @Override public CallStepPlaceholder<S, E> clone() { final CallStepPlaceholder<S, E> clone = (CallStepPlaceholder<S, E>) super.clone(); + clone.staticParams = staticParams != null ? staticParams.clone() : null; clone.mapTraversal = mapTraversal != null ? mapTraversal.clone() : null; clone.parameters = parameters.clone(); return clone; diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java index 91997e4254..06d523c5fd 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStepPlaceholder.java @@ -27,7 +27,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalHelper; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Element; import org.apache.tinkerpop.gremlin.structure.Vertex; -import org.apache.tinkerpop.gremlin.structure.util.CloseableIterator; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import java.util.Arrays; @@ -165,4 +164,15 @@ public class GraphStepPlaceholder<S, E extends Element> extends AbstractStep<S, } return gValues; } + + @Override + public GraphStepPlaceholder<S, E> clone() { + GraphStepPlaceholder<S, E> clone = (GraphStepPlaceholder<S, E>) super.clone(); + clone.onGraphComputer = this.onGraphComputer; + clone.ids = new GValue<?>[this.ids.length]; + for (int i = 0; i < this.ids.length; i++) { + clone.ids[i] = this.ids[i].clone(); + } + return clone; + } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java index 63b85c2f3d..cc78590b49 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/VertexStepPlaceholder.java @@ -48,7 +48,7 @@ import java.util.stream.Collectors; */ public class VertexStepPlaceholder<E extends Element> extends FlatMapStep<Vertex, E> implements GValueHolder<Vertex, E>, VertexStepContract<E> { - private final GValue<String>[] edgeLabels; + private GValue<String>[] edgeLabels; private Direction direction; private final Class<E> returnClass; @@ -148,6 +148,17 @@ public class VertexStepPlaceholder<E extends Element> extends FlatMapStep<Vertex return result; } + @Override + public VertexStepPlaceholder<E> clone() { + VertexStepPlaceholder<E> clone = (VertexStepPlaceholder<E>) super.clone(); + clone.direction = this.direction; + clone.edgeLabels = new GValue[this.edgeLabels.length]; + for (int i = 0; i < this.edgeLabels.length; i++) { + clone.edgeLabels[i] = this.edgeLabels[i].clone(); + } + return clone; + } + @Override public Set<TraverserRequirement> getRequirements() { return Collections.singleton(TraverserRequirement.OBJECT); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java index ca0efef7a0..c1835b0b9d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStepPlaceholder.java @@ -172,9 +172,35 @@ public class AddPropertyStepPlaceholder<S extends Element> extends SideEffectSte public AddPropertyStepPlaceholder<S> clone() { final AddPropertyStepPlaceholder<S> clone = (AddPropertyStepPlaceholder<S>) super.clone(); clone.cardinality = cardinality; - clone.key = key; - clone.value = value; - clone.properties.putAll(properties); + clone.value = value.clone(); + + // Attempt to deep clone keys for Traversal and GValue. Shallow copy is fine if key is a String or enum + if (this.key instanceof Traversal) { + clone.key = ((Traversal<?, ?>) this.key).asAdmin().clone(); + } else if (this.key instanceof GValue) { + clone.key = ((GValue<?>) this.key).clone(); + } else { + clone.key = this.key; + } + + // deep clone properties + clone.properties = new HashMap<>(); + for (Map.Entry<Object, List<Object>> entry : this.properties.entrySet()) { + final Object key = entry.getKey(); + final List<Object> oldValues = entry.getValue(); + final List<Object> newValues = new ArrayList<>(oldValues.size()); + for (Object v : oldValues) { + if (v instanceof Traversal) { + newValues.add(((Traversal<?, ?>) v).asAdmin().clone()); + } else if (v instanceof GValue) { + newValues.add(((GValue) v).clone()); + } else { + newValues.add(v); + } + } + clone.properties.put(key, newValues); + } + return clone; }