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