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"));
+ }
}
}