This is an automated email from the ASF dual-hosted git repository. dkuppitz pushed a commit to branch TINKERPOP-2159-master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 3872cfba93ed3bc72dc713183be3f7ff7c1847ca Merge: 197dbc7 14948cb Author: Daniel Kuppitz <daniel_kupp...@hotmail.com> AuthorDate: Thu Feb 21 08:40:26 2019 -0700 Merge branch 'TINKERPOP-2159' into TINKERPOP-2159-master .../traversal/step/sideEffect/AddPropertyStep.java | 77 +++++++++++++++------- .../tinkergraph/structure/TinkerGraphPlayTest.java | 27 ++++++-- 2 files changed, 76 insertions(+), 28 deletions(-) diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java index 8176d3e,27ffe4e..470fa4b --- 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 @@@ -36,10 -37,13 +36,12 @@@ import org.apache.tinkerpop.gremlin.str import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedFactory; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedProperty; -import org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty; +import org.apache.tinkerpop.gremlin.structure.util.keyed.KeyedProperty; +import org.apache.tinkerpop.gremlin.structure.util.keyed.KeyedVertexProperty; + import java.util.Iterator; import java.util.List; + import java.util.Objects; import java.util.Set; /** @@@ -91,29 -95,58 +93,58 @@@ public class AddPropertyStep<S extends final Element element = traverser.get(); if (this.callbackRegistry != null) { - final EventStrategy eventStrategy = getTraversal().getStrategies().getStrategy(EventStrategy.class).get(); - final Property currentProperty = traverser.get().property(key); - final boolean newProperty = element instanceof Vertex ? currentProperty == VertexProperty.empty() : currentProperty == Property.empty(); - final Event.ElementPropertyChangedEvent evt; - if (element instanceof Vertex) - evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element), - newProperty ? - new KeyedVertexProperty(key) : - eventStrategy.detach((VertexProperty) currentProperty), value, vertexPropertyKeyValues); - else if (element instanceof Edge) - evt = new Event.EdgePropertyChangedEvent(eventStrategy.detach((Edge) element), - newProperty ? - new KeyedProperty(key) : - eventStrategy.detach(currentProperty), value); - else if (element instanceof VertexProperty) - evt = new Event.VertexPropertyPropertyChangedEvent(eventStrategy.detach((VertexProperty) element), - newProperty ? - new KeyedProperty(key) : - eventStrategy.detach(currentProperty), value); - else - throw new IllegalStateException(String.format("The incoming object cannot be processed by change eventing in %s: %s", AddPropertyStep.class.getName(), element)); + getTraversal().getStrategies().getStrategy(EventStrategy.class) + .ifPresent(eventStrategy -> { + Event.ElementPropertyChangedEvent evt = null; + if (element instanceof Vertex) { + final VertexProperty.Cardinality cardinality = this.cardinality != null + ? this.cardinality + : element.graph().features().vertex().getCardinality(key); - this.callbackRegistry.getCallbacks().forEach(c -> c.accept(evt)); + if (cardinality == VertexProperty.Cardinality.list) { + evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element), - eventStrategy.empty(element, key), value, vertexPropertyKeyValues); ++ new KeyedVertexProperty(key), value, vertexPropertyKeyValues); + } + else if (cardinality == VertexProperty.Cardinality.set) { - Property currentProperty = VertexProperty.empty(); ++ Property currentProperty = null; + final Iterator<? extends Property> properties = traverser.get().properties(key); + while (properties.hasNext()) { + final Property property = properties.next(); + if (Objects.equals(property.value(), value)) { + currentProperty = property; + break; + } + } + evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element), - currentProperty == VertexProperty.empty() ? - eventStrategy.empty(element, key) : ++ currentProperty == null ? ++ new KeyedVertexProperty(key) : + eventStrategy.detach((VertexProperty) currentProperty), value, vertexPropertyKeyValues); + } + } + if (evt == null) { + final Property currentProperty = traverser.get().property(key); + final boolean newProperty = element instanceof Vertex ? currentProperty == VertexProperty.empty() : currentProperty == Property.empty(); + if (element instanceof Vertex) + evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element), + newProperty ? - eventStrategy.empty(element, key) : ++ new KeyedVertexProperty(key) : + eventStrategy.detach((VertexProperty) currentProperty), value, vertexPropertyKeyValues); + else if (element instanceof Edge) + evt = new Event.EdgePropertyChangedEvent(eventStrategy.detach((Edge) element), + newProperty ? - eventStrategy.empty(element, key) : ++ new KeyedProperty(key) : + eventStrategy.detach(currentProperty), value); + else if (element instanceof VertexProperty) + evt = new Event.VertexPropertyPropertyChangedEvent(eventStrategy.detach((VertexProperty) element), + newProperty ? - eventStrategy.empty(element, key) : ++ new KeyedProperty(key) : + eventStrategy.detach(currentProperty), value); + else + throw new IllegalStateException(String.format("The incoming object cannot be processed by change eventing in %s: %s", AddPropertyStep.class.getName(), element)); + } + final Event.ElementPropertyChangedEvent event = evt; + this.callbackRegistry.getCallbacks().forEach(c -> c.accept(event)); + }); } if (null != this.cardinality) diff --cc tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java index c453a38,8e3e8bd..d54c5f2 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/structure/TinkerGraphPlayTest.java @@@ -23,8 -26,10 +23,11 @@@ import org.apache.tinkerpop.gremlin.pro import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversal; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; +import org.apache.tinkerpop.gremlin.process.traversal.step.util.WithOptions; +import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy; + import org.apache.tinkerpop.gremlin.process.traversal.step.util.event.ConsoleMutationListener; + import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy; + import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EarlyLimitStrategy; import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy; import org.apache.tinkerpop.gremlin.structure.*; import org.apache.tinkerpop.gremlin.structure.io.graphml.GraphMLIo;