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");
}