This is an automated email from the ASF dual-hosted git repository. colegreer pushed a commit to branch TINKERPOP-3193 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit f04a2a7844cf76aaed552459dc74d7e185c679b0 Author: Cole-Greer <[email protected]> AuthorDate: Mon Sep 22 13:23:20 2025 -0700 Isolate internal state management from Configuring/Parameterizing Updates AddVertexStep, AddVertexStartStep, AddEdgeStep, AddEdgeStartStep, and AddPropertyStep to isolate internal state management (used for id, label, properties, from/to...) from the Paramenters object used by Configuring and Parameters interfaces. These interfaces are now exclusively used for the purposes of with() modulation. All other existing usages of Parameters in Configuring steps is exclusively related to with() modulation. --- .../traversal/step/map/AddEdgeStartStep.java | 63 ++++++++++++---------- .../process/traversal/step/map/AddEdgeStep.java | 63 ++++++++++++---------- .../traversal/step/map/AddVertexStartStep.java | 63 ++++++++++++---------- .../process/traversal/step/map/AddVertexStep.java | 63 ++++++++++++---------- .../traversal/step/sideEffect/AddPropertyStep.java | 45 +++++++++------- .../traversal/step/map/AddVertexStepTest.java | 8 +-- 6 files changed, 169 insertions(+), 136 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java index 2fe2827659..76f67e7d7d 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStartStep.java @@ -55,58 +55,63 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> private static final String TO = Graph.Hidden.hide("to"); private boolean first = true; - private Parameters parameters = new Parameters(); + private Parameters internalParameters = new Parameters(); + private Parameters withConfiguration = new Parameters(); private CallbackRegistry<Event.EdgeAddedEvent> callbackRegistry; public AddEdgeStartStep(final Traversal.Admin traversal, final String edgeLabel) { super(traversal); - this.parameters.set(this, T.label, edgeLabel); + this.internalParameters.set(this, T.label, edgeLabel); } public AddEdgeStartStep(final Traversal.Admin traversal, final Traversal<?, String> edgeLabelTraversal) { super(traversal); - this.parameters.set(this, T.label, edgeLabelTraversal); + this.internalParameters.set(this, T.label, edgeLabelTraversal); } @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { - return this.parameters.getTraversals(); + return this.internalParameters.getTraversals(); } @Override public Parameters getParameters() { - return this.parameters; + return this.withConfiguration; } @Override public Set<String> getScopeKeys() { - return this.parameters.getReferencedLabels(); + return this.internalParameters.getReferencedLabels(); } @Override public void configure(final Object... keyValues) { - this.parameters.set(this, keyValues); + this.withConfiguration.set(this, keyValues); + } + + private void configureInternalParams(final Object... keyValues) { + this.internalParameters.set(this, keyValues); } @Override public void addTo(final Traversal.Admin<?, ?> toObject) { - this.parameters.set(this, TO, toObject); + this.internalParameters.set(this, TO, toObject); } @Override public void addFrom(final Traversal.Admin<?, ?> fromObject) { - this.parameters.set(this, FROM, fromObject); + this.internalParameters.set(this, FROM, fromObject); } @Override public Object getElementId() { - List<Object> ids = this.parameters.get(T.id, null); + List<Object> ids = this.internalParameters.get(T.id, null); return ids.isEmpty() ? null : ids.get(0); } @Override public void setElementId(Object elementId) { - configure(T.id, elementId); + configureInternalParams(T.id, elementId); } @Override @@ -118,10 +123,10 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> // a dead traverser to trigger the traversal final Traverser.Admin traverser = generator.generate(1, (Step) this, 1); - final String edgeLabel = (String) this.parameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL).get(0); + final String edgeLabel = (String) this.internalParameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL).get(0); // FROM/TO must be set and must be vertices - Object theTo = this.parameters.get(traverser, TO, () -> null).get(0); + Object theTo = this.internalParameters.get(traverser, TO, () -> null).get(0); if (theTo != null && !(theTo instanceof Vertex)) { theTo = new ReferenceVertex(theTo); } @@ -130,7 +135,7 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> throw new IllegalStateException(String.format( "The value given to addE(%s).to() must resolve to a Vertex or the ID of a Vertex present in the graph, but null was specified instead", edgeLabel)); - Object theFrom = this.parameters.get(traverser, FROM, () -> null).get(0); + Object theFrom = this.internalParameters.get(traverser, FROM, () -> null).get(0); if (theFrom != null && !(theFrom instanceof Vertex)) { theFrom = new ReferenceVertex(theFrom); } @@ -161,7 +166,7 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> "The value given to addE(%s).from() must resolve to a Vertex or the ID of a Vertex present in the graph. The provided value does not match any vertices in the graph", edgeLabel)); } - final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, this.parameters.getKeyValues(traverser, TO, FROM, T.label)); + final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, this.internalParameters.getKeyValues(traverser, TO, FROM, T.label)); EventUtil.registerEdgeCreation(callbackRegistry, getTraversal(), edge); return generator.generate(edge, this, 1L); } else @@ -178,30 +183,32 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> @Override public int hashCode() { - return super.hashCode() ^ this.parameters.hashCode(); + return super.hashCode() ^ this.internalParameters.hashCode() ^ this.withConfiguration.hashCode(); } @Override public String toString() { - return StringFactory.stepString(this, this.parameters.toString()); + return StringFactory.stepString(this, this.internalParameters.toString()); } @Override public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) { super.setTraversal(parentTraversal); - this.parameters.getTraversals().forEach(this::integrateChild); + this.internalParameters.getTraversals().forEach(this::integrateChild); + this.withConfiguration.getTraversals().forEach(this::integrateChild); } @Override public AddEdgeStartStep clone() { final AddEdgeStartStep clone = (AddEdgeStartStep) super.clone(); - clone.parameters = this.parameters.clone(); + clone.internalParameters = this.internalParameters.clone(); + clone.withConfiguration = this.withConfiguration.clone(); return clone; } @Override public Object getLabel() { - Object label = parameters.get(T.label, () -> Edge.DEFAULT_LABEL).get(0); + Object label = internalParameters.get(T.label, () -> Edge.DEFAULT_LABEL).get(0); if (label instanceof ConstantTraversal) { return ((ConstantTraversal<?, ?>) label).next(); } @@ -210,23 +217,23 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> @Override public Object getFrom() { - return getAdjacentVertex(this.parameters, FROM); + return getAdjacentVertex(this.internalParameters, FROM); } @Override public Object getTo() { - return getAdjacentVertex(this.parameters, TO); + return getAdjacentVertex(this.internalParameters, TO); } @Override public Map<Object, List<Object>> getProperties() { - return Collections.unmodifiableMap(parameters.getRaw()); + return Collections.unmodifiableMap(internalParameters.getRaw()); } @Override public boolean removeProperty(Object k) { - if (parameters.contains(k)) { - parameters.remove(k); + if (internalParameters.contains(k)) { + internalParameters.remove(k); return true; } return false; @@ -234,8 +241,8 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> @Override public boolean removeElementId() { - if (this.parameters.contains(T.id)) { - this.parameters.remove(T.id); + if (this.internalParameters.contains(T.id)) { + this.internalParameters.remove(T.id); return true; } return false; @@ -243,6 +250,6 @@ public class AddEdgeStartStep extends AbstractStep<Edge, Edge> @Override public void addProperty(final Object key, final Object value) { - configure(key, value); + configureInternalParams(key, value); } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java index 77d6dfcffa..d7c495f216 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java @@ -50,66 +50,71 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> private static final String FROM = Graph.Hidden.hide("from"); private static final String TO = Graph.Hidden.hide("to"); - private Parameters parameters = new Parameters(); + private Parameters internalParameters = new Parameters(); + private Parameters withConfiguration = new Parameters(); private CallbackRegistry<Event.EdgeAddedEvent> callbackRegistry; public AddEdgeStep(final Traversal.Admin traversal, final String edgeLabel) { super(traversal); - this.parameters.set(this, T.label, edgeLabel); + this.internalParameters.set(this, T.label, edgeLabel); } public AddEdgeStep(final Traversal.Admin traversal, final Traversal.Admin<S,String> edgeLabelTraversal) { super(traversal); - this.parameters.set(this, T.label, edgeLabelTraversal); + this.internalParameters.set(this, T.label, edgeLabelTraversal); } @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { - return this.parameters.getTraversals(); + return this.internalParameters.getTraversals(); } @Override public Parameters getParameters() { - return this.parameters; + return this.withConfiguration; } @Override public Set<String> getScopeKeys() { - return this.parameters.getReferencedLabels(); + return this.internalParameters.getReferencedLabels(); } @Override public void configure(final Object... keyValues) { - this.parameters.set(this, keyValues); + this.withConfiguration.set(this, keyValues); + } + + private void configureInternalParams(final Object... keyValues) { + this.internalParameters.set(this, keyValues); } @Override public void addTo(final Traversal.Admin<?, ?> toObject) { - this.parameters.set(this, TO, toObject); + this.internalParameters.set(this, TO, toObject); } @Override public void addFrom(final Traversal.Admin<?, ?> fromObject) { - this.parameters.set(this, FROM, fromObject); + this.internalParameters.set(this, FROM, fromObject); } @Override public Object getElementId() { - List<Object> ids = this.parameters.get(T.id, null); + List<Object> ids = this.internalParameters.get(T.id, null); return ids.isEmpty() ? null : ids.get(0); } @Override public void setElementId(Object elementId) { - configure(T.id, elementId); + configureInternalParams(T.id, elementId); } @Override protected Edge map(final Traverser.Admin<S> traverser) { - final String edgeLabel = this.parameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL).get(0); + final String edgeLabel = this.internalParameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL).get(0); - Vertex toVertex = getAdjacentVertex(this.parameters, TO, traverser, edgeLabel); - Vertex fromVertex = getAdjacentVertex(this.parameters, FROM, traverser, edgeLabel); + Vertex toVertex = getAdjacentVertex(this.internalParameters, TO, traverser, edgeLabel); + Vertex fromVertex = getAdjacentVertex(this.internalParameters, FROM, traverser, edgeLabel); try { if (toVertex instanceof Attachable) @@ -131,8 +136,7 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> "The value given to addE(%s).from() must resolve to a Vertex or the ID of a Vertex present in the graph. The provided value does not match any vertices in the graph", edgeLabel)); } - - final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, this.parameters.getKeyValues(traverser, TO, FROM, T.label)); + final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, this.internalParameters.getKeyValues(traverser, TO, FROM, T.label)); EventUtil.registerEdgeCreation(callbackRegistry, getTraversal(), edge); return edge; } @@ -150,30 +154,31 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> @Override public int hashCode() { - return super.hashCode() ^ this.parameters.hashCode(); + return super.hashCode() ^ this.internalParameters.hashCode() ^ this.withConfiguration.hashCode(); } @Override public String toString() { - return StringFactory.stepString(this, this.parameters.toString()); + return StringFactory.stepString(this, this.internalParameters.toString()); } @Override public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) { super.setTraversal(parentTraversal); - this.parameters.getTraversals().forEach(this::integrateChild); + this.internalParameters.getTraversals().forEach(this::integrateChild); } @Override public AddEdgeStep<S> clone() { final AddEdgeStep<S> clone = (AddEdgeStep<S>) super.clone(); - clone.parameters = this.parameters.clone(); + clone.internalParameters = this.internalParameters.clone(); + clone.withConfiguration = this.withConfiguration.clone(); return clone; } @Override public Object getLabel() { - Object label = parameters.get(T.label, () -> Edge.DEFAULT_LABEL).get(0); + Object label = internalParameters.get(T.label, () -> Edge.DEFAULT_LABEL).get(0); if (label instanceof ConstantTraversal) { return ((ConstantTraversal<?, ?>) label).next(); } @@ -182,18 +187,18 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> @Override public void addProperty(Object key, Object value) { - configure(key, value); + configureInternalParams(key, value); } @Override public Map<Object, List<Object>> getProperties() { - return Collections.unmodifiableMap(parameters.getRaw(T.label, TO, FROM)); + return Collections.unmodifiableMap(internalParameters.getRaw(T.label, TO, FROM)); } @Override public boolean removeProperty(Object k) { - if (parameters.contains(k)) { - parameters.remove(k); + if (internalParameters.contains(k)) { + internalParameters.remove(k); return true; } return false; @@ -201,8 +206,8 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> @Override public boolean removeElementId() { - if (this.parameters.contains(T.id)) { - this.parameters.remove(T.id); + if (this.internalParameters.contains(T.id)) { + this.internalParameters.remove(T.id); return true; } return false; @@ -210,11 +215,11 @@ public class AddEdgeStep<S> extends ScalarMapStep<S, Edge> @Override public Object getFrom() { - return getAdjacentVertex(this.parameters, FROM); + return getAdjacentVertex(this.internalParameters, FROM); } @Override public Object getTo() { - return getAdjacentVertex(this.parameters, TO); + return getAdjacentVertex(this.internalParameters, TO); } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java index fd91c769af..db50f0c1e2 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStartStep.java @@ -49,20 +49,21 @@ import org.apache.tinkerpop.gremlin.structure.util.StringFactory; public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> implements TraversalParent, Scoping, AddVertexStepContract<Vertex>, Configuring { - private Parameters parameters = new Parameters(); + private Parameters internalParameters = new Parameters(); + private Parameters withConfiguration = new Parameters(); private boolean first = true; private CallbackRegistry<Event.VertexAddedEvent> callbackRegistry; private boolean userProvidedLabel; public AddVertexStartStep(final Traversal.Admin traversal, final String label) { super(traversal); - this.parameters.set(this, T.label, null == label ? Vertex.DEFAULT_LABEL : label); + this.internalParameters.set(this, T.label, null == label ? Vertex.DEFAULT_LABEL : label); userProvidedLabel = label != null; } public AddVertexStartStep(final Traversal.Admin traversal, final Traversal<?, String> vertexLabelTraversal) { super(traversal); - this.parameters.set(this, T.label, null == vertexLabelTraversal ? Vertex.DEFAULT_LABEL : vertexLabelTraversal); + this.internalParameters.set(this, T.label, null == vertexLabelTraversal ? Vertex.DEFAULT_LABEL : vertexLabelTraversal); userProvidedLabel = vertexLabelTraversal != null; } @@ -73,45 +74,49 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> @Override public Object getElementId() { - List<Object> ids = this.parameters.get(T.id, null); + List<Object> ids = this.internalParameters.get(T.id, null); return ids.isEmpty() ? null : ids.get(0); } @Override public void setElementId(Object elementId) { - configure(T.id, elementId); + configureInternalParams(T.id, elementId); } @Override public Parameters getParameters() { - return this.parameters; + return this.withConfiguration; } @Override public Set<String> getScopeKeys() { - return this.parameters.getReferencedLabels(); + return this.internalParameters.getReferencedLabels(); } @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { - return this.parameters.getTraversals(); + return this.internalParameters.getTraversals(); } @Override public void configure(final Object... keyValues) { - if (keyValues[0] == T.label && this.parameters.contains(T.label)) { - if (this.parameters.contains(T.label, Vertex.DEFAULT_LABEL)) { - this.parameters.remove(T.label); - this.parameters.set(this, keyValues); + this.withConfiguration.set(this, keyValues); + } + + private void configureInternalParams(final Object... keyValues) { + if (keyValues[0] == T.label && this.internalParameters.contains(T.label)) { + if (this.internalParameters.contains(T.label, Vertex.DEFAULT_LABEL)) { + this.internalParameters.remove(T.label); + this.internalParameters.set(this, keyValues); } else { throw new IllegalArgumentException(String.format("Vertex T.label has already been set to [%s] and cannot be overridden with [%s]", - this.parameters.getRaw().get(T.label).get(0), keyValues[1])); + this.internalParameters.getRaw().get(T.label).get(0), keyValues[1])); } - } else if (keyValues[0] == T.id && this.parameters.contains(T.id)) { + } else if (keyValues[0] == T.id && this.internalParameters.contains(T.id)) { throw new IllegalArgumentException(String.format("Vertex T.id has already been set to [%s] and cannot be overridden with [%s]", - this.parameters.getRaw().get(T.id).get(0), keyValues[1])); + this.internalParameters.getRaw().get(T.id).get(0), keyValues[1])); } else { - this.parameters.set(this, keyValues); + this.internalParameters.set(this, keyValues); } } @@ -120,7 +125,7 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> if (this.first) { this.first = false; final TraverserGenerator generator = this.getTraversal().getTraverserGenerator(); - final Vertex vertex = this.getTraversal().getGraph().get().addVertex(this.parameters.getKeyValues(generator.generate(false, (Step) this, 1L))); + final Vertex vertex = this.getTraversal().getGraph().get().addVertex(this.internalParameters.getKeyValues(generator.generate(false, (Step) this, 1L))); EventUtil.registerVertexCreation(callbackRegistry, getTraversal(), vertex); return generator.generate(vertex, this, 1L); } else @@ -140,7 +145,7 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> @Override public int hashCode() { - return super.hashCode() ^ this.parameters.hashCode(); + return super.hashCode() ^ this.internalParameters.hashCode() ^ this.withConfiguration.hashCode(); } @Override @@ -150,26 +155,28 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> @Override public String toString() { - return StringFactory.stepString(this, this.parameters); + return StringFactory.stepString(this, this.internalParameters); } @Override public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) { super.setTraversal(parentTraversal); - this.parameters.getTraversals().forEach(this::integrateChild); + this.internalParameters.getTraversals().forEach(this::integrateChild); + this.withConfiguration.getTraversals().forEach(this::integrateChild); } @Override public AddVertexStartStep clone() { final AddVertexStartStep clone = (AddVertexStartStep) super.clone(); - clone.parameters = this.parameters.clone(); + clone.internalParameters = this.internalParameters.clone(); + clone.withConfiguration = this.withConfiguration.clone(); clone.userProvidedLabel = this.userProvidedLabel; return clone; } @Override public Object getLabel() { - Object label = parameters.get(T.label, () -> Vertex.DEFAULT_LABEL).get(0); + Object label = internalParameters.get(T.label, () -> Vertex.DEFAULT_LABEL).get(0); if (label instanceof ConstantTraversal) { return ((ConstantTraversal<?, ?>) label).next(); } @@ -178,13 +185,13 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> @Override public Map<Object, List<Object>> getProperties() { - return Collections.unmodifiableMap(parameters.getRaw()); + return Collections.unmodifiableMap(internalParameters.getRaw()); } @Override public boolean removeProperty(Object k) { - if (parameters.contains(k)) { - parameters.remove(k); + if (internalParameters.contains(k)) { + internalParameters.remove(k); return true; } return false; @@ -192,8 +199,8 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> @Override public boolean removeElementId() { - if (this.parameters.contains(T.id)) { - this.parameters.remove(T.id); + if (this.internalParameters.contains(T.id)) { + this.internalParameters.remove(T.id); return true; } return false; @@ -201,6 +208,6 @@ public class AddVertexStartStep extends AbstractStep<Vertex, Vertex> @Override public void addProperty(final Object key, final Object value) { - configure(key, value); + configureInternalParams(key, value); } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java index b3baa8b729..f839402cd5 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStep.java @@ -47,19 +47,20 @@ import java.util.Set; public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> implements Writing<Event.VertexAddedEvent>, TraversalParent, Scoping, AddVertexStepContract<S>, Configuring { - private Parameters parameters = new Parameters(); + private Parameters internalParameters = new Parameters(); + private Parameters withConfiguration = new Parameters(); private CallbackRegistry<Event.VertexAddedEvent> callbackRegistry; private boolean userProvidedLabel; public AddVertexStep(final Traversal.Admin traversal, final String label) { super(traversal); - this.parameters.set(this, T.label, null == label ? Vertex.DEFAULT_LABEL : label); + this.internalParameters.set(this, T.label, null == label ? Vertex.DEFAULT_LABEL : label); userProvidedLabel = label != null; } public AddVertexStep(final Traversal.Admin traversal, final Traversal.Admin<S,String> vertexLabelTraversal) { super(traversal); - this.parameters.set(this, T.label, null == vertexLabelTraversal ? Vertex.DEFAULT_LABEL : vertexLabelTraversal); + this.internalParameters.set(this, T.label, null == vertexLabelTraversal ? Vertex.DEFAULT_LABEL : vertexLabelTraversal); userProvidedLabel = vertexLabelTraversal != null; } @@ -70,53 +71,57 @@ public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> @Override public Object getElementId() { - List<Object> ids = this.parameters.get(T.id, null); + List<Object> ids = this.internalParameters.get(T.id, null); return ids.isEmpty() ? null : ids.get(0); } @Override public void setElementId(Object elementId) { - configure(T.id, elementId); + configureInternalParams(T.id, elementId); } @Override public Parameters getParameters() { - return this.parameters; + return this.withConfiguration; } @Override public Set<String> getScopeKeys() { - return this.parameters.getReferencedLabels(); + return this.internalParameters.getReferencedLabels(); } @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { - return this.parameters.getTraversals(); + return this.internalParameters.getTraversals(); } @Override public void configure(final Object... keyValues) { + this.withConfiguration.set(this, keyValues); + } + + private void configureInternalParams(final Object... keyValues) { if (keyValues[0] == T.label) userProvidedLabel = true; - if (keyValues[0] == T.label && this.parameters.contains(T.label)) { - if (this.parameters.contains(T.label, Vertex.DEFAULT_LABEL)) { - this.parameters.remove(T.label); - this.parameters.set(this, keyValues); + if (keyValues[0] == T.label && this.internalParameters.contains(T.label)) { + if (this.internalParameters.contains(T.label, Vertex.DEFAULT_LABEL)) { + this.internalParameters.remove(T.label); + this.internalParameters.set(this, keyValues); } else { throw new IllegalArgumentException(String.format("Vertex T.label has already been set to [%s] and cannot be overridden with [%s]", - this.parameters.getRaw().get(T.label).get(0), keyValues[1])); + this.internalParameters.getRaw().get(T.label).get(0), keyValues[1])); } - } else if (keyValues[0] == T.id && this.parameters.contains(T.id)) { + } else if (keyValues[0] == T.id && this.internalParameters.contains(T.id)) { throw new IllegalArgumentException(String.format("Vertex T.id has already been set to [%s] and cannot be overridden with [%s]", - this.parameters.getRaw().get(T.id).get(0), keyValues[1])); + this.internalParameters.getRaw().get(T.id).get(0), keyValues[1])); } else { - this.parameters.set(this, keyValues); + this.internalParameters.set(this, keyValues); } } @Override protected Vertex map(final Traverser.Admin<S> traverser) { - final Vertex vertex = this.getTraversal().getGraph().get().addVertex(this.parameters.getKeyValues(traverser)); + final Vertex vertex = this.getTraversal().getGraph().get().addVertex(this.internalParameters.getKeyValues(traverser)); EventUtil.registerVertexCreation(callbackRegistry, getTraversal(), vertex); return vertex; } @@ -129,7 +134,7 @@ public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> @Override public int hashCode() { - return super.hashCode() ^ this.parameters.hashCode(); + return super.hashCode() ^ this.internalParameters.hashCode() ^ this.withConfiguration.hashCode(); } @Override @@ -139,26 +144,28 @@ public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> @Override public String toString() { - return StringFactory.stepString(this, this.parameters); + return StringFactory.stepString(this, this.internalParameters); } @Override public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) { super.setTraversal(parentTraversal); - this.parameters.getTraversals().forEach(this::integrateChild); + this.internalParameters.getTraversals().forEach(this::integrateChild); + this.withConfiguration.getTraversals().forEach(this::integrateChild); } @Override public AddVertexStep<S> clone() { final AddVertexStep<S> clone = (AddVertexStep<S>) super.clone(); - clone.parameters = this.parameters.clone(); + clone.internalParameters = this.internalParameters.clone(); + clone.withConfiguration = this.withConfiguration.clone(); clone.userProvidedLabel = this.userProvidedLabel; return clone; } @Override public Object getLabel() { - Object label = parameters.get(T.label, () -> Vertex.DEFAULT_LABEL).get(0); + Object label = internalParameters.get(T.label, () -> Vertex.DEFAULT_LABEL).get(0); if (label instanceof ConstantTraversal) { return ((ConstantTraversal<?, ?>) label).next(); } @@ -167,13 +174,13 @@ public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> @Override public Map<Object, List<Object>> getProperties() { - return Collections.unmodifiableMap(parameters.getRaw()); + return Collections.unmodifiableMap(internalParameters.getRaw()); } @Override public boolean removeProperty(Object k) { - if (parameters.contains(k)) { - parameters.remove(k); + if (internalParameters.contains(k)) { + internalParameters.remove(k); return true; } return false; @@ -181,8 +188,8 @@ public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> @Override public boolean removeElementId() { - if (this.parameters.contains(T.id)) { - this.parameters.remove(T.id); + if (this.internalParameters.contains(T.id)) { + this.internalParameters.remove(T.id); return true; } return false; @@ -190,6 +197,6 @@ public class AddVertexStep<S> extends ScalarMapStep<S, Vertex> @Override public void addProperty(final Object key, final Object value) { - configure(key, value); + configureInternalParams(key, value); } } diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java index feb02b98d8..f757531c58 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java @@ -50,39 +50,44 @@ import java.util.Set; public class AddPropertyStep<S extends Element> extends SideEffectStep<S> implements AddPropertyStepContract<S>, Writing<Event.ElementPropertyChangedEvent>, Deleting<Event.ElementPropertyChangedEvent>, Configuring { - private Parameters parameters = new Parameters(); + private Parameters internalParameters = new Parameters(); + private Parameters withConfiguration = new Parameters(); private final VertexProperty.Cardinality cardinality; private CallbackRegistry<Event.ElementPropertyChangedEvent> callbackRegistry; public AddPropertyStep(final Traversal.Admin traversal, final VertexProperty.Cardinality cardinality, final Object keyObject, final Object valueObject) { super(traversal); - this.parameters.set(this, T.key, keyObject, T.value, valueObject); + this.internalParameters.set(this, T.key, keyObject, T.value, valueObject); this.cardinality = cardinality; } @Override public Parameters getParameters() { - return this.parameters; + return this.withConfiguration; } @Override public Set<String> getScopeKeys() { - return this.parameters.getReferencedLabels(); + return this.internalParameters.getReferencedLabels(); } @Override public <S, E> List<Traversal.Admin<S, E>> getLocalChildren() { - return this.parameters.getTraversals(); + return this.internalParameters.getTraversals(); } @Override public void configure(final Object... keyValues) { - this.parameters.set(this, keyValues); + this.withConfiguration.set(this, keyValues); + } + + private void configureInternalParams(final Object... keyValues) { + this.internalParameters.set(this, keyValues); } @Override protected void sideEffect(final Traverser.Admin<S> traverser) { - final Object k = this.parameters.get(traverser, T.key, () -> { + final Object k = this.internalParameters.get(traverser, T.key, () -> { throw new IllegalStateException("The AddPropertyStep does not have a provided key: " + this); }).get(0); @@ -91,10 +96,10 @@ public class AddPropertyStep<S extends Element> extends SideEffectStep<S> throw new IllegalStateException(String.format("T.%s is immutable on existing elements", ((T) k).name())); final String key = (String) k; - final Object value = this.parameters.get(traverser, T.value, () -> { + final Object value = this.internalParameters.get(traverser, T.value, () -> { throw new IllegalStateException("The AddPropertyStep does not have a provided value: " + this); }).get(0); - final Object[] vertexPropertyKeyValues = this.parameters.getKeyValues(traverser, T.key, T.value); + final Object[] vertexPropertyKeyValues = this.internalParameters.getKeyValues(traverser, T.key, T.value); final Element element = traverser.get(); @@ -185,14 +190,15 @@ public class AddPropertyStep<S extends Element> extends SideEffectStep<S> @Override public int hashCode() { - final int hash = super.hashCode() ^ this.parameters.hashCode(); + final int hash = super.hashCode() ^ this.internalParameters.hashCode() ^ this.withConfiguration.hashCode(); return (null != this.cardinality) ? (hash ^ cardinality.hashCode()) : hash; } @Override public void setTraversal(final Traversal.Admin<?, ?> parentTraversal) { super.setTraversal(parentTraversal); - this.parameters.getTraversals().forEach(this::integrateChild); + this.internalParameters.getTraversals().forEach(this::integrateChild); + this.withConfiguration.getTraversals().forEach(this::integrateChild); } @Override @@ -202,42 +208,43 @@ public class AddPropertyStep<S extends Element> extends SideEffectStep<S> @Override public Object getKey() { - List<Object> keyParams = parameters.get(T.key, null); + List<Object> keyParams = internalParameters.get(T.key, null); return keyParams.isEmpty() ? null : keyParams.get(0); } @Override public Object getValue() { - List<Object> values = parameters.get(T.value, null); + List<Object> values = internalParameters.get(T.value, null); return values.isEmpty() ? null : values.get(0); } @Override public String toString() { - return StringFactory.stepString(this, this.parameters); + return StringFactory.stepString(this, this.internalParameters); } @Override public AddPropertyStep<S> clone() { final AddPropertyStep<S> clone = (AddPropertyStep<S>) super.clone(); - clone.parameters = this.parameters.clone(); + clone.internalParameters = this.internalParameters.clone(); + clone.withConfiguration = this.withConfiguration.clone(); return clone; } @Override public void addProperty(Object key, Object value) { - configure(key, value); + configureInternalParams(key, value); } @Override public Map<Object, List<Object>> getProperties() { - return parameters.getRaw(T.key, T.value); + return internalParameters.getRaw(T.key, T.value); } @Override public boolean removeProperty(Object k) { - if (parameters.contains(k)) { - parameters.remove(k); + if (internalParameters.contains(k)) { + internalParameters.remove(k); return true; } return false; diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java index fc370342b0..8ed18ca157 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexStepTest.java @@ -235,9 +235,9 @@ public class AddVertexStepTest extends GValueStepTest { final Traversal.Admin t = mock(Traversal.Admin.class); when(t.getTraverserSetSupplier()).thenReturn(TraverserSetSupplier.instance()); final AddVertexStartStep starStep = new AddVertexStartStep(t, (String) null); - assertEquals(Vertex.DEFAULT_LABEL, starStep.getParameters().getRaw().get(T.label).get(0)); + assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel()); final AddVertexStep step = new AddVertexStep(t, (String) null); - assertEquals(Vertex.DEFAULT_LABEL, starStep.getParameters().getRaw().get(T.label).get(0)); + assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel()); } @Test @@ -245,9 +245,9 @@ public class AddVertexStepTest extends GValueStepTest { final Traversal.Admin t = mock(Traversal.Admin.class); when(t.getTraverserSetSupplier()).thenReturn(TraverserSetSupplier.instance()); final AddVertexStartStep starStep = new AddVertexStartStep(t, (Traversal<?, String>) null); - assertEquals(Vertex.DEFAULT_LABEL, starStep.getParameters().getRaw().get(T.label).get(0)); + assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel()); final AddVertexStep step = new AddVertexStep(t, (String) null); - assertEquals(Vertex.DEFAULT_LABEL, starStep.getParameters().getRaw().get(T.label).get(0)); + assertEquals(Vertex.DEFAULT_LABEL, starStep.getLabel()); } @Test
