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

kenhuuu pushed a commit to branch 3.8-dev
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit b644ac0c4c0666f20df0e6481d57d81fd386a0fa
Merge: 35d8f49b6b e340913794
Author: Ken Hu <[email protected]>
AuthorDate: Mon Aug 31 11:45:10 2026 -0700

    Merge branch '3.7-dev' into 3.8-dev

 CHANGELOG.asciidoc                                 |  1 +
 docs/src/reference/the-traversal.asciidoc          |  3 +
 docs/src/upgrade/release-3.7.x.asciidoc            | 33 ++++++----
 .../tinkerpop/gremlin/jsr223/JavaTranslator.java   | 13 ++++
 .../gremlin/jsr223/JavaTranslatorTest.java         | 70 +++++++++++++++++++++-
 5 files changed, 106 insertions(+), 14 deletions(-)

diff --cc 
gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslatorTest.java
index 13a9232158,5375a0e0c2..ac93a61b1f
--- 
a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslatorTest.java
+++ 
b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/jsr223/JavaTranslatorTest.java
@@@ -19,71 -19,81 +19,135 @@@
  
  package org.apache.tinkerpop.gremlin.jsr223;
  
+ import org.apache.commons.configuration2.BaseConfiguration;
  import org.apache.tinkerpop.gremlin.process.traversal.Bytecode;
 +import org.apache.tinkerpop.gremlin.process.traversal.P;
  import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+ import org.apache.tinkerpop.gremlin.process.traversal.TraversalSource;
+ import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
  import 
org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+ import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.AbstractTraversalStrategy;
+ import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy;
+ import 
org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
  import org.apache.tinkerpop.gremlin.structure.util.empty.EmptyGraph;
  import org.junit.Test;
  
+ import static org.hamcrest.MatcherAssert.assertThat;
+ import static org.hamcrest.Matchers.containsString;
+ import static org.hamcrest.Matchers.is;
  import static org.junit.Assert.assertEquals;
