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

Reply via email to