You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2015/09/08 21:14:07 UTC

[19/50] incubator-tinkerpop git commit: Parameters deals with multi-properties -- which is really only useful for AddVertexStep. Found a couple other problems with Parameters that didn't rear their head with the test cases we had. Added more test cases.

Parameters deals with multi-properties -- which is really only useful for AddVertexStep. Found a couple other problems with Parameters that didn't rear their head with the test cases we had. Added more test cases. TINKERPOP3-823 #close.


Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/be8522b1
Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/be8522b1
Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/be8522b1

Branch: refs/heads/TINKERPOP3-333
Commit: be8522b1f23fded72783f4f0b916a2c946129adb
Parents: 2253c67
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Tue Sep 1 13:15:58 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Tue Sep 1 13:15:58 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/step/map/AddEdgeStep.java |  6 +-
 .../step/sideEffect/AddPropertyStep.java        |  6 +-
 .../process/traversal/step/util/Parameters.java | 67 ++++++++++++------
 .../PartitionStrategyTraverseTest.java          |  8 +--
 .../step/map/GroovyAddVertexTest.groovy         | 10 +++
 .../traversal/step/map/AddVertexTest.java       | 71 +++++++++++++++++++-
 6 files changed, 137 insertions(+), 31 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/be8522b1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddEdgeStep.java