+ import static org.junit.Assert.assertThrows;
  
  public class JavaTranslatorTest {
-     private GraphTraversalSource g = EmptyGraph.instance().traversal();
-     private JavaTranslator<GraphTraversalSource, Traversal.Admin<?, ?>> 
translator = JavaTranslator.of(EmptyGraph.instance().traversal());
 -
+     private final GraphTraversalSource g = EmptyGraph.instance().traversal();
+     private final JavaTranslator<GraphTraversalSource, Traversal.Admin<?, ?>> 
translator = JavaTranslator.of(g);
  
 +    @Test
 +    public void shouldTranslateHasWithObjectThirdArgValue() {
 +        final Bytecode bytecode = new Bytecode();
 +        bytecode.addStep("E");
 +        bytecode.addStep("has", "knows", "weight", 1.0);
 +        final Traversal.Admin<?, ?> translation = 
translator.translate(bytecode);
 +        assertEquals(g.E().has("knows", "weight", 1.0).asAdmin(), 
translation);
 +    }
 +
 +    @Test
 +    public void shouldTranslateHasWithPredicateThirdArgValue() {
 +        final Bytecode bytecode = new Bytecode();
 +        bytecode.addStep("E");
 +        bytecode.addStep("has", "knows", "weight", P.eq(1.0));
 +        final Traversal.Admin<?, ?> translation = 
translator.translate(bytecode);
 +        assertEquals(g.E().has("knows", "weight", P.eq(1.0)).asAdmin(), 
translation);
 +    }
 +
 +    @Test
 +    public void shouldTranslateHasWithNullThirdArgValue() {
 +        final Bytecode bytecode = new Bytecode();
 +        bytecode.addStep("E");
 +        bytecode.addStep("has", "knows", "weight", null);
 +        final Traversal.Admin<?, ?> translation = 
translator.translate(bytecode);
 +        assertEquals(g.E().has("knows", "weight", (String) null).asAdmin(), 
translation);
 +    }
 +
 +    @Test
 +    public void shouldTranslateHasWithObjectSecondArgValue() {
 +        final Bytecode bytecode = new Bytecode();
 +        bytecode.addStep("E");
 +        bytecode.addStep("has", "weight", 1.0);
 +        final Traversal.Admin<?, ?> translation = 
translator.translate(bytecode);
 +        assertEquals(g.E().has("weight", 1.0).asAdmin(), translation);
 +    }
 +
 +    @Test
 +    public void shouldTranslateHasWithPredicateSecondArgValue() {
 +        final Bytecode bytecode = new Bytecode();
 +        bytecode.addStep("E");
 +        bytecode.addStep("has", "weight", P.eq(1.0));
 +        final Traversal.Admin<?, ?> translation = 
translator.translate(bytecode);
 +        assertEquals(g.E().has("weight", P.eq(1.0)).asAdmin(), translation);
 +    }
 +
 +    @Test
 +    public void shouldTranslateHasWithNullSecondArgValue() {
 +        final Bytecode bytecode = new Bytecode();
 +        bytecode.addStep("E");
 +        bytecode.addStep("has", "weight", null);
 +        final Traversal.Admin<?, ?> translation = 
translator.translate(bytecode);
 +        assertEquals(g.E().has("weight", (String) null).asAdmin(), 
translation);
 +    }
 +
- }
+     @Test
+     public void shouldTranslateRegisteredTraversalStrategyProxy() {
+         final Bytecode bytecode = new Bytecode();
+         bytecode.addSource(TraversalSource.Symbols.withStrategies,
+                 new TraversalStrategyProxy<>(ReadOnlyStrategy.instance()));
+         bytecode.addStep("V");
+ 
+         
assertEquals(g.withStrategies(ReadOnlyStrategy.instance()).V().asAdmin(), 
translator.translate(bytecode));
+     }
+ 
+     @Test
+     public void 
shouldRejectUnregisteredTraversalStrategyProxyBeforeInvokingFactory() {
+         final Bytecode bytecode = new Bytecode();
+         bytecode.addSource(TraversalSource.Symbols.withStrategies,
+                 new TraversalStrategyProxy<>(UnregisteredStrategy.class, new 
BaseConfiguration()));
+         bytecode.addStep("V");
+ 
+         final IllegalStateException exception =
+                 assertThrows(IllegalStateException.class, () -> 
translator.translate(bytecode));
+         assertThat(exception.getMessage(), containsString(
+                 "TraversalStrategy not recognized - " + 
UnregisteredStrategy.class.getName()));
+         assertThat(UnregisteredStrategy.instanceInvoked, is(false));
+     }
+ 
+     @Test
+     @SuppressWarnings({"rawtypes", "unchecked"})
+     public void shouldRejectTraversalStrategyProxyForNonStrategyClass() {
+         final Bytecode bytecode = new Bytecode();
+         bytecode.addSource(TraversalSource.Symbols.withStrategies,
+                 new TraversalStrategyProxy(String.class, new 
BaseConfiguration()));
+         bytecode.addStep("V");
+ 
+         final IllegalStateException exception =
+                 assertThrows(IllegalStateException.class, () -> 
translator.translate(bytecode));
+         assertThat(exception.getMessage(), containsString(
+                 "Class is not a TraversalStrategy - " + 
String.class.getName()));
+     }
+ 
+     private static final class UnregisteredStrategy
+             extends 
AbstractTraversalStrategy<TraversalStrategy.DecorationStrategy>
+             implements TraversalStrategy.DecorationStrategy {
+ 
+         private static final UnregisteredStrategy INSTANCE = new 
UnregisteredStrategy();
+         private static boolean instanceInvoked = false;
+ 
+         public static UnregisteredStrategy instance() {
+             instanceInvoked = true;
+             return INSTANCE;
+         }
+ 
+         @Override
+         public void apply(final Traversal.Admin<?, ?> traversal) {
+         }
+     }
+ }

Reply via email to