You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2025/09/12 15:01:24 UTC
(tinkerpop) branch master updated: Tests for custom strategies in grammar CTR
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/master by this push:
new 9a3896d913 Tests for custom strategies in grammar CTR
new ca91e9c195 Merge branch '3.8-dev'
9a3896d913 is described below
commit 9a3896d91313d0d944b77361b29c21412e6dafc2
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Fri Sep 12 10:56:11 2025 -0400
Tests for custom strategies in grammar CTR
---
.../grammar/TraversalStrategyVisitorTest.java | 136 +++++++++++++++++++++
1 file changed, 136 insertions(+)
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitorTest.java
index 42d957eebf..40fa91173d 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitorTest.java
@@ -20,8 +20,11 @@ package org.apache.tinkerpop.gremlin.language.grammar;
import org.antlr.v4.runtime.CharStreams;
import org.antlr.v4.runtime.CommonTokenStream;
+import org.apache.commons.configuration2.Configuration;
import org.apache.commons.configuration2.ConfigurationConverter;
import org.apache.tinkerpop.gremlin.process.traversal.P;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy;
@@ -31,13 +34,17 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.Prod
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.EdgeLabelVerificationStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReservedKeysVerificationStrategy;
+import org.junit.AfterClass;
import org.junit.Before;
+import org.junit.BeforeClass;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import java.util.Arrays;
import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.has;
import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.hasLabel;
@@ -76,6 +83,12 @@ public class TraversalStrategyVisitorTest {
{"SubgraphStrategy(vertices: hasLabel('person'))", SubgraphStrategy.build().vertices(hasLabel("person")).create()},
{"new SubgraphStrategy(vertices: hasLabel('person'), edges: hasLabel('knows'), vertexProperties: has('time', between(1234, 4321)), checkAdjacentVertices: true)", SubgraphStrategy.build().vertices(hasLabel("person")).edges(hasLabel("knows")).vertexProperties(has("time", P.between(1234, 4321))).checkAdjacentVertices(true).create()},
{"CountStrategy", CountStrategy.instance()},
+ {"FakeStrategy", FakeStrategy.instance()},
+ {"FakeConfigurableStrategy", FakeConfigurableStrategy.build().create()},
+ {"FakeConfigurableStrategy(configA: true)", FakeConfigurableStrategy.build().configA(true).create()},
+ {"FakeConfigurableStrategy(configA: false)", FakeConfigurableStrategy.build().configA(false).create()},
+ {"FakeConfigurableStrategy(configB: ['p','x','y'])", FakeConfigurableStrategy.build().configB("p", "x", "y").create()},
+ {"FakeConfigurableStrategy(configA: true, configB: ['p','x','y'])", FakeConfigurableStrategy.build().configA(true).configB("p", "x", "y").create()}
});
}
@@ -84,6 +97,18 @@ public class TraversalStrategyVisitorTest {
antlrToLanguage = new GremlinAntlrToJava();
}
+ @BeforeClass
+ public static void setupClass() {
+ TraversalStrategies.GlobalCache.registerStrategy(FakeStrategy.class);
+ TraversalStrategies.GlobalCache.registerStrategy(FakeConfigurableStrategy.class);
+ }
+
+ @AfterClass
+ public static void tearDownClass() {
+ TraversalStrategies.GlobalCache.unregisterStrategy(FakeStrategy.class);
+ TraversalStrategies.GlobalCache.unregisterStrategy(FakeConfigurableStrategy.class);
+ }
+
@Test
public void shouldParseTraversalStrategy() {
final GremlinLexer lexer = new GremlinLexer(CharStreams.fromString(script));
@@ -95,4 +120,115 @@ public class TraversalStrategyVisitorTest {
assertEquals(ConfigurationConverter.getMap(expected.getConfiguration()),
ConfigurationConverter.getMap(strategy.getConfiguration()));
}
+
+ public static class FakeStrategy implements TraversalStrategy.ProviderOptimizationStrategy {
+ public static final FakeStrategy INSTANCE = new FakeStrategy();
+
+ private FakeStrategy() {}
+
+ public static FakeStrategy instance() {
+ return INSTANCE;
+ }
+
+ @Override
+ public void apply(final Traversal.Admin traversal) {
+
+ }
+
+ @Override
+ public Class<ProviderOptimizationStrategy> getTraversalCategory() {
+ return ProviderOptimizationStrategy.super.getTraversalCategory();
+ }
+
+ @Override
+ public int compareTo(Class<? extends TraversalStrategy> otherTraversalCategory) {
+ return ProviderOptimizationStrategy.super.compareTo(otherTraversalCategory);
+ }
+ }
+
+ public static class FakeConfigurableStrategy implements TraversalStrategy.ProviderOptimizationStrategy {
+ private final boolean configA;
+ private final LinkedHashSet<String> configB;
+
+ private FakeConfigurableStrategy(final boolean logWarning, final LinkedHashSet<String> reservedKeys) {
+ this.configA = logWarning;
+ this.configB = reservedKeys;
+ }
+
+ public static Builder build() {
+ return new Builder();
+ }
+
+ public boolean isConfigA() {
+ return configA;
+ }
+
+ public LinkedHashSet<String> getConfigB() {
+ return configB;
+ }
+
+ @Override
+ public void apply(final Traversal.Admin traversal) {
+ // Implementation here
+ }
+
+ @Override
+ public Class<ProviderOptimizationStrategy> getTraversalCategory() {
+ return ProviderOptimizationStrategy.super.getTraversalCategory();
+ }
+
+ @Override
+ public int compareTo(Class<? extends TraversalStrategy> otherTraversalCategory) {
+ return ProviderOptimizationStrategy.super.compareTo(otherTraversalCategory);
+ }
+
+ @Override
+ public boolean equals(final Object object) {
+ return this.getClass().equals(object.getClass());
+ }
+
+ public static FakeConfigurableStrategy create(final Configuration configuration) {
+ final Object listOrSet = configuration.getProperty("configB");
+ final LinkedHashSet<String> configB;
+ if (null == listOrSet)
+ configB = new LinkedHashSet<>();
+ else
+ configB = listOrSet instanceof Set ? new LinkedHashSet<>((Set) listOrSet) : new LinkedHashSet<>((List) listOrSet);
+
+ return build()
+ .configB(configB)
+ .configA(configuration.getBoolean("configA", false)).create();
+ }
+
+ @Override
+ public Configuration getConfiguration() {
+ final Configuration conf = ProviderOptimizationStrategy.super.getConfiguration();
+ conf.setProperty("configA", this.configA);
+ conf.setProperty("configB", this.configB);
+ return conf;
+ }
+
+ public static class Builder {
+ private boolean configA = false;
+ private LinkedHashSet<String> configB = new LinkedHashSet<>();
+
+ public Builder configA(boolean configA) {
+ this.configA = configA;
+ return this;
+ }
+
+ public Builder configB(final LinkedHashSet<String> configB) {
+ this.configB = configB;
+ return this;
+ }
+
+ public Builder configB(final String... configB) {
+ return configB(new LinkedHashSet<>(Arrays.asList(configB)));
+ }
+
+ public FakeConfigurableStrategy create() {
+ return new FakeConfigurableStrategy(configA, configB);
+ }
+ }
+ }
}