----------------------------------------------------------------------
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 91f3c05..3f6086a 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
@@ -85,9 +85,9 @@ public final class AddEdgeStep<S> extends MapStep<S, Edge> implements Mutating<E
 
     @Override
     protected Edge map(final Traverser.Admin<S> traverser) {
-        final Vertex toVertex = this.parameters.get(traverser, TO, () -> (Vertex) traverser.get());
-        final Vertex fromVertex = this.parameters.get(traverser, FROM, () -> (Vertex) traverser.get());
-        final String edgeLabel = this.parameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL);
+        final Vertex toVertex = this.parameters.get(traverser, TO, () -> (Vertex) traverser.get()).get(0);
+        final Vertex fromVertex = this.parameters.get(traverser, FROM, () -> (Vertex) traverser.get()).get(0);
+        final String edgeLabel = this.parameters.get(traverser, T.label, () -> Edge.DEFAULT_LABEL).get(0);
 
         final Edge edge = fromVertex.addEdge(edgeLabel, toVertex, this.parameters.getKeyValues(traverser, TO, FROM, T.label));
             if (callbackRegistry != null) {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/be8522b1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/AddPropertyStep.java
----------------------------------------------------------------------
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 02ac53c..9ea7785 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
@@ -75,12 +75,12 @@ public final class AddPropertyStep<S extends Element> extends SideEffectStep<S>
 
     @Override
     protected void sideEffect(final Traverser.Admin<S> traverser) {
-        final String key = this.parameters.get(traverser, T.key, () -> {
+        final String key = (String) this.parameters.get(traverser, T.key, () -> {
             throw new IllegalStateException("The AddPropertyStep does not have a provided key: " + this);
-        });
+        }).get(0);
         final Object value = this.parameters.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 Element element = traverser.get();

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/be8522b1/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
index 7acc240..01206d9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/Parameters.java
@@ -26,6 +26,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil;
 import java.io.Serializable;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -39,7 +40,7 @@ public final class Parameters implements Cloneable, Serializable {
 
     private static final Object[] EMPTY_ARRAY = new Object[0];
 
-    private Map<Object, Object> parameters = new HashMap<>();
+    private Map<Object, List<Object>> parameters = new HashMap<>();
 
     public boolean contains(final Object key) {
         return this.parameters.containsKey(key);
@@ -49,24 +50,32 @@ public final class Parameters implements Cloneable, Serializable {
         this.set(newKey, this.parameters.remove(oldKey));
     }
 
-    public <S, E> E get(final Traverser.Admin<S> traverser, final Object key, final Supplier<E> defaultValue) {
-        final Object object = parameters.get(key);
-        return null == object ? defaultValue.get() : object instanceof Traversal.Admin ? TraversalUtil.apply(traverser, (Traversal.Admin<S, E>) object) : (E) object;
+    public <S, E> List<E> get(final Traverser.Admin<S> traverser, final Object key, final Supplier<E> defaultValue) {
+        final List<E> values = (List<E>) this.parameters.get(key);
+        if (null == values) return Collections.singletonList(defaultValue.get());
+        final List<E> result = new ArrayList<>();
+        for (final Object value : values) {
+            result.add(value instanceof Traversal.Admin ? TraversalUtil.apply(traverser, (Traversal.Admin<S, E>) value) : (E) value);
+        }
+        return result;
     }
 
-    public <E> E get(final Object key, final Supplier<E> defaultValue) {
-        final Object object = parameters.get(key);
-        return null == object ? defaultValue.get() : (E) object;
+    public <E> List<E> get(final Object key, final Supplier<E> defaultValue) {
+        final List<E> list = (List<E>) this.parameters.get(key);
+        return (null == list) ? Collections.singletonList(defaultValue.get()) : list;
+
     }
 
     public <S> Object[] getKeyValues(final Traverser.Admin<S> traverser, final Object... exceptKeys) {
         if (this.parameters.size() == 0) return EMPTY_ARRAY;
         final List<Object> exceptions = Arrays.asList(exceptKeys);
         final List<Object> keyValues = new ArrayList<>();
-        for (final Map.Entry<Object, Object> keyValue : this.parameters.entrySet()) {
-            if (!exceptions.contains(keyValue.getKey())) {
-                keyValues.add(keyValue.getKey() instanceof Traversal.Admin ? TraversalUtil.apply(traverser, (Traversal.Admin<S, ?>) keyValue.getKey()) : keyValue.getKey());
-                keyValues.add(keyValue.getValue() instanceof Traversal.Admin ? TraversalUtil.apply(traverser, (Traversal.Admin<S, ?>) keyValue.getValue()) : keyValue.getValue());
+        for (final Map.Entry<Object, List<Object>> entry : this.parameters.entrySet()) {
+            if (!exceptions.contains(entry.getKey())) {
+                for (final Object value : entry.getValue()) {
+                    keyValues.add(entry.getKey() instanceof Traversal.Admin ? TraversalUtil.apply(traverser, (Traversal.Admin<S, ?>) entry.getKey()) : entry.getKey());
+                    keyValues.add(value instanceof Traversal.Admin ? TraversalUtil.apply(traverser, (Traversal.Admin<S, ?>) value) : value);
+                }
             }
         }
         return keyValues.toArray(new Object[keyValues.size()]);
@@ -75,29 +84,42 @@ public final class Parameters implements Cloneable, Serializable {
     public void set(final Object... keyValues) {
         for (int i = 0; i < keyValues.length; i = i + 2) {
             if (keyValues[i + 1] != null) {
-                this.parameters.put(keyValues[i], keyValues[i + 1]);
+                List<Object> values = this.parameters.get(keyValues[i]);
+                if (null == values) {
+                    values = new ArrayList<>();
+                    values.add(keyValues[i + 1]);
+                    this.parameters.put(keyValues[i], values);
+                } else {
+                    values.add(keyValues[i + 1]);
+                }
             }
         }
     }
 
     public void integrateTraversals(final TraversalParent step) {
-        for (final Object value : this.parameters.values()) {
-            if (value instanceof Traversal.Admin) {
-                step.integrateChild((Traversal.Admin) value);
+        for (final List<Object> values : this.parameters.values()) {
+            for (final Object object : values) {
+                if (object instanceof Traversal.Admin) {
+                    step.integrateChild((Traversal.Admin) object);
+                }
             }
         }
     }
 
     public <S, E> List<Traversal.Admin<S, E>> getTraversals() {
-        return (List) this.parameters.values().stream().filter(t -> t instanceof Traversal.Admin).collect(Collectors.toList());
+        return (List) this.parameters.values().stream().flatMap(List::stream).filter(t -> t instanceof Traversal.Admin).collect(Collectors.toList());
     }
 
     public Parameters clone() {
         try {
             final Parameters clone = (Parameters) super.clone();
             clone.parameters = new HashMap<>();
-            for (final Map.Entry<Object, Object> entry : this.parameters.entrySet()) {
-                clone.parameters.put(entry.getKey(), entry.getValue() instanceof Traversal ? ((Traversal.Admin) entry.getValue()).clone() : entry.getValue());
+            for (final Map.Entry<Object, List<Object>> entry : this.parameters.entrySet()) {
+                final List<Object> values = new ArrayList<>();
+                for (final Object value : entry.getValue()) {
+                    values.add(value instanceof Traversal.Admin ? ((Traversal.Admin) value).clone() : value);
+                }
+                clone.parameters.put(entry.getKey() instanceof Traversal.Admin ? ((Traversal.Admin) entry.getKey()).clone() : entry.getKey(), values);
             }
             return clone;
         } catch (final CloneNotSupportedException e) {
@@ -106,7 +128,14 @@ public final class Parameters implements Cloneable, Serializable {
     }
 
     public int hashCode() {
-        return this.parameters.hashCode();
+        int result = 1;
+        for (final Map.Entry<Object, List<Object>> entry : this.parameters.entrySet()) {
+            result ^= entry.getKey().hashCode();
+            for (final Object value : entry.getValue()) {
+                result ^= value.hashCode();
+            }
+        }
+        return result;
     }
 
     public String toString() {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/be8522b1/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTraverseTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTraverseTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTraverseTest.java
index 29d6dc0..13b6ca6 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTraverseTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/PartitionStrategyTraverseTest.java
@@ -108,19 +108,19 @@ public class PartitionStrategyTraverseTest {
                 final List<AddEdgeStep> addEdgeSteps = TraversalHelper.getStepsOfAssignableClass(AddEdgeStep.class, traversal.asAdmin());
                 assertEquals(1, addEdgeSteps.size());
                 addEdgeSteps.forEach(s -> {
-                    assertEquals("test", s.getParameters().get(T.label, () -> Edge.DEFAULT_LABEL));
-                    assertEquals("a", s.getParameters().get("p", null));
+                    assertEquals("test", s.getParameters().get(T.label, () -> Edge.DEFAULT_LABEL).get(0));
+                    assertEquals("a", s.getParameters().get("p", null).get(0));
                 });
             } else if (TraversalHelper.hasStepOfAssignableClass(AddVertexStep.class, traversal.asAdmin())) {
                 strategy.apply(traversal.asAdmin());
                 final List<AddVertexStep> addVertexSteps = TraversalHelper.getStepsOfAssignableClass(AddVertexStep.class, traversal.asAdmin());
                 assertEquals(1, addVertexSteps.size());
-                addVertexSteps.forEach(s -> assertEquals("a", s.getParameters().get("p", null)));
+                addVertexSteps.forEach(s -> assertEquals("a", s.getParameters().get("p", null).get(0)));
             } else if (TraversalHelper.hasStepOfAssignableClass(AddVertexStartStep.class, traversal.asAdmin())) {
                 strategy.apply(traversal.asAdmin());
                 final List<AddVertexStartStep> addVertexSteps = TraversalHelper.getStepsOfAssignableClass(AddVertexStartStep.class, traversal.asAdmin());
                 assertEquals(1, addVertexSteps.size());
-                addVertexSteps.forEach(s -> assertEquals("a", s.getParameters().get("p", null)));
+                addVertexSteps.forEach(s -> assertEquals("a", s.getParameters().get("p", null).get(0)));
             } else
                 fail("This test should not be marked as having a mutating step or there is something else amiss.");
         } else {

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/be8522b1/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
index 7ec2866..b42f4ce 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyAddVertexTest.groovy
@@ -51,6 +51,16 @@ public abstract class GroovyAddVertexTest {
             TraversalScriptHelper.compute("g.V.has('name', 'marko').property('friendWeight', outE('knows').weight.sum(), 'acl', 'private')", g)
         }
 
+        @Override
+        public Traversal<Vertex, Vertex> get_g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X() {
+            TraversalScriptHelper.compute("g.addV('animal').property('name', 'mateo').property('name', 'gateo').property('name', 'cateo').property('age', 5)", g)
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX() {
+            TraversalScriptHelper.compute("g.V.addV('animal').property('name', values('name')).property('name', 'an animal').property(values('name'), label())", g)
+        }
+
         ///////// DEPRECATED BELOW
 
         @Override

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/be8522b1/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
index 4019995..131305a 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/AddVertexTest.java
@@ -31,9 +31,10 @@ import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
+import java.util.List;
+
 import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.*;
 
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
@@ -49,6 +50,10 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
 
     public abstract Traversal<Vertex, Vertex> get_g_V_hasXname_markoX_propertyXfriendWeight_outEXknowsX_weight_sum__acl_privateX();
 
+    public abstract Traversal<Vertex, Vertex> get_g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X();
+
+    public abstract Traversal<Vertex, Vertex> get_g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX();
+
     // 3.0.0 DEPRECATIONS
     @Deprecated
     public abstract Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X();
@@ -123,6 +128,58 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
         assertEquals(1, IteratorUtils.count(marko.property("friendWeight").properties()));
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
+    public void g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X() {
+        final Traversal<Vertex, Vertex> traversal = get_g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X();
+        printTraversalForm(traversal);
+        final Vertex mateo = traversal.next();
+        assertFalse(traversal.hasNext());
+        assertEquals("animal", mateo.label());
+        assertEquals(3, IteratorUtils.count(mateo.properties("name")));
+        mateo.values("name").forEachRemaining(name -> {
+            assertTrue(name.equals("mateo") || name.equals("cateo") || name.equals("gateo"));
+        });
+        assertEquals(5, ((Integer) mateo.value("age")).intValue());
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_PROPERTY)
+    @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_MULTI_PROPERTIES)
+    public void xxx() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX();
+        printTraversalForm(traversal);
+        while (traversal.hasNext()) {
+            final Vertex vertex = traversal.next();
+            assertEquals("animal", vertex.label());
+            assertEquals(2, IteratorUtils.count(vertex.properties("name")));
+            List<String> names = IteratorUtils.asList(vertex.values("name"));
+            assertEquals(2, names.size());
+            assertTrue(names.contains("an animal"));
+            assertTrue(names.contains("marko") || names.contains("vadas") || names.contains("josh") || names.contains("lop") || names.contains("ripple") || names.contains("peter"));
+            if (names.contains("marko")) {
+                assertEquals("person", vertex.value("marko"));
+            } else if (names.contains("vadas")) {
+                assertEquals("person", vertex.value("vadas"));
+            } else if (names.contains("josh")) {
+                assertEquals("person", vertex.value("josh"));
+            } else if (names.contains("ripple")) {
+                assertEquals("software", vertex.value("ripple"));
+            } else if (names.contains("lop")) {
+                assertEquals("software", vertex.value("lop"));
+            } else if (names.contains("peter")) {
+                assertEquals("person", vertex.value("peter"));
+            } else {
+                throw new IllegalStateException("This state should not have been reached");
+            }
+        }
+    }
+
     /////
 
     @Test
@@ -183,6 +240,16 @@ public abstract class AddVertexTest extends AbstractGremlinTest {
         }
 
         @Override
+        public Traversal<Vertex, Vertex> get_g_addVXanimalX_propertyXname_mateoX_propertyXname_gateoX_propertyXname_cateoX_propertyXage_5X() {
+            return g.addV("animal").property("name", "mateo").property("name", "gateo").property("name", "cateo").property("age", 5);
+        }
+
+        @Override
+        public Traversal<Vertex, Vertex> get_g_V_addVXanimalX_propertyXname_valuesXnameXX_propertyXname_an_animalX_propertyXvaluesXnameX_labelX() {
+            return g.V().addV("animal").property("name", __.values("name")).property("name", "an animal").property(__.values("name"), __.label());
+        }
+
+        @Override
         public Traversal<Vertex, Vertex> get_g_V_addVXlabel_animal_age_0X() {
             return g.V().addV(T.label, "animal", "age", 0);
         }