fixed a bug in NotStep where child requirements were not being analyzed. Added a test to MatchTest to verify proper functioning. CTR.
Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/c7f42d82 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/c7f42d82 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/c7f42d82 Branch: refs/heads/TINKERPOP-1458 Commit: c7f42d827414ea7dced0549c02bbc37f40666849 Parents: 85ec40b Author: Marko A. Rodriguez <[email protected]> Authored: Mon Oct 3 10:46:04 2016 -0600 Committer: Marko A. Rodriguez <[email protected]> Committed: Mon Oct 3 10:46:04 2016 -0600 ---------------------------------------------------------------------- CHANGELOG.asciidoc | 1 + .../process/traversal/step/filter/NotStep.java | 7 +++ .../traversal/step/map/GroovyMatchTest.groovy | 10 ++++ .../process/traversal/step/map/MatchTest.java | 63 ++++++++++++++------ 4 files changed, 62 insertions(+), 19 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7f42d82/CHANGELOG.asciidoc ---------------------------------------------------------------------- diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index d0aa8e8..cf89a5c 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.1.5 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Fixed a bug in `NotStep` where child requirements were not being analyzed. * Fixed output redirection and potential memory leak in `GremlinGroovyScriptEngine`. * Corrected naming of `g_withPath_V_asXaX_out_out_mapXa_name_it_nameX` and `g_withPath_V_asXaX_out_mapXa_nameX` in `MapTest`. * Improved session cleanup when a close is triggered by the client. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7f42d82/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java ---------------------------------------------------------------------- diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java index 56ad497..e0f7038 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/NotStep.java @@ -21,11 +21,13 @@ package org.apache.tinkerpop.gremlin.process.traversal.step.filter; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent; +import org.apache.tinkerpop.gremlin.process.traversal.traverser.TraverserRequirement; import org.apache.tinkerpop.gremlin.process.traversal.util.TraversalUtil; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import java.util.Collections; import java.util.List; +import java.util.Set; /** * @author Marko A. Rodriguez (http://markorodriguez.com) @@ -65,4 +67,9 @@ public final class NotStep<S> extends FilterStep<S> implements TraversalParent { public int hashCode() { return super.hashCode() ^ this.notTraversal.hashCode(); } + + @Override + public Set<TraverserRequirement> getRequirements() { + return this.getSelfAndChildRequirements(); + } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7f42d82/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 c2f9d43..b3d8ea9 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 @@ -338,5 +338,15 @@ public abstract class GroovyMatchTest { __.as('b').both.as('c')).dedup('a','b').by(label) """, g) } + + @Override + public Traversal<Vertex, String> get_g_V_notXmatchXa_age_b__a_name_cX_whereXb_eqXcXX_selectXaXX_name() { + TraversalScriptHelper.compute(""" + g.V.not(match( + __.as('a').age.as('b'), + __.as('a').name.as('c')). + where('b', eq('c')).select('a')).name + """, g) + } } } \ No newline at end of file http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/c7f42d82/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 5d2ed95..46b8e59 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 @@ -43,8 +43,17 @@ import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.GRATEFUL; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; import static org.apache.tinkerpop.gremlin.process.traversal.P.eq; import static org.apache.tinkerpop.gremlin.process.traversal.P.neq; -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.__.and; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.as; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.match; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.not; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.or; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.out; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.repeat; +import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.where; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; /** * @author Joshua Shinavier (http://fortytwo.net) @@ -134,6 +143,9 @@ public abstract class MatchTest extends AbstractGremlinProcessTest { // distinct values with by()-modulation public abstract Traversal<Vertex, Map<String, Vertex>> get_g_V_matchXa_both_b__b_both_cX_dedupXa_bX_byXlabelX(); + // test not(match) + public abstract Traversal<Vertex, String> get_g_V_notXmatchXa_age_b__a_name_cX_whereXb_eqXcXX_selectXaXX_name(); + @Test @LoadGraphWith(MODERN) public void g_V_valueMap_matchXa_selectXnameX_bX() { @@ -144,7 +156,7 @@ public abstract class MatchTest extends AbstractGremlinProcessTest { counter++; final Map<String, Object> map = traversal.next(); assertTrue(Map.class.isAssignableFrom(map.get("a").getClass())); - final String name = ((Map<String,List<String>>) map.get("a")).get("name").get(0); + final String name = ((Map<String, List<String>>) map.get("a")).get("name").get(0); assertEquals(name, ((List<String>) map.get("b")).get(0)); } assertEquals(6, counter); @@ -156,12 +168,12 @@ public abstract class MatchTest extends AbstractGremlinProcessTest { final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_out_bX(); printTraversalForm(traversal); checkResults(makeMapList(2, - "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "lop"), - "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "josh"), - "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "vadas"), - "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "ripple"), - "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "lop"), - "a", convertToVertex(graph, "peter"), "b", convertToVertex(graph, "lop")), + "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "lop"), + "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "josh"), + "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "vadas"), + "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "ripple"), + "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "lop"), + "a", convertToVertex(graph, "peter"), "b", convertToVertex(graph, "lop")), traversal); } @@ -266,10 +278,10 @@ public abstract class MatchTest extends AbstractGremlinProcessTest { final Traversal<Vertex, Map<String, Vertex>> traversal = get_g_V_matchXa_created_b__b_0created_aX(); printTraversalForm(traversal); checkResults(makeMapList(2, - "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "lop"), - "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "lop"), - "a", convertToVertex(graph, "peter"), "b", convertToVertex(graph, "lop"), - "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "ripple")), + "a", convertToVertex(graph, "marko"), "b", convertToVertex(graph, "lop"), + "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "lop"), + "a", convertToVertex(graph, "peter"), "b", convertToVertex(graph, "lop"), + "a", convertToVertex(graph, "josh"), "b", convertToVertex(graph, "ripple")), traversal); } @@ -368,12 +380,12 @@ public abstract class MatchTest extends AbstractGremlinProcessTest { private void assertCommon(Traversal<Vertex, Map<String, Vertex>> traversal) { checkResults(makeMapList(4, - "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CREAM PUFF WAR"), "c", convertToVertex(graph, "CREAM PUFF WAR"), "d", convertToVertex(graph, "Garcia"), - "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CREAM PUFF WAR"), "c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "d", convertToVertex(graph, "Garcia"), - "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "c", convertToVertex(graph, "CREAM PUFF WAR"), "d", convertToVertex(graph, "Garcia"), - "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "d", convertToVertex(graph, "Garcia"), - "a", convertToVertex(graph, "Grateful_Dead"), "b", convertToVertex(graph, "CANT COME DOWN"), "c", convertToVertex(graph, "DOWN SO LONG"), "d", convertToVertex(graph, "Garcia"), - "a", convertToVertex(graph, "Grateful_Dead"), "b", convertToVertex(graph, "THE ONLY TIME IS NOW"), "c", convertToVertex(graph, "DOWN SO LONG"), "d", convertToVertex(graph, "Garcia")), traversal); + "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CREAM PUFF WAR"), "c", convertToVertex(graph, "CREAM PUFF WAR"), "d", convertToVertex(graph, "Garcia"), + "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CREAM PUFF WAR"), "c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "d", convertToVertex(graph, "Garcia"), + "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "c", convertToVertex(graph, "CREAM PUFF WAR"), "d", convertToVertex(graph, "Garcia"), + "a", convertToVertex(graph, "Garcia"), "b", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "c", convertToVertex(graph, "CRYPTICAL ENVELOPMENT"), "d", convertToVertex(graph, "Garcia"), + "a", convertToVertex(graph, "Grateful_Dead"), "b", convertToVertex(graph, "CANT COME DOWN"), "c", convertToVertex(graph, "DOWN SO LONG"), "d", convertToVertex(graph, "Garcia"), + "a", convertToVertex(graph, "Grateful_Dead"), "b", convertToVertex(graph, "THE ONLY TIME IS NOW"), "c", convertToVertex(graph, "DOWN SO LONG"), "d", convertToVertex(graph, "Garcia")), traversal); } @Test @@ -483,6 +495,14 @@ public abstract class MatchTest extends AbstractGremlinProcessTest { assertEquals(results.size(), counter); } + @Test + @LoadGraphWith(MODERN) + public void g_V_notXmatchXa_age_b__a_name_cX_whereXb_eqXcXX_selectXaXX_name() { + final Traversal<Vertex, String> traversal = get_g_V_notXmatchXa_age_b__a_name_cX_whereXb_eqXcXX_selectXaXX_name(); + printTraversalForm(traversal); + checkResults(Arrays.asList("marko", "peter", "josh", "vadas", "lop", "ripple"), traversal); + } + public static class GreedyMatchTraversals extends Traversals { @Before public void setupTest() { @@ -739,5 +759,10 @@ public abstract class MatchTest extends AbstractGremlinProcessTest { as("a").both().as("b"), as("b").both().as("c")).dedup("a", "b").by(T.label); } + + @Override + public Traversal<Vertex, String> get_g_V_notXmatchXa_age_b__a_name_cX_whereXb_eqXcXX_selectXaXX_name() { + return g.V().not(match(__.as("a").values("age").as("b"), __.as("a").values("name").as("c")).where("b", eq("c")).select("a")).values("name"); + } } }
