Repository: tinkerpop Updated Branches: refs/heads/master 4396aaf7c -> 43c207b8a
added hasKey() and hasValue() tests to HasTest. Removed un-tested methods in HasTest that someone wrote, but never added respective test cases for. Added more has()-examples to the 'Has Step' section of the documentation. Project: http://git-wip-us.apache.org/repos/asf/tinkerpop/repo Commit: http://git-wip-us.apache.org/repos/asf/tinkerpop/commit/6515a6f3 Tree: http://git-wip-us.apache.org/repos/asf/tinkerpop/tree/6515a6f3 Diff: http://git-wip-us.apache.org/repos/asf/tinkerpop/diff/6515a6f3 Branch: refs/heads/master Commit: 6515a6f3a5780ee3e8fb8ecbb9e4b104653d8a14 Parents: 028cb47 Author: Marko A. Rodriguez <okramma...@gmail.com> Authored: Tue Mar 21 08:08:25 2017 -0600 Committer: Marko A. Rodriguez <okramma...@gmail.com> Committed: Fri Mar 24 13:40:53 2017 -0600 ---------------------------------------------------------------------- docs/src/reference/the-traversal.asciidoc | 8 ++- .../traversal/step/filter/GroovyHasTest.groovy | 30 +++----- .../process/traversal/step/filter/HasTest.java | 74 +++++++++++--------- 3 files changed, 56 insertions(+), 56 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6515a6f3/docs/src/reference/the-traversal.asciidoc ---------------------------------------------------------------------- diff --git a/docs/src/reference/the-traversal.asciidoc b/docs/src/reference/the-traversal.asciidoc index f7aee7c..32ddcc6 100644 --- a/docs/src/reference/the-traversal.asciidoc +++ b/docs/src/reference/the-traversal.asciidoc @@ -797,8 +797,8 @@ It is possible to filter vertices, edges, and vertex properties based on their p * `has(key,predicate)`: Remove the traverser if its element does not have a key value that satisfies the bi-predicate. For more information on predicates, please read <<a-note-on-predicates,A Note on Predicates>>. * `hasLabel(labels...)`: Remove the traverser if its element does not have any of the labels. * `hasId(ids...)`: Remove the traverser if its element does not have any of the ids. - * `hasKey(keys...)`: Remove the traverser if its property does not have any of the keys. - * `hasValue(values...)`: Remove the traverser if its property does not have any of the values. + * `hasKey(keys...)`: Remove the traverser if the property does not have all of the provided keys. + * `hasValue(values...)`: Remove the traverser if its property does not have all of the provided values. * `has(key)`: Remove the traverser if its element does not have a value for the key. * `hasNot(key)`: Remove the traverser if its element has a value for the key. * `has(key, traversal)`: Remove the traverser if its object does not yield a result through the traversal off the property value. @@ -814,6 +814,8 @@ g.V().has('age',outside(20,30)).values('age') <2> g.V().has('name',within('josh','marko')).valueMap() <3> g.V().has('name',without('josh','marko')).valueMap() <4> g.V().has('name',not(within('josh','marko'))).valueMap() <5> +g.V().properties().hasKey('age').value() <6> +g.V().hasNot('age').values('name') <7> ---- <1> Find all vertices whose ages are between 20 (inclusive) and 30 (exclusive). @@ -822,6 +824,8 @@ g.V().has('name',not(within('josh','marko'))).valueMap() <5> the key,value pairs for those verticies. <4> Find all vertices whose names are not in the collection `[josh,marko]`, display all the key,value pairs for those vertices. <5> Same as the prior example save using `not` on `within` to yield `without`. +<6> Find all age-properties and emit their value. +<7> Find all vertices that do not have an age-property and emit their name. TinkerPop does not support a regular expression predicate, although specific graph databases that leverage TinkerPop may provide a partial match extension. http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6515a6f3/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy ---------------------------------------------------------------------- diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy index b5ca538..0a7729c 100644 --- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy +++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/filter/GroovyHasTest.groovy @@ -136,38 +136,28 @@ public abstract class GroovyHasTest { } @Override - public Traversal<Vertex, Vertex> get_g_VX1X(final Object v1Id) { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V(v1Id)", "v1Id", v1Id) - } - - @Override - public Traversal<Vertex, Vertex> get_g_V_hasIdX1X(final Object v1Id) { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasId(v1Id)", "v1Id", v1Id) - } - - @Override - public Traversal<Vertex, Vertex> get_g_VX1_2X(final Object v1Id, final Object v2Id) { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V(v1Id, v2Id)", "v1Id", v1Id, "v2Id", v2Id) + public Traversal<Vertex, Vertex> get_g_V_in_hasIdXneqX1XX(final Object v1Id) { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.in.hasId(neq(v1Id))", "v1Id", v1Id) } @Override - public Traversal<Vertex, Vertex> get_g_V_hasIdX1_2X(final Object v1Id, final Object v2Id) { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasId(v1Id, v2Id)", "v1Id", v1Id, "v2Id", v2Id) + public Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').has('age', P.not(lte(10).and(P.not(between(11,20)))).and(lt(29).or(eq(35)))).name") } @Override - public Traversal<Vertex, Vertex> get_g_V_hasIdXwithinX1_2XX(final Object v1Id, final Object v2Id) { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasId(within(v1Id, v2Id))", "v1Id", v1Id, "v2Id", v2Id) + public Traversal<Vertex, Integer> get_g_V_both_properties_dedup_hasKeyXageX_value() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.both.properties().dedup.hasKey('age').value") } @Override - public Traversal<Vertex, Vertex> get_g_V_in_hasIdXneqX1XX(final Object v1Id) { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.in.hasId(neq(v1Id))", "v1Id", v1Id) + public Traversal<Vertex, Integer> get_g_V_both_properties_dedup_hasKeyXageX_hasValueXgtX30XX_value() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.both.properties().dedup.hasKey('age').hasValue(gt(30)).value") } @Override - public Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name() { - new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').has('age', P.not(lte(10).and(P.not(between(11,20)))).and(lt(29).or(eq(35)))).name") + public Traversal<Vertex, String> get_g_V_hasNotXageX_name() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasNot('age').name"); } } } http://git-wip-us.apache.org/repos/asf/tinkerpop/blob/6515a6f3/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java ---------------------------------------------------------------------- diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java index ff4622a..d132eb1 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasTest.java @@ -22,12 +22,9 @@ import org.apache.tinkerpop.gremlin.FeatureRequirement; 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.IgnoreEngine; import org.apache.tinkerpop.gremlin.process.traversal.P; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.TraversalEngine; import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; -import org.apache.tinkerpop.gremlin.process.traversal.step.map.GraphStep; import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Element; import org.apache.tinkerpop.gremlin.structure.Graph; @@ -38,7 +35,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import java.util.Arrays; -import java.util.Collections; import java.util.List; import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.CREW; @@ -46,7 +42,6 @@ import static org.apache.tinkerpop.gremlin.LoadGraphWith.GraphData.MODERN; import static org.hamcrest.CoreMatchers.is; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; @@ -99,19 +94,15 @@ public abstract class HasTest extends AbstractGremlinProcessTest { public abstract Traversal<Vertex, Vertex> get_g_V_hasXlocationX(); - public abstract Traversal<Vertex, Vertex> get_g_VX1X(final Object v1Id); + public abstract Traversal<Vertex, Vertex> get_g_V_in_hasIdXneqX1XX(final Object v1Id); - public abstract Traversal<Vertex, Vertex> get_g_V_hasIdX1X(final Object v1Id); + public abstract Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name(); - public abstract Traversal<Vertex, Vertex> get_g_VX1_2X(final Object v1Id, final Object v2Id); + public abstract Traversal<Vertex, Integer> get_g_V_both_properties_dedup_hasKeyXageX_value(); - public abstract Traversal<Vertex, Vertex> get_g_V_hasIdX1_2X(final Object v1Id, final Object v2Id); + public abstract Traversal<Vertex, Integer> get_g_V_both_properties_dedup_hasKeyXageX_hasValueXgtX30XX_value(); - public abstract Traversal<Vertex, Vertex> get_g_V_hasIdXwithinX1_2XX(final Object v1Id, final Object v2Id); - - public abstract Traversal<Vertex, Vertex> get_g_V_in_hasIdXneqX1XX(final Object v1Id); - - public abstract Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name(); + public abstract Traversal<Vertex, String> get_g_V_hasNotXageX_name(); @Test @LoadGraphWith(MODERN) @@ -412,6 +403,31 @@ public abstract class HasTest extends AbstractGremlinProcessTest { assertFalse(traversal.hasNext()); } + @Test + @LoadGraphWith(MODERN) + public void g_V_both_dedup_properties_hasKeyXageX_value() { + final Traversal<Vertex, Integer> traversal = get_g_V_both_properties_dedup_hasKeyXageX_value(); + printTraversalForm(traversal); + checkResults(Arrays.asList(29, 27, 32, 35), traversal); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_both_dedup_properties_hasKeyXageX_hasValueXgtX30XX_value() { + final Traversal<Vertex, Integer> traversal = get_g_V_both_properties_dedup_hasKeyXageX_hasValueXgtX30XX_value(); + printTraversalForm(traversal); + checkResults(Arrays.asList(32, 35), traversal); + } + + @Test + @LoadGraphWith + public void g_V_hasNotXageX_name() { + final Traversal<Vertex, String> traversal = get_g_V_hasNotXageX_name(); + printTraversalForm(traversal); + checkResults(Arrays.asList("lop", "ripple"), traversal); + } + + public static class Traversals extends HasTest { @Override public Traversal<Edge, Edge> get_g_EX11X_outV_outE_hasXid_10X(final Object e11Id, final Object e8Id) { @@ -519,38 +535,28 @@ public abstract class HasTest extends AbstractGremlinProcessTest { } @Override - public Traversal<Vertex, Vertex> get_g_VX1X(final Object v1Id) { - return g.V(v1Id); - } - - @Override - public Traversal<Vertex, Vertex> get_g_V_hasIdX1X(final Object v1Id) { - return g.V().hasId(v1Id); - } - - @Override - public Traversal<Vertex, Vertex> get_g_VX1_2X(final Object v1Id, final Object v2Id) { - return g.V(v1Id, v2Id); + public Traversal<Vertex, Vertex> get_g_V_in_hasIdXneqX1XX(final Object v1Id) { + return g.V().in().hasId(P.neq(v1Id)); } @Override - public Traversal<Vertex, Vertex> get_g_V_hasIdX1_2X(final Object v1Id, final Object v2Id) { - return g.V().hasId(v1Id, v2Id); + public Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name() { + return g.V().hasLabel("person").has("age", P.not(P.lte(10).and(P.not(P.between(11, 20)))).and(P.lt(29).or(P.eq(35)))).values("name"); } @Override - public Traversal<Vertex, Vertex> get_g_V_hasIdXwithinX1_2XX(final Object v1Id, final Object v2Id) { - return g.V().hasId(P.within(v1Id, v2Id)); + public Traversal<Vertex, Integer> get_g_V_both_properties_dedup_hasKeyXageX_value() { + return g.V().both().properties().dedup().hasKey("age").value(); } @Override - public Traversal<Vertex, Vertex> get_g_V_in_hasIdXneqX1XX(final Object v1Id) { - return g.V().in().hasId(P.neq(v1Id)); + public Traversal<Vertex, Integer> get_g_V_both_properties_dedup_hasKeyXageX_hasValueXgtX30XX_value() { + return g.V().both().properties().dedup().hasKey("age").hasValue(P.gt(30)).value(); } @Override - public Traversal<Vertex, String> get_g_V_hasLabelXpersonX_hasXage_notXlteX10X_andXnotXbetweenX11_20XXXX_andXltX29X_orXeqX35XXXX_name() { - return g.V().hasLabel("person").has("age", P.not(P.lte(10).and(P.not(P.between(11, 20)))).and(P.lt(29).or(P.eq(35)))).values("name"); + public Traversal<Vertex, String> get_g_V_hasNotXageX_name() { + return g.V().hasNot("age").values("name"); } } }