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
The following commit(s) were added to refs/heads/steps-taking-traversal-poc by
this push:
new 7d30d4c367 update to restrict mutations in all traversal taking steps.
7d30d4c367 is described below
commit 7d30d4c367dd9dc06c1a04783e9b737e6828f99a
Author: Yang Xia <[email protected]>
AuthorDate: Wed May 27 13:57:15 2026 -0700
update to restrict mutations in all traversal taking steps.
---
.../process/traversal/util/ChildTraversalValidator.java | 14 +++-----------
.../traversal/util/ChildTraversalValidatorTest.java | 7 ++++---
.../features/filter/ChildTraversalVerification.feature | 14 ++++++++++++--
3 files changed, 19 insertions(+), 16 deletions(-)
diff --git
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidator.java
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidator.java
index 95c422eabe..18b35759a2 100644
---
a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidator.java
+++
b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidator.java
@@ -22,7 +22,6 @@ import org.apache.tinkerpop.gremlin.process.traversal.Step;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
import org.apache.tinkerpop.gremlin.process.traversal.step.Mutating;
import org.apache.tinkerpop.gremlin.process.traversal.step.TraversalParent;
-import org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
/**
* Validates child traversals to ensure they do not contain disallowed steps
based on the context
@@ -31,8 +30,7 @@ import
org.apache.tinkerpop.gremlin.process.traversal.step.filter.DropStep;
* <p>
* Validation rules:
* <ul>
- * <li><b>FILTER / LOOKUP context:</b> No steps implementing {@link
Mutating} are allowed at any nesting depth.</li>
- * <li><b>MUTATION context:</b> Only {@link DropStep} is blocked; other
mutating steps are permitted.</li>
+ * <li><b>FILTER / LOOKUP / MUTATION context:</b> No steps implementing
{@link Mutating} are allowed at any nesting depth.</li>
* </ul>
* <p>
* Recursion walks both {@link TraversalParent#getLocalChildren()} and
@@ -63,7 +61,7 @@ public final class ChildTraversalValidator {
/**
* Validates a child traversal used in mutation context
(property(traversal)).
- * Throws {@link IllegalArgumentException} if a {@link DropStep} is found.
+ * Throws {@link IllegalArgumentException} if any {@link Mutating} step is
found.
*/
public static void validateMutationContext(final Traversal.Admin<?, ?>
child) {
validateRecursive(child, ChildTraversalContext.MUTATION);
@@ -91,19 +89,13 @@ public final class ChildTraversalValidator {
switch (context) {
case FILTER:
case LOOKUP:
+ case MUTATION:
if (step instanceof Mutating) {
throw new IllegalArgumentException(
"Child traversal in " +
context.name().toLowerCase() + " context contains mutating step " +
step.getClass().getSimpleName() + ". Mutating
steps are not allowed in this context.");
}
break;
- case MUTATION:
- if (step instanceof DropStep) {
- throw new IllegalArgumentException(
- "Child traversal in mutation context contains
DropStep. " +
- "Destructive steps are not allowed inside
property(traversal).");
- }
- break;
default:
break;
}
diff --git
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidatorTest.java
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidatorTest.java
index e3b385dd48..b731900276 100644
---
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidatorTest.java
+++
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/util/ChildTraversalValidatorTest.java
@@ -215,9 +215,10 @@ public class ChildTraversalValidatorTest {
}
@Test
- public void shouldAllowAddVInMutationContext() {
- // addV is allowed in property(traversal) — only DropStep is blocked
- g.V().property(__.V().addV("temp").project("k").by("name"));
+ public void shouldRejectAddVInMutationContext() {
+ // addV is now blocked in property(traversal) — all mutating steps are
blocked in all contexts
+ assertThrows(IllegalArgumentException.class, () ->
+ g.V().property(__.V().addV("temp").project("k").by("name")));
}
@Test
diff --git
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/ChildTraversalVerification.feature
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/ChildTraversalVerification.feature
index 1bd57ef418..eacf7a972a 100644
---
a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/ChildTraversalVerification.feature
+++
b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/filter/ChildTraversalVerification.feature
@@ -146,7 +146,7 @@ Feature: Child Traversal Verification - mutating steps
blocked in filter/lookup
When iterated to list
Then the traversal will raise an error with message containing text of
"mutating step"
- # ===== MUTATION CONTEXT: property(traversal) blocks DropStep but allows
other mutations =====
+ # ===== MUTATION CONTEXT: property(traversal) blocks ALL mutating steps =====
@GraphComputerVerificationMidVNotSupported
Scenario: g_V_propertyXV_mapXdropX_projectXxX_byXnameXX_rejected
@@ -156,7 +156,17 @@ Feature: Child Traversal Verification - mutating steps
blocked in filter/lookup
g.V().property(__.V().map(__.drop()).project("x").by("name"))
"""
When iterated to list
- Then the traversal will raise an error with message containing text of
"DropStep"
+ Then the traversal will raise an error with message containing text of
"mutating step"
+
+ @GraphComputerVerificationMidVNotSupported
+ Scenario: g_V_propertyXaddVXtempX_projectXkX_byXnameXX_rejected
+ Given the modern graph
+ And the traversal of
+ """
+ g.V().property(__.addV("temp").project("k").by("name"))
+ """
+ When iterated to list
+ Then the traversal will raise an error with message containing text of
"mutating step"
# ===== VALID TRAVERSALS: should NOT be rejected =====