You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by xi...@apache.org on 2026/06/05 05:22:48 UTC

(tinkerpop) 04/14: use P.eq() semantics instead of P.with() for has(key, traversal)

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

xiazcy pushed a commit to branch steps-taking-traversal-poc
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 8e87651de4a633c95c943e7238a22e94c663a4e7
Author: Yang Xia <xi...@gmail.com>
AuthorDate: Wed May 20 16:39:12 2026 -0700

    use P.eq() semantics instead of P.with() for has(key, traversal)
---
 .../tinkerpop/gremlin/process/traversal/step/filter/HasStep.java | 9 +++++----
 .../tinkerpop/gremlin/test/features/filter/HasTraversal.feature  | 2 --
 2 files changed, 5 insertions(+), 6 deletions(-)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
index 07e15f5fd7..65b7eebc89 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/filter/HasStep.java
@@ -110,9 +110,9 @@ public class HasStep<S extends Element> extends FilterStep<S> implements HasCont
                 if (hc.getTraversalValue() != null) {
                     final List<Object> results = collectTraversalResults(traverser, hc.getTraversalValue());
                     if (results.isEmpty()) return false;
-                    // Get the property value to test against
+                    // Get the property value to test against — takes first result, ignores extras
                     final Object propertyValue = getPropertyValueFromProperty(property, hc.getKey());
-                    if (!P.within(results).test(propertyValue)) return false;
+                    if (!P.eq(results.get(0)).test(propertyValue)) return false;
                 } else if (hc.getPredicate() != null && hc.getPredicate().hasTraversal()) {
                     hc.getPredicate().resolve(traverser);
                     if (hc.getPredicate().isResolvedEmpty()) return false;
@@ -133,12 +133,13 @@ public class HasStep<S extends Element> extends FilterStep<S> implements HasCont
     private boolean testHasContainer(final Traverser.Admin<S> traverser, final HasContainer hc, final Element element) {
         if (hc.hasTraversal()) {
             if (hc.getTraversalValue() != null) {
-                // Direct traversal value: evaluate and use P.within(results)
+                // Direct traversal value: evaluate and use P.eq(first result) — takes first, ignores extras
+                // Consistent with by(traversal) which also takes the first result silently.
                 final List<Object> results = collectTraversalResults(traverser, hc.getTraversalValue());
                 if (results.isEmpty()) return false;
                 final Object propertyValue = getPropertyValue(element, hc.getKey());
                 if (propertyValue == null) return false;
-                return P.within(results).test(propertyValue);
+                return P.eq(results.get(0)).test(propertyValue);
             } else if (hc.getPredicate() != null && hc.getPredicate().hasTraversal()) {
                 // Predicate with embedded traversal: resolve then test normally
                 hc.getPredicate().resolve(traverser);
diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/HasTraversal.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/HasTraversal.feature
index a0fb83ae23..3f2f924af2 100644
--- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/HasTraversal.feature
+++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/HasTraversal.feature
@@ -43,7 +43,6 @@ Feature: Step - has() with traversal arguments
     Then the result should be unordered
       | result |
       | v[vadas] |
-      | v[josh] |
 
   @GraphComputerVerificationMidVNotSupported
   Scenario: g_V_hasXage_VXvid1X_outXknowsX_valuesXageXX
@@ -57,7 +56,6 @@ Feature: Step - has() with traversal arguments
     Then the result should be unordered
       | result |
       | v[vadas] |
-      | v[josh] |
 
   @GraphComputerVerificationMidVNotSupported
   Scenario: g_V_hasXname_VXvid1X_valuesXnonexistentXX