MatchStep should be treated like RepeatStep in TraversalHelper.isLocalStarGraph(). The reason being, you don't know the order of the patterns and thus, if the state changes at least once, then assume it can change given another ordering. Fixed #TINKERPOP-1323. Added a failing test case from the mailing list to verify correct behavior. CTR.
Project: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/commit/9c56fa3a Tree: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/tree/9c56fa3a Diff: http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/diff/9c56fa3a Branch: refs/heads/tp31 Commit: 9c56fa3a93ff1979373c681337c335de396ad916 Parents: 9079366 Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Thu Jun 2 13:57:47 2016 -0600 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Thu Jun 2 13:57:47 2016 -0600 ---------------------------------------------------------------------- .../process/traversal/util/TraversalHelper.java | 2 +- .../step/branch/GroovyLocalTest.groovy | 8 +++++ .../traversal/step/branch/LocalTest.java | 38 +++++++++++++++++--- 3 files changed, 43 insertions(+), 5 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9c56fa3a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java index 9a98e54..67e96b7 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/TraversalHelper.java @@ -129,7 +129,7 @@ public final class TraversalHelper { state = 'u'; else if (states.contains('e')) state = 'e'; - if (state != currState && step instanceof RepeatStep) + if (state != currState && (step instanceof RepeatStep || step instanceof MatchStep)) return 'x'; } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9c56fa3a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy ---------------------------------------------------------------------- diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy index 5e594cb..0e2ef3e 100644 --- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy +++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/branch/GroovyLocalTest.groovy @@ -79,5 +79,13 @@ public abstract class GroovyLocalTest { public Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name() { new ScriptTraversal<>(g, "gremlin-groovy", "g.V().local(__.inE('knows').limit(2).outV).name"); } + + @Override + public Traversal<Vertex, Map<String, String>> get_g_V_localXmatchXproject__created_person__person_name_nameX_selectXname_projectX_by_byXnameX() { + new ScriptTraversal<>(g, "gremlin-groovy", """g.V.local(match( + __.as('project').in('created').as('person'), + __.as('person').values('name').as('name'))). + select('name', 'project').by.by('name')""") + } } } http://git-wip-us.apache.org/repos/asf/incubator-tinkerpop/blob/9c56fa3a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java index f1480fb..c202a9c 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/branch/LocalTest.java @@ -21,9 +21,10 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.branch; import org.apache.tinkerpop.gremlin.LoadGraphWith; import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest; import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner; +import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; +import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.structure.Edge; -import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.apache.tinkerpop.gremlin.structure.T; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Test; @@ -34,8 +35,16 @@ import java.util.Map; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; -import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*; -import static org.junit.Assert.*; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.bothE; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.inE; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.outE; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.properties; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; /** @@ -64,6 +73,8 @@ public abstract class LocalTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, String> get_g_V_localXinEXknowsX_limitX2XX_outV_name(); + public abstract Traversal<Vertex, Map<String, String>> get_g_V_localXmatchXproject__created_person__person_name_nameX_selectXname_projectX_by_byXnameX(); + @Test @LoadGraphWith(CREW) public void g_V_localXpropertiesXlocationX_order_byXvalueX_limitX2XX_value() { @@ -197,6 +208,19 @@ public abstract class LocalTest extends AbstractGremlinProcessTest { assertEquals(5, counter); } + @Test + @LoadGraphWith(MODERN) + public void g_V_localXmatchXproject__created_person__person_name_nameX_selectXname_projectX_by_byXnameX() { + final Traversal<Vertex, Map<String, String>> traversal = get_g_V_localXmatchXproject__created_person__person_name_nameX_selectXname_projectX_by_byXnameX(); + printTraversalForm(traversal); + checkResults(makeMapList(2, + "name", "marko", "project", "lop", + "name", "josh", "project", "lop", + "name", "peter", "project", "lop", + "name", "josh", "project", "ripple"), traversal); + assertFalse(traversal.hasNext()); + } + public static class Traversals extends LocalTest { @Override @@ -249,6 +273,12 @@ public abstract class LocalTest extends AbstractGremlinProcessTest { return g.V().local(inE("knows").limit(2)).outV().values("name"); } - + @Override + public Traversal<Vertex, Map<String, String>> get_g_V_localXmatchXproject__created_person__person_name_nameX_selectXname_projectX_by_byXnameX() { + return g.V().local(__.match( + as("project").in("created").as("person"), + as("person").values("name").as("name"))) + .<String>select("name", "project").by().by("name"); + } } }