You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2020/06/12 12:15:35 UTC

[tinkerpop] 01/01: TINKERPOP-2383 Fixed bug in has(T,Traversal)

This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch TINKERPOP-2383
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit ba44f730a61f3dce383b78d91dfba51152dbeda2
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Fri Jun 12 08:13:40 2020 -0400

    TINKERPOP-2383 Fixed bug in has(T,Traversal)
    
    That has() was using PropertiesStep, but properties() doesn't process T values.
---
 CHANGELOG.asciidoc                                  |  2 +-
 .../process/traversal/dsl/graph/GraphTraversal.java | 21 ++++++++++++++++-----
 gremlin-test/features/filter/Has.feature            | 12 ++++++++++++
 .../process/traversal/step/filter/HasTest.java      | 19 +++++++++++++++++++
 4 files changed, 48 insertions(+), 6 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index e2ddd29..c0631f5 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -23,7 +23,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 [[release-3-4-8]]
 === TinkerPop 3.4.8 (Release Date: NOT OFFICIALLY RELEASED YET)
 
-
+* Fixed bug in `has(T,Traversal)` where results were not being returned.
 
 [[release-3-4-7]]
 === TinkerPop 3.4.7 (Release Date: June 1, 2020)
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
index 9b3a2b2..482a9ac 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/dsl/graph/GraphTraversal.java
@@ -1431,7 +1431,8 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
     }
 
     /**
-     * Filters vertices, edges and vertex properties based on their properties.
+     * Filters vertices, edges and vertex properties based on their value of {@link T} where only {@link T#id} and
+     * {@link T#label} are supported.
      *
      * @param accessor          the {@link T} accessor of the property to filter on
      * @param propertyTraversal the traversal to filter the accessor value by
@@ -1441,13 +1442,23 @@ public interface GraphTraversal<S, E> extends Traversal<S, E> {
      */
     public default GraphTraversal<S, E> has(final T accessor, final Traversal<?, ?> propertyTraversal) {
         this.asAdmin().getBytecode().addStep(Symbols.has, accessor, propertyTraversal);
-        return this.asAdmin().addStep(
-                new TraversalFilterStep<>(this.asAdmin(), propertyTraversal.asAdmin().addStep(0,
-                        new PropertiesStep(propertyTraversal.asAdmin(), PropertyType.VALUE, accessor.getAccessor()))));
+        switch (accessor) {
+            case id:
+                return this.asAdmin().addStep(
+                        new TraversalFilterStep<>(this.asAdmin(), propertyTraversal.asAdmin().addStep(0,
+                                new IdStep<>(propertyTraversal.asAdmin()))));
+            case label:
+                return this.asAdmin().addStep(
+                        new TraversalFilterStep<>(this.asAdmin(), propertyTraversal.asAdmin().addStep(0,
+                                new LabelStep<>(propertyTraversal.asAdmin()))));
+            default:
+                throw new IllegalArgumentException("has(T,Traversal) can only take id or label as its argument");
+        }
+
     }
 
     /**
-     * Filters vertices, edges and vertex properties based on their properties.
+     * Filters vertices, edges and vertex properties based on the value of the specified property key.
      *
      * @param propertyKey       the key of the property to filter on
      * @param propertyTraversal the traversal to filter the property value by
diff --git a/gremlin-test/features/filter/Has.feature b/gremlin-test/features/filter/Has.feature
index ade3265..513f882 100644
--- a/gremlin-test/features/filter/Has.feature
+++ b/gremlin-test/features/filter/Has.feature
@@ -117,6 +117,18 @@ Feature: Step - has()
       | v[josh] |
       | v[peter] |
 
+  Scenario: g_V_hasXlabel_isXsoftwareXX
+    Given the modern graph
+    And the traversal of
+      """
+      g.V().has(T.label, __.is('software'))
+      """
+    When iterated to list
+    Then the result should be unordered
+      | result |
+      | v[lop] |
+      | v[ripple] |
+
   Scenario: g_VX1X_hasXage_gt_30X
     Given the modern graph
     And using the parameter v1Id defined as "v[marko].id"
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 32ccb75..94c831a 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
@@ -81,6 +81,8 @@ public abstract class HasTest extends AbstractGremlinProcessTest {
 
     public abstract Traversal<Vertex, Vertex> get_g_V_hasXage_isXgt_30XX();
 
+    public abstract Traversal<Vertex, Vertex> get_g_V_hasXlabel_isXsoftwareXX();
+
     public abstract Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id);
 
     public abstract Traversal<Edge, Edge> get_g_E_hasLabelXknowsX();
@@ -234,6 +236,18 @@ public abstract class HasTest extends AbstractGremlinProcessTest {
 
     @Test
     @LoadGraphWith(MODERN)
+    public void g_V_hasXlabel_isXsoftwareXX() {
+        final Traversal<Vertex, Vertex> traversal = get_g_V_hasXlabel_isXsoftwareXX();
+        printTraversalForm(traversal);
+        final List<Vertex> list = traversal.toList();
+        assertEquals(2, list.size());
+        for (final Element v : list) {
+            assertEquals("software", v.label());
+        }
+    }
+
+    @Test
+    @LoadGraphWith(MODERN)
     public void g_VX1X_hasXage_gt_30X() {
         final Traversal<Vertex, Vertex> traversalMarko = get_g_VX1X_hasXage_gt_30X(convertToVertexId("marko"));
         printTraversalForm(traversalMarko);
@@ -759,6 +773,11 @@ public abstract class HasTest extends AbstractGremlinProcessTest {
         }
 
         @Override
+        public Traversal<Vertex, Vertex> get_g_V_hasXlabel_isXsoftwareXX() {
+            return g.V().has(T.label, __.is("software"));
+        }
+
+        @Override
         public Traversal<Edge, Edge> get_g_EX7X_hasLabelXknowsX(final Object e7Id) {
             return g.E(e7Id).hasLabel("knows");
         }