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 2015/06/19 02:45:34 UTC

incubator-tinkerpop git commit: HadoopGraph OPT_OUT bug in Giraph integration tests fixed. Added a gnarly nested match()-step test to identify and ultimately fix a bug I reailzed last night as I was falling asleep.

Repository: incubator-tinkerpop
Updated Branches:
  refs/heads/master 62ff43da3 -> 999f55f33


HadoopGraph OPT_OUT bug in Giraph integration tests fixed. Added a gnarly nested match()-step test to identify and ultimately fix a bug I reailzed last night as I was falling asleep.


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

Branch: refs/heads/master
Commit: 999f55f33024a86c2ce7134ada295ec346328833
Parents: 62ff43d
Author: Marko A. Rodriguez <ok...@gmail.com>
Authored: Thu Jun 18 18:45:29 2015 -0600
Committer: Marko A. Rodriguez <ok...@gmail.com>
Committed: Thu Jun 18 18:45:29 2015 -0600

----------------------------------------------------------------------
 .../process/traversal/step/map/MatchStep.java   | 15 ++++++-----
 .../traversal/step/map/GroovyMatchTest.groovy   | 19 ++++++++++++++
 .../process/traversal/step/map/MatchTest.java   | 26 ++++++++++++++++++++
 .../gremlin/hadoop/structure/HadoopGraph.java   |  2 +-
 4 files changed, 55 insertions(+), 7 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/999f55f3/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
