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 <[email protected]>
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);
+ }
+ }
+ }
}