You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by ok...@apache.org on 2016/03/24 01:47:07 UTC

incubator-tinkerpop git commit: found a bug in ComputerVerificationStrategy. Created a new SelectTest that exposed it for OLAP. Led to realizing a TraversalParent bug in TraversalVertexProgramStep. Added TraversalParentStep to ensure isLocalChild() and i

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/TINKERPOP-1231 f7b3c03b1 -> 9bd84b75e


found a bug in ComputerVerificationStrategy. Created a new SelectTest that exposed it for OLAP. Led to realizing a TraversalParent bug in TraversalVertexProgramStep. Added TraversalParentStep to ensure isLocalChild() and isGlobalChild() behave as desired.


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

Branch: refs/heads/TINKERPOP-1231
Commit: 9bd84b75e4b79217feab2fad5e5a65863b5ac0a6
Parents: f7b3c03
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Wed Mar 23 18:46:58 2016 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Wed Mar 23 18:46:58 2016 -0600

----------------------------------------------------------------------
 .../step/map/TraversalVertexProgramStep.java    | 10 +++
 .../process/traversal/step/TraversalParent.java |  1 +
 .../process/traversal/step/util/EmptyStep.java  | 10 +++
 .../ComputerVerificationStrategy.java           |  9 ++-
 .../traversal/step/TraversalParentTest.java     | 79 ++++++++++++++++++++
 .../traversal/step/map/GroovySelectTest.groovy  |  5 ++
 .../process/traversal/step/map/SelectTest.java  | 23 ++++++
 7 files changed, 135 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9bd84b75/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
index 6a0191b..a81fbaf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/computer/traversal/step/map/TraversalVertexProgramStep.java
@@ -54,6 +54,16 @@ public final class TraversalVertexProgramStep extends VertexProgramStep implemen
     }
 
     @Override
+    public boolean isGlobalChild(final Traversal.Admin<?, ?> childTraversal) {
+        return true;
+    }
+
+    @Override
+    public boolean isLocalChild(final Traversal.Admin<?, ?> childTraversal) {
+        return false;
+    }
+
+    @Override
     public String toString() {
         return StringFactory.stepString(this, this.computerTraversal.get());
     }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9bd84b75/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
