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 96e921c5ea4e7775f95b5e70f193810c6e092793
Author: Yang Xia <[email protected]>
AuthorDate: Mon May 25 15:10:35 2026 -0700

    Add error throwing for mixed cases instead of silent failure
---
 .../tinkerpop/gremlin/process/traversal/P.java     | 25 ++++++++++++++++++++++
 1 file changed, 25 insertions(+)

diff --git 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/P.java
 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/P.java
index 29d882fa9b..24b7016ae1 100644
--- 
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/P.java
+++ 
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/P.java
@@ -636,6 +636,12 @@ public class P<V> implements Predicate<V>, Serializable, 
Cloneable {
             }
             return new P(Contains.within, traversals);
         }
+        // Reject mixed traversals and literals — would silently produce wrong 
results.
+        if (values != null && values.length > 1 && anyTraversals(values)) {
+            throw new IllegalArgumentException(
+                    "Cannot mix traversals and literal values in within(). " +
+                    "Use within(__.constant(val1), __.constant(val2)) to wrap 
all values as traversals.");
+        }
         final V[] v = null == values ? (V[]) new Object[] { null } : (V[]) 
values;
         return P.within(Arrays.asList(v));
     }
@@ -681,6 +687,12 @@ public class P<V> implements Predicate<V>, Serializable, 
Cloneable {
             }
             return new P(Contains.without, traversals);
         }
+        // Reject mixed traversals and literals
+        if (values != null && values.length > 1 && anyTraversals(values)) {
+            throw new IllegalArgumentException(
+                    "Cannot mix traversals and literal values in without(). " +
+                    "Use without(__.constant(val1), __.constant(val2)) to wrap 
all values as traversals.");
+        }
         final V[] v = null == values ? (V[]) new Object[] { null } : values;
         return P.without(Arrays.asList(v));
     }
@@ -872,4 +884,17 @@ public class P<V> implements Predicate<V>, Serializable, 
Cloneable {
         }
         return true;
     }
+
+    /**
+     * Checks if any element in the array is a {@link Traversal} instance 
(specifically
+     * {@link 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal}).
+     */
+    private static <V> boolean anyTraversals(final V[] values) {
+        for (final V v : values) {
+            if (v instanceof 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.DefaultGraphTraversal) 
{
+                return true;
+            }
+        }
+        return false;
+    }
 }

Reply via email to