From 12aa2d2fe534fbd9540c9328725ab844e4bb1010 Mon Sep 17 00:00:00 2001 From: Daniel Kuppitz Date: Sun, 28 May 2017 15:41:34 +0200 Subject: [PATCH] Fixed folding of multiple `hasId()`'s into `GraphStep`. --- CHANGELOG.asciidoc | 1 + .../process/traversal/step/map/GraphStep.java | 3 +- .../step/filter/GroovyHasTest.groovy | 10 ++++++ .../traversal/step/filter/HasTest.java | 31 +++++++++++++++++++ 4 files changed, 44 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 2d776718e42..3ec765c8f9b 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima TinkerPop 3.2.5 (Release Date: NOT OFFICIALLY RELEASED YET) ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +* Fixed folding of multiple `hasId()`'s into `GraphStep`. * Added string performance options to `StarGraph`. * Fixed a bug in `until(predicate)` where it was actually calling `emit(predicate)`. * Fixed inconsistency in GraphSON serialization of `Path` where properties of graph elements were being included when serialized. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java index 03a0bc4dd78..7ab7d1362b4 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/GraphStep.java @@ -181,7 +181,8 @@ public void close() { * @return true if the {@link HasContainer} updated ids and thus, was processed. */ public static boolean processHasContainerIds(final GraphStep graphStep, final HasContainer hasContainer) { - if (hasContainer.getKey().equals(T.id.getAccessor()) && (hasContainer.getBiPredicate() == Compare.eq || hasContainer.getBiPredicate() == Contains.within)) { + if (hasContainer.getKey().equals(T.id.getAccessor()) && graphStep.ids.length == 0 && + (hasContainer.getBiPredicate() == Compare.eq || hasContainer.getBiPredicate() == Contains.within)) { graphStep.addIds(hasContainer.getValue()); return true; } 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 0a7729c9ce9..76e79a467bf 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 @@ -159,5 +159,15 @@ public abstract class GroovyHasTest { public Traversal get_g_V_hasNotXageX_name() { new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasNot('age').name"); } + + @Override + public Traversal get_g_V_hasIdX1X_hasIdX2X(final Object v1Id, final Object v2Id) { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasId(v1Id).hasId(v2Id)", "v1Id", v1Id, "v2Id", v2Id) + } + + @Override + public Traversal get_g_V_hasLabelXpersonX_hasLabelXsoftwareX() { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V.hasLabel('person').hasLabel('software')") + } } } 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 d132eb1c06a..9bd3e23c28c 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 @@ -104,6 +104,10 @@ public abstract class HasTest extends AbstractGremlinProcessTest { public abstract Traversal get_g_V_hasNotXageX_name(); + public abstract Traversal get_g_V_hasIdX1X_hasIdX2X(final Object v1Id, final Object v2Id); + + public abstract Traversal get_g_V_hasLabelXpersonX_hasLabelXsoftwareX(); + @Test @LoadGraphWith(MODERN) public void g_V_outXcreatedX_hasXname__mapXlengthX_isXgtX3XXX_name() { @@ -427,6 +431,23 @@ public void g_V_hasNotXageX_name() { checkResults(Arrays.asList("lop", "ripple"), traversal); } + @Test + @LoadGraphWith(MODERN) + public void g_V_hasIdX1X_hasIdX2X() { + final Traversal traversal = get_g_V_hasIdX1X_hasIdX2X( + convertToVertexId("marko"), convertToVertexId("vadas") + ); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } + + @Test + @LoadGraphWith(MODERN) + public void g_V_hasLabelXpersonX_hasLabelXsoftwareX() { + final Traversal traversal = get_g_V_hasLabelXpersonX_hasLabelXsoftwareX(); + printTraversalForm(traversal); + assertFalse(traversal.hasNext()); + } public static class Traversals extends HasTest { @Override @@ -558,5 +579,15 @@ public Traversal get_g_V_both_properties_dedup_hasKeyXageX_hasV public Traversal get_g_V_hasNotXageX_name() { return g.V().hasNot("age").values("name"); } + + @Override + public Traversal get_g_V_hasIdX1X_hasIdX2X(final Object v1Id, final Object v2Id) { + return g.V().hasId(v1Id).hasId(v2Id); + } + + @Override + public Traversal get_g_V_hasLabelXpersonX_hasLabelXsoftwareX() { + return g.V().hasLabel("person").hasLabel("software"); + } } }