----------------------------------------------------------------------
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
index 31196b6..218a087 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchStep.java
@@ -97,7 +97,7 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
         // START STEP to XMatchStep OR XMatchStartStep
         final Step<?, ?> startStep = conjunctionTraversal.getStartStep();
         if (startStep instanceof ConjunctionStep) {
-            final MatchStep matchStep = new MatchStep(conjunctionTraversal, this.startKey,
+            final MatchStep matchStep = new MatchStep(conjunctionTraversal, null,
                     startStep instanceof AndStep ? MatchStep.Conjunction.AND : MatchStep.Conjunction.OR,
                     ((ConjunctionStep<?>) startStep).getLocalChildren().toArray(new Traversal[((ConjunctionStep<?>) startStep).getLocalChildren().size()]));
             TraversalHelper.replaceStep(startStep, matchStep, conjunctionTraversal);
@@ -250,11 +250,13 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
                 return IteratorUtils.of(traverser.split(this.getBindings(traverser), this));
 
             if (this.conjunction == Conjunction.AND) {
-                this.getMatchAlgorithm().apply(traverser).addStart(traverser); // determine which sub-pattern the traverser should try next
-            } else {
+                final Traversal.Admin<Object, Object> conjunctionTraversal = this.getMatchAlgorithm().apply(traverser); // determine which sub-pattern the traverser should try next
+                traverser.path().addLabel(conjunctionTraversal.getStartStep().getId()); // so the and() path is no longer taken once returned
+                conjunctionTraversal.addStart(traverser); // determine which sub-pattern the traverser should try next
+            } else {  // OR
                 for (final Traversal.Admin<?, ?> conjunctionTraversal : this.conjunctionTraversals) {
                     final Traverser split = traverser.split();
-                    split.path().addLabel(conjunctionTraversal.getParent().asStep().getId());
+                    split.path().addLabel(conjunctionTraversal.getParent().asStep().getId());  // so the or() path is no longer taken once returned
                     conjunctionTraversal.addStart(split);
                 }
             }
@@ -271,13 +273,14 @@ public final class MatchStep<S, E> extends ComputerAwareStep<S, Map<String, E>>
 
         if (this.conjunction == Conjunction.AND) {
             final Traversal.Admin<Object, Object> conjunctionTraversal = this.getMatchAlgorithm().apply(traverser); // determine which sub-pattern the traverser should try next
+            traverser.path().addLabel(conjunctionTraversal.getStartStep().getId()); // so the and() path is no longer taken once returned
             traverser.setStepId(conjunctionTraversal.getStartStep().getId()); // go down the traversal match sub-pattern
             return IteratorUtils.of(traverser);
-        } else {
+        } else { // OR
             final List<Traverser<Map<String, E>>> traversers = new ArrayList<>();
             this.conjunctionTraversals.forEach(conjunctionTraversal -> {
                 final Traverser.Admin split = traverser.split();
-                split.path().addLabel(conjunctionTraversal.getParent().asStep().getId());
+                split.path().addLabel(conjunctionTraversal.getParent().asStep().getId());  // so the or() path is no longer taken once returned
                 split.setStepId(conjunctionTraversal.getStartStep().getId());
                 traversers.add(split);
             });

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/999f55f3/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
----------------------------------------------------------------------
diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
index 09cc6e8..c8c5b79 100644
--- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
+++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/map/GroovyMatchTest.groovy
@@ -22,6 +22,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal
 import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalScriptHelper
 import org.apache.tinkerpop.gremlin.structure.Vertex
 
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.and
+import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.and
+
 /**
  * @author Marko A. Rodriguez (http://markorodriguez.com)
  */
@@ -247,6 +250,22 @@ public abstract class GroovyMatchTest {
                     where('d', neq('a')))
             """, g)
         }
+
+        @Override
+        public Traversal<Vertex,Map<String,Object>> get_g_V_matchXa__a_knows_b__andXa_created_c__b_created_c__andXb_created_count_d__a_knows_count_dXXX() {
+            TraversalScriptHelper.compute("""
+                g.V.match('a',
+                    __.as('a').out('knows').as('b'),
+                    and(
+                            __.as('a').out('created').as('c'),
+                            __.as('b').out('created').as('c'),
+                            and(
+                                    __.as('b').out('created').count.as('d'),
+                                    __.as('a').out('knows').count.as('d')
+                            )
+                    ))
+            """,g)
+        }
     }
 
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/999f55f3/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
----------------------------------------------------------------------
diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
index 40dfb6b..79a59b6 100644
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MatchTest.java
@@ -110,6 +110,9 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
     // pulls out has container for index lookup and uses an where() with startKey and predicate
     public abstract Traversal<Vertex,Map<String,Vertex>> get_g_V_matchXa__a_hasXname_GarciaX__a_0writtenBy_b__b_followedBy_c__c_writtenBy_d__whereXd_neqXaXXX();
 
+    // nested and with oddly dependent end steps
+    public abstract Traversal<Vertex,Map<String,Object>> get_g_V_matchXa__a_knows_b__andXa_created_c__b_created_c__andXb_created_count_d__a_knows_count_dXXX();
+
     @Test
     @LoadGraphWith(MODERN)
     public void g_V_matchXa_out_bX() throws Exception {
@@ -357,6 +360,15 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
                 "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph,"CRYPTICAL ENVELOPMENT"), "c", convertToVertex(graph,"DRUMS"), "d", convertToVertex(graph,"Grateful_Dead")), traversal);
     }
 
+    @Test
+    @LoadGraphWith(MODERN)
+    public void g_V_matchXa__a_knows_b__andXa_created_c__b_created_c__andXb_created_count_d__a_knows_count_dXXX() {
+        final Traversal<Vertex,Map<String,Object>> traversal = get_g_V_matchXa__a_knows_b__andXa_created_c__b_created_c__andXb_created_count_d__a_knows_count_dXXX();
+        printTraversalForm(traversal);
+        checkResults(makeMapList(4,
+                "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph,"josh"), "c", convertToVertex(graph,"lop"), "d", 2l),traversal);
+    }
+
     public static class Traversals extends MatchTest {
         @Override
         public Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_out_bX() {
@@ -534,5 +546,19 @@ public abstract class MatchTest extends AbstractGremlinProcessTest {
                     as("c").out("writtenBy").as("d"),
                     where("d", P.neq("a")));
         }
+
+        @Override
+        public Traversal<Vertex,Map<String,Object>> get_g_V_matchXa__a_knows_b__andXa_created_c__b_created_c__andXb_created_count_d__a_knows_count_dXXX() {
+          return g.V().match("a",
+                    as("a").out("knows").as("b"),
+                    and(
+                            as("a").out("created").as("c"),
+                            as("b").out("created").as("c"),
+                            and(
+                                as("b").out("created").count().as("d"),
+                                as("a").out("knows").count().as("d")
+                            )
+                    ));
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/999f55f3/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
----------------------------------------------------------------------
diff --git a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
index 4ffa559..2971e1d 100644
--- a/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
+++ b/hadoop-gremlin/src/main/java/org/apache/tinkerpop/gremlin/hadoop/structure/HadoopGraph.java
@@ -73,7 +73,7 @@ import java.util.stream.Stream;
         method = "g_V_matchXa_created_b__c_created_bX_selectXnameX",
         reason = "Giraph does a hard kill on failure and stops threads which stops test cases. Exception handling semantics are correct though.")
 @Graph.OptOut(
-        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.GroovyMatchTest$Traversals",
+        test = "org.apache.tinkerpop.gremlin.process.traversal.step.map.MatchTest$Traversals",
         method = "g_V_out_out_hasXname_rippleX_matchXb_created_a__c_knows_bX_selectXcX_outXknowsX_name",
         reason = "Giraph does a hard kill on failure and stops threads which stops test cases. Exception handling semantics are correct though.")
 @Graph.OptOut(