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) { + } + } + }
