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 <[email protected]> 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