index 52e87a8..4fb5e27 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParent.java
@@ -20,6 +20,7 @@ package org.apache.tinkerpop.gremlin.process.traversal.step;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Step;
 import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.step.util.EmptyStep;
 import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement;
 
 import java.util.Collections;

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9bd84b75/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
index 8e699f1..4741fb9 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/util/EmptyStep.java
@@ -144,4 +144,14 @@ public final class EmptyStep<S, E> implements Step<S, E>, TraversalParent {
     public Set<TraverserRequirement> getRequirements() {
         return Collections.emptySet();
     }
+
+    @Override
+    public boolean isGlobalChild(final Traversal.Admin<?, ?> childTraversal) {
+        return true;
+    }
+
+    @Override
+    public boolean isLocalChild(final Traversal.Admin<?, ?> childTraversal) {
+        return false;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9bd84b75/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
index a43ea72..b5af063 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/verification/ComputerVerificationStrategy.java
@@ -62,9 +62,11 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
     @Override
     public void apply(final Traversal.Admin<?, ?> traversal) {
 
-        if (!TraversalHelper.onGraphComputer(traversal) || traversal.getParent().isLocalChild(traversal))  // only process global children as local children are standard semantics
+        if (!TraversalHelper.onGraphComputer(traversal))
             return;
 
+        final boolean globalChild = traversal.getParent().isGlobalChild(traversal);
+
         if (traversal.getParent() instanceof TraversalVertexProgramStep) {
             if (TraversalHelper.getStepsOfAssignableClassRecursively(GraphStep.class, traversal).size() > 1)
                 throw new VerificationException("Mid-traversal V()/E() is currently not supported on GraphComputer", traversal);
@@ -73,8 +75,11 @@ public final class ComputerVerificationStrategy extends AbstractTraversalStrateg
         }
 
         for (final Step<?, ?> step : traversal.getSteps()) {
-            if (step instanceof GraphComputing)
+
+            // only global children are graph computing
+            if (globalChild && step instanceof GraphComputing)
                 ((GraphComputing) step).onGraphComputer();
+
             // you can not traverse past the local star graph with localChildren (e.g. by()-modulators).
             if (step instanceof TraversalParent) {
                 final Optional<Traversal.Admin<Object, Object>> traversalOptional = ((TraversalParent) step).getLocalChildren().stream()

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9bd84b75/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParentTest.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParentTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParentTest.java
new file mode 100644
index 0000000..6248fcb
--- /dev/null
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/TraversalParentTest.java
@@ -0,0 +1,79 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.tinkerpop.gremlin.process.traversal.step;
+
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.LocalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.RepeatStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.branch.UnionStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.TraversalFilterStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.filter.WhereTraversalStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalFlatMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.step.map.TraversalMapStep;
+import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversal;
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+
+/**
+ * @author Marko A. Rodriguez (http://markorodriguez.com)
+ */
+public class TraversalParentTest {
+
+    @Test
+    public void shouldIdentityLocalChildren() {
+        final Traversal.Admin<?, ?> localChild = __.as("x").select("a", "b").by("name").asAdmin();
+        TraversalParent parent = new LocalStep<>(new DefaultTraversal(), localChild);
+        assertTrue(parent.isLocalChild(localChild));
+        assertFalse(parent.isGlobalChild(localChild));
+        ///
+        parent = new WhereTraversalStep<>(new DefaultTraversal(), localChild);
+        assertTrue(parent.isLocalChild(localChild));
+        assertFalse(parent.isGlobalChild(localChild));
+        ///
+        parent = new TraversalFilterStep<>(new DefaultTraversal(), localChild);
+        assertTrue(parent.isLocalChild(localChild));
+        assertFalse(parent.isGlobalChild(localChild));
+        ///
+        parent = new TraversalMapStep<>(new DefaultTraversal(), localChild);
+        assertTrue(parent.isLocalChild(localChild));
+        assertFalse(parent.isGlobalChild(localChild));
+        ///
+        parent = new TraversalFlatMapStep<>(new DefaultTraversal(), localChild);
+        assertTrue(parent.isLocalChild(localChild));
+        assertFalse(parent.isGlobalChild(localChild));
+    }
+
+    @Test
+    public void shouldIdentityGlobalChildren() {
+        final Traversal.Admin<?, ?> globalChild = __.select("a", "b").by("name").asAdmin();
+        TraversalParent parent = new RepeatStep<>(new DefaultTraversal());
+        ((RepeatStep) parent).setRepeatTraversal(globalChild);
+        assertFalse(parent.isLocalChild(globalChild));
+        assertTrue(parent.isGlobalChild(globalChild));
+        ///
+        parent = new UnionStep<>(new DefaultTraversal(), globalChild);
+        assertFalse(parent.isLocalChild(globalChild));
+        assertTrue(parent.isGlobalChild(globalChild));
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9bd84b75/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
index 9aec131..341f22e 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovySelectTest.groovy
@@ -233,5 +233,10 @@ public abstract class GroovySelectTest {
         public Traversal<Vertex, Collection<Set<String>>> get_g_V_asXa_bX_out_asXcX_path_selectXkeysX() {
             new ScriptTraversal<>(g, "gremlin-groovy", "g.V.as('a','b').out.as('c').path.select(keys)")
         }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXknowsX_asXbX_localXselectXa_bX_byXnameXX() {
+            new ScriptTraversal<>(g, "gremlin-groovy", "g.V.as('a').out('knows').as('b').local(select('a', 'b').by('name')")
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9bd84b75/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
index 34b6a43..f75b0f4 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/SelectTest.java
@@ -139,6 +139,8 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Collection<Set<String>>> get_g_V_asXa_bX_out_asXcX_path_selectXkeysX();
 
+    public abstract Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXknowsX_asXbX_localXselectXa_bX_byXnameXX();
+
     // Useful for permuting Pop use cases
     protected final static List<Pop> POPS = Arrays.asList(null, Pop.first, Pop.last, Pop.all);
 
@@ -628,6 +630,22 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
         assertFalse(traversal.hasNext());
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_asXaX_outXknowsX_asXbX_localXselectXa_bX_byXnameXX() {
+        final Traversal<Vertex, Map<String, String>> traversal = get_g_V_asXaX_outXknowsX_asXbX_localXselectXa_bX_byXnameXX();
+        final Map<String, String> map = traversal.next();
+        assertTrue(traversal.hasNext());
+        if (map.get("b").equals("josh")) {
+            assertEquals("marko", map.get("a"));
+            assertEquals("vadas", traversal.next().get("b"));
+        } else {
+            assertEquals("marko", map.get("a"));
+            assertEquals("josh", traversal.next().get("b"));
+        }
+        assertFalse(traversal.hasNext());
+    }
+
     public static class Traversals extends SelectTest {
         @Override
         public Traversal<Vertex, Map<String, Vertex>> get_g_VX1X_asXaX_outXknowsX_asXbX_selectXa_bX(final Object v1Id) {
@@ -823,5 +841,10 @@ public abstract class SelectTest extends AbstractGremlinProcessTest {
         public Traversal<Vertex, Collection<Set<String>>> get_g_V_asXa_bX_out_asXcX_path_selectXkeysX() {
             return g.V().as("a", "b").out().as("c").path().select(keys);
         }
+
+        @Override
+        public Traversal<Vertex, Map<String, String>> get_g_V_asXaX_outXknowsX_asXbX_localXselectXa_bX_byXnameXX() {
+            return g.V().as("a").out("knows").as("b").local(__.<Vertex, String>select("a", "b").by("name"));
+        }
     }
 }