You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by dk...@apache.org on 2019/04/08 17:05:39 UTC
[tinkerpop] 01/02: TINKERPOP-2159 Fixed multi-valued property
handling in EventStrategy / AddPropertyStep.
This is an automated email from the ASF dual-hosted git repository.
dkuppitz pushed a commit to branch TINKERPOP-2159
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 4cc32a2d9c71945c50140b0c00d38c847389ce14
Author: Daniel Kuppitz <da...@hotmail.com>
AuthorDate: Mon Feb 18 07:30:48 2019 -0700
TINKERPOP-2159 Fixed multi-valued property handling in EventStrategy / AddPropertyStep.
---
.../traversal/step/sideEffect/AddPropertyStep.java | 77 +++++++++++++++-------
.../tinkergraph/structure/TinkerGraphPlayTest.java | 33 ++++++----
2 files changed, 74 insertions(+), 36 deletions(-)
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 7509f86..27ffe4e 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
@@ -41,7 +41,9 @@ 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 java.util.Iterator;
import java.util.List;
+import java.util.Objects;
import java.util.Set;
/**
@@ -93,29 +95,58 @@ public final class AddPropertyStep<S extends Element> extends SideEffectStep<S>
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 ?
- eventStrategy.empty(element, 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) :
- eventStrategy.detach(currentProperty), value);
- else if (element instanceof VertexProperty)
- evt = new Event.VertexPropertyPropertyChangedEvent(eventStrategy.detach((VertexProperty) element),
- newProperty ?
- eventStrategy.empty(element, 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));
-
- this.callbackRegistry.getCallbacks().forEach(c -> c.accept(evt));
+ 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);
+
+ if (cardinality == VertexProperty.Cardinality.list) {
+ evt = new Event.VertexPropertyChangedEvent(eventStrategy.detach((Vertex) element),
+ eventStrategy.empty(element, key), value, vertexPropertyKeyValues);
+ }
+ else if (cardinality == VertexProperty.Cardinality.set) {
+ Property currentProperty = VertexProperty.empty();
+ 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) :
+ 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) :
+ eventStrategy.detach((VertexProperty) currentProperty), value, vertexPropertyKeyValues);
+ else if (element instanceof Edge)
+ evt = new Event.EdgePropertyChangedEvent(eventStrategy.detach((Edge) element),
+ newProperty ?
+ eventStrategy.empty(element, key) :
+ eventStrategy.detach(currentProperty), value);
+ else if (element instanceof VertexProperty)
+ evt = new Event.VertexPropertyPropertyChangedEvent(eventStrategy.detach((VertexProperty) element),
+ newProperty ?
+ eventStrategy.empty(element, 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 --git 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
index c278e89..8e3e8bd 100644
--- 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
@@ -27,6 +27,8 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traverser;
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.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.*;
@@ -124,20 +126,25 @@ public class TinkerGraphPlayTest {
@Ignore
public void testPlayDK() throws Exception {
- Graph graph = TinkerGraph.open();
- graph.io(GraphMLIo.build()).readGraph("../data/grateful-dead.xml");
+ final Graph graph = TinkerGraph.open();
+ final EventStrategy strategy = EventStrategy.build().addListener(new ConsoleMutationListener(graph)).create();
+ final GraphTraversalSource g = graph.traversal().withStrategies(strategy);
+
+ g.addV().property(T.id, 1).iterate();
+ g.V(1).property("name", "name1").iterate();
+ g.V(1).property("name", "name2").iterate();
+ g.V(1).property("name", "name2").iterate();
+
+ g.addV().property(T.id, 2).iterate();
+ g.V(2).property(VertexProperty.Cardinality.list, "name", "name1").iterate();
+ g.V(2).property(VertexProperty.Cardinality.list, "name", "name2").iterate();
+ g.V(2).property(VertexProperty.Cardinality.list, "name", "name2").iterate();
+
- GraphTraversalSource g = graph.traversal();//.withoutStrategies(EarlyLimitStrategy.class);
- g.V().has("name", "Bob_Dylan").in("sungBy").as("a").
- repeat(out().order().by(Order.shuffle).simplePath().from("a")).
- until(out("writtenBy").has("name", "Johnny_Cash")).limit(1).as("b").
- repeat(out().order().by(Order.shuffle).as("c").simplePath().from("b").to("c")).
- until(out("sungBy").has("name", "Grateful_Dead")).limit(1).
- path().from("a").unfold().
- <List<String>>project("song", "artists").
- by("name").
- by(__.coalesce(out("sungBy", "writtenBy").dedup().values("name"), constant("Unknown")).fold()).
- forEachRemaining(System.out::println);
+ g.addV().property(T.id, 3).iterate();
+ g.V(3).property(VertexProperty.Cardinality.set, "name", "name1", "ping", "pong").iterate();
+ g.V(3).property(VertexProperty.Cardinality.set, "name", "name2", "ping", "pong").iterate();
+ g.V(3).property(VertexProperty.Cardinality.set, "name", "name2", "pong", "ping").iterate();
}
@Test