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 2024/01/31 22:06:16 UTC

(tinkerpop) branch TINKERPOP-2862 created (now d3650430a1)

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

spmallette pushed a change to branch TINKERPOP-2862
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git


      at d3650430a1 TINKERPOP-2862 wip

This branch includes the following new commits:

     new d3650430a1 TINKERPOP-2862 wip

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



(tinkerpop) 01/01: TINKERPOP-2862 wip

Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

spmallette pushed a commit to branch TINKERPOP-2862
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit d3650430a17aad69ebf431dad171fd0f5f9afa4a
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Wed Jan 31 17:05:49 2024 -0500

    TINKERPOP-2862 wip
---
 .../grammar/DefaultGremlinBaseVisitor.java         |  59 +++---
 .../grammar/TraversalSourceSelfMethodVisitor.java  |  19 +-
 .../language/grammar/TraversalStrategyVisitor.java | 159 ++++++---------
 .../process/traversal/TraversalStrategies.java     |  61 ++++++
 .../util/GremlinDisabledListDelimiterHandler.java  |  46 +++++
 .../TraversalSourceSelfMethodVisitorTest.java      |   8 +
 .../grammar/TraversalStrategyVisitorTest.java      |   5 +
 gremlin-language/src/main/antlr4/Gremlin.g4        | 214 +++++++++------------
 8 files changed, 310 insertions(+), 261 deletions(-)

diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java
index f89c3037d9..e336f041e1 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/DefaultGremlinBaseVisitor.java
@@ -1267,26 +1267,6 @@ public class DefaultGremlinBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
 	 * {@inheritDoc}
 	 */
 	@Override public T visitTraversalStrategyExpr(final GremlinParser.TraversalStrategyExprContext ctx) { notImplemented(ctx); return null; }
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override public T visitTraversalStrategyArgs_PartitionStrategy(final GremlinParser.TraversalStrategyArgs_PartitionStrategyContext ctx) { notImplemented(ctx); return null; }
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override public T visitTraversalStrategyArgs_EdgeLabelVerificationStrategy(final GremlinParser.TraversalStrategyArgs_EdgeLabelVerificationStrategyContext ctx) { notImplemented(ctx); return null; }
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override public T visitTraversalStrategyArgs_ReservedKeysVerificationStrategy(final GremlinParser.TraversalStrategyArgs_ReservedKeysVerificationStrategyContext ctx) { notImplemented(ctx); return null; }
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override public T visitTraversalStrategyArgs_SubgraphStrategy(final GremlinParser.TraversalStrategyArgs_SubgraphStrategyContext ctx) { notImplemented(ctx); return null; }
-	/**
-	 * {@inheritDoc}
-	 */
-	@Override public T visitTraversalStrategyArgs_ProductiveByStrategy(final GremlinParser.TraversalStrategyArgs_ProductiveByStrategyContext ctx) { return null; }
 	/**
 	 * {@inheritDoc}
 	 */
@@ -1697,35 +1677,48 @@ public class DefaultGremlinBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
 	 * {@inheritDoc}
 	 */
 	@Override public T visitTraversalDTArgument(final GremlinParser.TraversalDTArgumentContext ctx) { notImplemented(ctx); return null; }
-
 	/**
 	 * {@inheritDoc}
 	 */
-	@Override
-	public T visitTraversalSackMethodArgument(final GremlinParser.TraversalSackMethodArgumentContext ctx) { notImplemented(ctx); return null; }
+	@Override public T visitTraversalSackMethodArgument(final GremlinParser.TraversalSackMethodArgumentContext ctx) { notImplemented(ctx); return null; }
 	/**
 	 * {@inheritDoc}
 	 */
-	@Override
-	public T visitGenericLiteralVarargs(final GremlinParser.GenericLiteralVarargsContext ctx) { notImplemented(ctx); return null; }
+	@Override public T visitGenericLiteralVarargs(final GremlinParser.GenericLiteralVarargsContext ctx) { notImplemented(ctx); return null; }
 	/**
 	 * {@inheritDoc}
 	 */
-	@Override
-	public T visitGenericLiteralMapArgument(final GremlinParser.GenericLiteralMapArgumentContext ctx) { notImplemented(ctx); return null; }
+	@Override public T visitGenericLiteralMapArgument(final GremlinParser.GenericLiteralMapArgumentContext ctx) { notImplemented(ctx); return null; }
 	/**
 	 * {@inheritDoc}
 	 */
-	@Override
-	public T visitGenericLiteralMapNullableArgument(final GremlinParser.GenericLiteralMapNullableArgumentContext ctx) { notImplemented(ctx); return null; }
+	@Override public T visitGenericLiteralMapNullableArgument(final GremlinParser.GenericLiteralMapNullableArgumentContext ctx) { notImplemented(ctx); return null; }
 	/**
 	 * {@inheritDoc}
 	 */
-	@Override
-	public T visitStringLiteralVarargs(final GremlinParser.StringLiteralVarargsContext ctx) { notImplemented(ctx); return null; }
+	@Override public T visitStringLiteralVarargs(final GremlinParser.StringLiteralVarargsContext ctx) { notImplemented(ctx); return null; }
 	/**
 	 * {@inheritDoc}
 	 */
-	@Override
-	public T visitTraversalMethod_option_Merge_Map_Cardinality(final GremlinParser.TraversalMethod_option_Merge_Map_CardinalityContext ctx) { notImplemented(ctx); return null; }
+	@Override public T visitTraversalMethod_option_Merge_Map_Cardinality(final GremlinParser.TraversalMethod_option_Merge_Map_CardinalityContext ctx) { notImplemented(ctx); return null; }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override public T visitTraversalSourceSelfMethod_withoutStrategies(final GremlinParser.TraversalSourceSelfMethod_withoutStrategiesContext ctx) { return null; }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override public T visitClassTypeList(final GremlinParser.ClassTypeListContext ctx) { return null; }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override public T visitClassTypeExpr(final GremlinParser.ClassTypeExprContext ctx) { return null; }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override public T visitClassType(final GremlinParser.ClassTypeContext ctx) { return null; }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override public T visitTraversalStrategyArg(final GremlinParser.TraversalStrategyArgContext ctx) { return null; }
 }
\ No newline at end of file
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitor.java
index 1df2b54afb..273f3e233a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitor.java
@@ -19,12 +19,14 @@
 package org.apache.tinkerpop.gremlin.language.grammar;
 
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
+import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategies;
 import org.apache.tinkerpop.gremlin.process.traversal.TraversalStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
+import java.util.Optional;
 import java.util.function.BiFunction;
 import java.util.function.BinaryOperator;
 
@@ -91,7 +93,6 @@ public class TraversalSourceSelfMethodVisitor extends DefaultGremlinBaseVisitor<
 
     @Override
     public GraphTraversalSource visitTraversalSourceSelfMethod_withStrategies(final GremlinParser.TraversalSourceSelfMethod_withStrategiesContext ctx) {
-
         if (null == traversalStrategyVisitor)
             traversalStrategyVisitor = new TraversalStrategyVisitor(antlr);
 
@@ -108,6 +109,22 @@ public class TraversalSourceSelfMethodVisitor extends DefaultGremlinBaseVisitor<
         }
     }
 
+    @Override
+    public GraphTraversalSource visitTraversalSourceSelfMethod_withoutStrategies(final GremlinParser.TraversalSourceSelfMethod_withoutStrategiesContext ctx) {
+        final List<GremlinParser.ClassTypeContext> contexts = new ArrayList<>();
+        contexts.add(ctx.classType());
+        if (ctx.classTypeList() != null) {
+            contexts.addAll(ctx.classTypeList().classTypeExpr().classType());
+        }
+
+        final Class[] strategyClasses = contexts.stream().map(c -> TraversalStrategies.GlobalCache.getRegisteredStrategyClass(c.getText()))
+                .filter(Optional::isPresent)
+                .map(Optional::get)
+                .toArray(Class[]::new);
+
+        return source.withoutStrategies(strategyClasses);
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitor.java
index 7fd04974f5..7ae90920e7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalStrategyVisitor.java
@@ -18,6 +18,10 @@
  */
 package org.apache.tinkerpop.gremlin.language.grammar;
 
+import org.antlr.v4.runtime.tree.ParseTree;
+import org.apache.commons.configuration2.BaseConfiguration;
+import org.apache.commons.configuration2.Configuration;
+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;
@@ -27,10 +31,13 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.Abst
 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.apache.tinkerpop.gremlin.util.GremlinDisabledListDelimiterHandler;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
+import java.util.Optional;
 
 public class TraversalStrategyVisitor extends DefaultGremlinBaseVisitor<TraversalStrategy> {
     protected final GremlinAntlrToJava antlr;
@@ -44,117 +51,67 @@ public class TraversalStrategyVisitor extends DefaultGremlinBaseVisitor<Traversa
         // child count of one implies init syntax for the singleton constructed strategies. otherwise, it will
         // fall back to the Builder methods for construction
         if (ctx.getChildCount() == 1) {
-            final String strategyName = ctx.getChild(0).getText();
-            if (strategyName.equals(ReadOnlyStrategy.class.getSimpleName()))
-                return ReadOnlyStrategy.instance();
-            else if (strategyName.equals(ProductiveByStrategy.class.getSimpleName()))
-                return ProductiveByStrategy.instance();
-        } else if (ctx.getChild(0).getText().equals("new")) {
-            final String strategyName = ctx.getChild(1).getText();
-            if (strategyName.equals(PartitionStrategy.class.getSimpleName()))
-                return getPartitionStrategy(ctx.traversalStrategyArgs_PartitionStrategy());
-            else if (strategyName.equals(ReservedKeysVerificationStrategy.class.getSimpleName()))
-                return getReservedKeysVerificationStrategy(ctx.traversalStrategyArgs_ReservedKeysVerificationStrategy());
-            else if (strategyName.equals(EdgeLabelVerificationStrategy.class.getSimpleName()))
-                return getEdgeLabelVerificationStrategy(ctx.traversalStrategyArgs_EdgeLabelVerificationStrategy());
-            else if (strategyName.equals(SubgraphStrategy.class.getSimpleName()))
-                return getSubgraphStrategy(ctx.traversalStrategyArgs_SubgraphStrategy());
-            else if (strategyName.equals(SeedStrategy.class.getSimpleName()))
-                return new SeedStrategy(antlr.argumentVisitor.parseNumber(ctx.integerArgument()).longValue());
-            else if (strategyName.equals(ProductiveByStrategy.class.getSimpleName()))
-                return getProductiveByStrategy(ctx.traversalStrategyArgs_ProductiveByStrategy());
+            final String strategyName = ctx.classType() != null ? constructClassName(ctx.classType()) : ctx.getChild(0).getText();
+            return tryToConstructStrategy(strategyName, getConfiguration(ctx.traversalStrategyArg()));
+        } else {
+            // start looking at strategies after the "new" keyword
+            final int childIndex = ctx.getChild(0).getText().equals("new") ? 1 : 0;
+            final String strategyName = ctx.getChild(childIndex).getText();
+            return tryToConstructStrategy(strategyName, getConfiguration(ctx.traversalStrategyArg()));
         }
-        throw new IllegalStateException("Unexpected TraversalStrategy specification - " + ctx.getText());
     }
 
-    private EdgeLabelVerificationStrategy getEdgeLabelVerificationStrategy(final List<GremlinParser.TraversalStrategyArgs_EdgeLabelVerificationStrategyContext> ctxs) {
-        if (null == ctxs || ctxs.isEmpty())
-            return EdgeLabelVerificationStrategy.build().create();
-
-        final EdgeLabelVerificationStrategy.Builder builder = EdgeLabelVerificationStrategy.build();
-        ctxs.forEach(ctx -> {
-            switch (ctx.getChild(0).getText()) {
-                case AbstractWarningVerificationStrategy.LOG_WARNING:
-                    builder.logWarning(antlr.argumentVisitor.parseBoolean(ctx.booleanArgument()));
-                    break;
-                case AbstractWarningVerificationStrategy.THROW_EXCEPTION:
-                    builder.throwException(antlr.argumentVisitor.parseBoolean(ctx.booleanArgument()));
-                    break;
+    private Configuration getConfiguration(final List<GremlinParser.TraversalStrategyArgContext> contexts) {
+        final BaseConfiguration conf = new BaseConfiguration();
+        conf.setListDelimiterHandler(GremlinDisabledListDelimiterHandler.instance());
+        if (null != contexts) {
+            for (GremlinParser.TraversalStrategyArgContext ctx : contexts) {
+                final String key = ctx.getChild(0).getText();
+                final Object val = antlr.argumentVisitor.visitGenericLiteralArgument(ctx.genericLiteralArgument());
+                conf.setProperty(key, val);
             }
-        });
-
-        return builder.create();
+        }
+        return conf;
     }
 
-    private ReservedKeysVerificationStrategy getReservedKeysVerificationStrategy(final List<GremlinParser.TraversalStrategyArgs_ReservedKeysVerificationStrategyContext> ctxs) {
-        if (null == ctxs || ctxs.isEmpty())
-            return ReservedKeysVerificationStrategy.build().create();
-
-        final ReservedKeysVerificationStrategy.Builder builder = ReservedKeysVerificationStrategy.build();
-        ctxs.forEach(ctx -> {
-            switch (ctx.getChild(0).getText()) {
-                case AbstractWarningVerificationStrategy.LOG_WARNING:
-                    builder.logWarning(antlr.argumentVisitor.parseBoolean(ctx.booleanArgument()));
-                    break;
-                case AbstractWarningVerificationStrategy.THROW_EXCEPTION:
-                    builder.throwException(antlr.argumentVisitor.parseBoolean(ctx.booleanArgument()));
-                    break;
-                case ReservedKeysVerificationStrategy.KEYS:
-                    builder.reservedKeys(new HashSet<>(Arrays.asList(antlr.genericVisitor.parseStringList(ctx.stringLiteralList()))));
-                    break;
-            }
-        });
-
-        return builder.create();
+    private String constructClassName(final GremlinParser.ClassTypeContext ctx) {
+        final StringBuilder builder = new StringBuilder();
+        for (ParseTree child : ctx.children) {
+            builder.append(child.getText());
+        }
+        return builder.toString();
     }
 
-    private PartitionStrategy getPartitionStrategy(final List<GremlinParser.TraversalStrategyArgs_PartitionStrategyContext> ctxs) {
-        final PartitionStrategy.Builder builder = PartitionStrategy.build();
-        ctxs.forEach(ctx -> {
-            switch (ctx.getChild(0).getText()) {
-                case PartitionStrategy.INCLUDE_META_PROPERTIES:
-                    builder.includeMetaProperties(antlr.argumentVisitor.parseBoolean(ctx.booleanArgument()));
-                    break;
-                case PartitionStrategy.READ_PARTITIONS:
-                    builder.readPartitions(Arrays.asList(antlr.genericVisitor.parseStringList(ctx.stringLiteralList())));
-                    break;
-                case PartitionStrategy.WRITE_PARTITION:
-                    builder.writePartition(antlr.argumentVisitor.parseString(ctx.stringArgument()));
-                    break;
-                case PartitionStrategy.PARTITION_KEY:
-                    builder.partitionKey(antlr.argumentVisitor.parseString(ctx.stringArgument()));
-                    break;
-            }
-        });
+    /**
+     * Try to instantiate the strategy by checking registered {@link TraversalStrategy} implementations that are
+     * registered globally.
+     */
+    private static TraversalStrategy tryToConstructStrategy(final String strategyName, final Configuration conf) {
+        // try to grab the strategy class from registered sources first
+        final Optional<? extends Class<? extends TraversalStrategy>> opt = TraversalStrategies.GlobalCache.getRegisteredStrategyClass(strategyName);
 
-        return builder.create();
-    }
+        if (!opt.isPresent()) {
+            throw new IllegalStateException("Unexpected TraversalStrategy specification - " + strategyName);
+        }
 
-    private SubgraphStrategy getSubgraphStrategy(final List<GremlinParser.TraversalStrategyArgs_SubgraphStrategyContext> ctxs) {
-        final SubgraphStrategy.Builder builder = SubgraphStrategy.build();
-        ctxs.forEach(ctx -> {
-            switch (ctx.getChild(0).getText()) {
-                case SubgraphStrategy.VERTICES:
-                    builder.vertices(antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal()));
-                    break;
-                case SubgraphStrategy.EDGES:
-                    builder.edges(antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal()));
-                    break;
-                case SubgraphStrategy.VERTEX_PROPERTIES:
-                    builder.vertexProperties(antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal()));
-                    break;
-                case SubgraphStrategy.CHECK_ADJACENT_VERTICES:
-                    builder.checkAdjacentVertices(antlr.argumentVisitor.parseBoolean(ctx.booleanArgument()));
-                    break;
+        final Class clazz = opt.get();
+
+        try {
+            if (conf.isEmpty()) {
+                try {
+                    return (TraversalStrategy) clazz.getMethod("instance").invoke(null);
+                } catch (Exception ex) {
+                    try {
+                        return (TraversalStrategy) clazz.getConstructor().newInstance();
+                    } catch (Exception exinner) {
+                        return (TraversalStrategy) clazz.getMethod("create", Configuration.class).invoke(null, conf);
+                    }
+                }
+            } else {
+                return (TraversalStrategy) clazz.getMethod("create", Configuration.class).invoke(null, conf);
             }
-        });
-
-        return builder.create();
-    }
-
-    private ProductiveByStrategy getProductiveByStrategy(final GremlinParser.TraversalStrategyArgs_ProductiveByStrategyContext ctx) {
-        final ProductiveByStrategy.Builder builder = ProductiveByStrategy.build();
-        builder.productiveKeys(Arrays.asList(antlr.genericVisitor.parseStringList(ctx.stringLiteralList())));
-        return builder.create();
+        } catch (Exception ex) {
+            throw new IllegalStateException("Unexpected TraversalStrategy specification - " + strategyName, ex);
+        }
     }
 }
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
index fc97198ac6..2df79bac46 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/TraversalStrategies.java
@@ -23,7 +23,16 @@ import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.finaliza
 import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.MessagePassingReductionStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ConnectiveStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.ElementIdStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.EventStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.HaltedTraverserStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.OptionsStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.PartitionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SackStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SeedStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ProfileStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.finalization.ReferenceElementStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.AdjacentToIncidentStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EarlyLimitStrategy;
@@ -37,8 +46,13 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.Matc
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.OrderLimitStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathProcessorStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ComputerVerificationStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.EdgeLabelVerificationStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.LambdaRestrictionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReservedKeysVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.StandardVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.util.DefaultTraversalStrategies;
 import org.apache.tinkerpop.gremlin.structure.Graph;
@@ -214,6 +228,33 @@ public interface TraversalStrategies extends Serializable, Cloneable, Iterable<T
         private static final Map<Class<? extends Graph>, TraversalStrategies> GRAPH_CACHE = new HashMap<>();
         private static final Map<Class<? extends GraphComputer>, TraversalStrategies> GRAPH_COMPUTER_CACHE = new HashMap<>();
 
+        /**
+         * A register of the simple names for all strategies that can be constructed by the user.
+         */
+        private static final Map<String, Class<? extends TraversalStrategy>> GREMLIN_CONSTRUCTED = new HashMap<String, Class<? extends TraversalStrategy>>() {{
+            // decorations
+            put(ConnectiveStrategy.class.getSimpleName(), ConnectiveStrategy.class);
+            put(ElementIdStrategy.class.getSimpleName(), ElementIdStrategy.class);
+            put(EventStrategy.class.getSimpleName(), EventStrategy.class);
+            put(HaltedTraverserStrategy.class.getSimpleName(), HaltedTraverserStrategy.class);
+            put(OptionsStrategy.class.getSimpleName(), OptionsStrategy.class);
+            put(PartitionStrategy.class.getSimpleName(), PartitionStrategy.class);
+            put(SeedStrategy.class.getSimpleName(), SeedStrategy.class);
+            put(SubgraphStrategy.class.getSimpleName(), SubgraphStrategy.class);
+
+            // finalization
+            put(ReferenceElementStrategy.class.getSimpleName(), ReferenceElementStrategy.class);
+
+            // optimizations
+            put(ProductiveByStrategy.class.getSimpleName(), ProductiveByStrategy.class);
+
+            // verification
+            put(EdgeLabelVerificationStrategy.class.getSimpleName(), EdgeLabelVerificationStrategy.class);
+            put(LambdaRestrictionStrategy.class.getSimpleName(), LambdaRestrictionStrategy.class);
+            put(ReadOnlyStrategy.class.getSimpleName(), ReadOnlyStrategy.class);
+            put(ReservedKeysVerificationStrategy.class.getSimpleName(), ReservedKeysVerificationStrategy.class);
+        }};
+
         static {
             final TraversalStrategies graphStrategies = new DefaultTraversalStrategies();
             graphStrategies.addStrategies(
@@ -257,6 +298,26 @@ public interface TraversalStrategies extends Serializable, Cloneable, Iterable<T
                 throw new IllegalArgumentException("The TraversalStrategies.GlobalCache only supports Graph and GraphComputer strategy caching: " + graphOrGraphComputerClass.getCanonicalName());
         }
 
+        /**
+         * Looks up a strategy by its simple name.
+         */
+        public static Optional<? extends Class<? extends TraversalStrategy>> getRegisteredStrategyClass(final String strategyName) {
+            if (GREMLIN_CONSTRUCTED.containsKey(strategyName))
+                return Optional.of(GREMLIN_CONSTRUCTED.get(strategyName));
+
+            final Optional<? extends Class<? extends TraversalStrategy>> optFromGraph = GRAPH_CACHE.values().stream().flatMap(strategies -> strategies.toList().stream()).
+                    filter(strategy -> strategy.getClass().getSimpleName().equals(strategyName)).map(strategy -> strategy.getClass()).findAny();
+            if (optFromGraph.isPresent())
+                return optFromGraph;
+
+            final Optional<? extends Class<? extends TraversalStrategy>> optFromGraphComputer = GRAPH_COMPUTER_CACHE.values().stream().flatMap(strategies -> strategies.toList().stream()).
+                    filter(strategy -> strategy.getClass().getSimpleName().equals(strategyName)).map(strategy -> strategy.getClass()).findAny();
+            if (optFromGraphComputer.isPresent())
+                return optFromGraphComputer;
+
+            return Optional.empty();
+        }
+
         public static TraversalStrategies getStrategies(final Class graphOrGraphComputerClass) {
             try {
                 // be sure to load the class so that its static{} traversal strategy registration component is loaded.
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinDisabledListDelimiterHandler.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinDisabledListDelimiterHandler.java
new file mode 100644
index 0000000000..239bac3bd0
--- /dev/null
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/util/GremlinDisabledListDelimiterHandler.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.tinkerpop.gremlin.util;
+
+import org.apache.commons.configuration2.convert.DisabledListDelimiterHandler;
+import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
+
+import java.util.Collections;
+
+/**
+ * Special handler that prevents the list delimiter from iterating traversals that are used for configuration, like
+ * when given to {@link SubgraphStrategy}
+ */
+public class GremlinDisabledListDelimiterHandler extends DisabledListDelimiterHandler {
+
+    private static final GremlinDisabledListDelimiterHandler INSTANCE = new GremlinDisabledListDelimiterHandler();
+
+    public static GremlinDisabledListDelimiterHandler instance() {
+        return INSTANCE;
+    }
+
+    @Override
+    public Iterable<?> parse(final Object value) {
+        if (value instanceof Traversal)
+            return Collections.singletonList(value);
+        else
+            return super.parse(value);
+    }
+}
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitorTest.java
index 6c555c6c99..25f1271651 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalSourceSelfMethodVisitorTest.java
@@ -23,6 +23,10 @@ import org.antlr.v4.runtime.CommonTokenStream;
 import org.apache.tinkerpop.gremlin.process.traversal.Operator;
 import org.apache.tinkerpop.gremlin.process.traversal.P;
 import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.EarlyLimitStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.PathRetractionStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.RepeatUnrollStrategy;
 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.structure.util.empty.EmptyGraph;
@@ -61,6 +65,10 @@ public class TraversalSourceSelfMethodVisitorTest {
                 {"withStrategies(new EdgeLabelVerificationStrategy(logWarning: true, throwException: true))", g.withStrategies(EdgeLabelVerificationStrategy.build().logWarning(true).throwException(true).create())},
                 {"withStrategies(ReadOnlyStrategy, new EdgeLabelVerificationStrategy(logWarning: true, throwException: true))", g.withStrategies(ReadOnlyStrategy.instance(), EdgeLabelVerificationStrategy.build().logWarning(true).throwException(true).create())},
                 {"withStrategies(new EdgeLabelVerificationStrategy(logWarning: true, throwException: true), ReadOnlyStrategy)", g.withStrategies(EdgeLabelVerificationStrategy.build().logWarning(true).throwException(true).create(), ReadOnlyStrategy.instance())},
+                {"withoutStrategies(CountStrategy)", g.withoutStrategies(CountStrategy.class)},
+                {"withoutStrategies(CountStrategy, EarlyLimitStrategy)", g.withoutStrategies(CountStrategy.class, EarlyLimitStrategy.class)},
+                {"withoutStrategies(CountStrategy, EarlyLimitStrategy, PathRetractionStrategy)", g.withoutStrategies(CountStrategy.class, EarlyLimitStrategy.class, PathRetractionStrategy.class)},
+                {"withoutStrategies(CountStrategy, EarlyLimitStrategy, PathRetractionStrategy, RepeatUnrollStrategy)", g.withoutStrategies(CountStrategy.class, EarlyLimitStrategy.class, PathRetractionStrategy.class, RepeatUnrollStrategy.class)},
                 {"with('requestId', '7c55d4d7-809a-4f84-9720-63b48cb2fd14')", g.with("requestId", "7c55d4d7-809a-4f84-9720-63b48cb2fd14")},
                 {"with('requestId')", g.with("requestId")},
                 {"withSideEffect('hello', ['one':1])", g.withSideEffect("hello", map)},
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 445c6ff9db..6245a21a10 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
@@ -26,6 +26,7 @@ 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;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.decoration.SubgraphStrategy;
+import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.CountStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.optimization.ProductiveByStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.EdgeLabelVerificationStrategy;
 import org.apache.tinkerpop.gremlin.process.traversal.strategy.verification.ReadOnlyStrategy;
@@ -58,6 +59,7 @@ public class TraversalStrategyVisitorTest {
         return Arrays.asList(new Object[][]{
                 {"ReadOnlyStrategy", ReadOnlyStrategy.instance()},
                 {"new SeedStrategy(seed: 999999)", new SeedStrategy(999999)},
+                {"SeedStrategy(seed: 999999)", new SeedStrategy(999999)},
                 {"new PartitionStrategy(partitionKey: 'k', includeMetaProperties: true)", PartitionStrategy.build().partitionKey("k").includeMetaProperties(true).create()},
                 {"new PartitionStrategy(partitionKey: 'k', writePartition: 'p', readPartitions: ['p','x','y'])", PartitionStrategy.build().partitionKey("k").writePartition("p").readPartitions("p", "x", "y").create()},
                 {"ProductiveByStrategy", ProductiveByStrategy.instance()},
@@ -66,10 +68,13 @@ public class TraversalStrategyVisitorTest {
                 {"new EdgeLabelVerificationStrategy(logWarning: true, throwException: true)", EdgeLabelVerificationStrategy.build().logWarning(true).throwException(true).create()},
                 {"new ReservedKeysVerificationStrategy()", ReservedKeysVerificationStrategy.build().create()},
                 {"new ReservedKeysVerificationStrategy(logWarning: true, throwException: true)", ReservedKeysVerificationStrategy.build().logWarning(true).throwException(true).create()},
+                {"ReservedKeysVerificationStrategy(logWarning: true, throwException: true)", ReservedKeysVerificationStrategy.build().logWarning(true).throwException(true).create()},
                 {"new ReservedKeysVerificationStrategy(logWarning: true, throwException: false)", ReservedKeysVerificationStrategy.build().logWarning(true).create()},
                 {"new ReservedKeysVerificationStrategy(keys: ['a','b'])", ReservedKeysVerificationStrategy.build().reservedKeys(new HashSet<>(Arrays.asList("a", "b"))).create()},
                 {"new SubgraphStrategy(vertices: hasLabel('person'))", SubgraphStrategy.build().vertices(hasLabel("person")).create()},
+                {"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()},
         });
     }
 
diff --git a/gremlin-language/src/main/antlr4/Gremlin.g4 b/gremlin-language/src/main/antlr4/Gremlin.g4
index 107396547b..c0227a8055 100644
--- a/gremlin-language/src/main/antlr4/Gremlin.g4
+++ b/gremlin-language/src/main/antlr4/Gremlin.g4
@@ -63,6 +63,7 @@ traversalSourceSelfMethod
     | traversalSourceSelfMethod_withSack
     | traversalSourceSelfMethod_withSideEffect
     | traversalSourceSelfMethod_withStrategies
+    | traversalSourceSelfMethod_withoutStrategies
     | traversalSourceSelfMethod_with
     ;
 
@@ -87,6 +88,10 @@ traversalSourceSelfMethod_withStrategies
     : 'withStrategies' LPAREN traversalStrategy (COMMA traversalStrategyList)? RPAREN
     ;
 
+traversalSourceSelfMethod_withoutStrategies
+    : 'withoutStrategies' LPAREN classType (COMMA classTypeList)? RPAREN
+    ;
+
 traversalSourceSelfMethod_with
     : 'with' LPAREN stringArgument RPAREN
     | 'with' LPAREN stringArgument COMMA genericLiteralArgument RPAREN
@@ -961,70 +966,15 @@ structureVertex
     ;
 
 traversalStrategy
-//  : 'ConnectiveStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'ElementIdStrategy' - not supported as the configuration takes a lambda
-//  | 'EventStrategy' - not supported as there is no way to send events back to the client
-//  | 'HaltedTraverserStrategy' - not supported as it is not typically relevant to OLTP
-//  | 'OptionsStrategy' - not supported as it's internal to with()
-    : NEW 'PartitionStrategy' LPAREN traversalStrategyArgs_PartitionStrategy? (COMMA traversalStrategyArgs_PartitionStrategy)* RPAREN
-//  | 'RequirementStrategy' - not supported as it's internally relevant only
-//  | 'SackStrategy' - not supported directly as it's internal to withSack()
-    | NEW 'SeedStrategy' LPAREN 'seed' COLON integerArgument RPAREN
-//  | 'SideEffectStrategy' - not supported directly as it's internal to withSideEffect()
-    | NEW 'SubgraphStrategy' LPAREN traversalStrategyArgs_SubgraphStrategy? (COMMA traversalStrategyArgs_SubgraphStrategy)* RPAREN
-//  | 'MatchAlgorithmStrategy' - not supported directly as it's internal to match()
-//  | 'ProfileStrategy' - not supported directly as it's internal to profile()
-//  | 'ReferenceElementStrategy' - not supported directly as users really can't/shouldn't change this in our context of a remote Gremlin provider
-//  | 'AdjacentToIncidentStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'ByModulatorOptimizationStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-    | NEW? 'ProductiveByStrategy' (LPAREN traversalStrategyArgs_ProductiveByStrategy? RPAREN)?
-//  | 'CountStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'EarlyLimitStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'FilterRankingStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'IdentityRemovalStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'IncidentToAdjacentStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'InlineFilterStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'LazyBarrierStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'MatchPredicateStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'OrderLimitStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'PathProcessorStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'PathRetractionStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'RepeatUnrollStrategy' - not supported as it is a default strategy and we don't allow removal at this time
-//  | 'ComputerVerificationStrategy' - not supported since it's GraphComputer related
-    | NEW 'EdgeLabelVerificationStrategy' LPAREN traversalStrategyArgs_EdgeLabelVerificationStrategy? (COMMA traversalStrategyArgs_EdgeLabelVerificationStrategy)* RPAREN
-//  | 'LambdaRestrictionStrategy' - not supported as we don't support lambdas in any situation
-    | 'ReadOnlyStrategy'
-    | NEW 'ReservedKeysVerificationStrategy' LPAREN traversalStrategyArgs_ReservedKeysVerificationStrategy? (COMMA traversalStrategyArgs_ReservedKeysVerificationStrategy)* RPAREN
-//  | 'StandardVerificationStrategy' - not supported since this is an interal strategy
-    ;
-
-traversalStrategyArgs_ProductiveByStrategy
-    : 'productiveKeys' COLON stringLiteralList
-    ;
-
-traversalStrategyArgs_PartitionStrategy
-    : 'includeMetaProperties' COLON booleanArgument
-    | 'writePartition' COLON stringArgument
-    | 'partitionKey' COLON stringArgument
-    | 'readPartitions' COLON stringLiteralList
-    ;
-
-traversalStrategyArgs_SubgraphStrategy
-    : 'vertices' COLON nestedTraversal
-    | 'edges' COLON nestedTraversal
-    | 'vertexProperties' COLON nestedTraversal
-    | 'checkAdjacentVertices' COLON booleanArgument
-    ;
-
-traversalStrategyArgs_EdgeLabelVerificationStrategy
-    : 'throwException' COLON booleanArgument
-    | 'logWarning' COLON booleanArgument
-    ;
-
-traversalStrategyArgs_ReservedKeysVerificationStrategy
-    : 'keys' COLON stringLiteralList
-    | 'throwException' COLON booleanArgument
-    | 'logWarning' COLON booleanArgument
+    : NEW? classType (LPAREN (traversalStrategyArg (COMMA traversalStrategyArg)*)? RPAREN)?
+    ;
+
+// sorta annoying that certain keywords can end up being used as configuration keys on a strategy. if they aren't
+// defined here then the parser doesn't pick them up. what's the right way to fix this?!
+traversalStrategyArg
+    : 'keys' COLON genericLiteralArgument
+    | 'edges' COLON genericLiteralArgument
+    | Identifier COLON genericLiteralArgument
     ;
 
 traversalScope
@@ -1620,6 +1570,14 @@ traversalStrategyExpr
     : traversalStrategy (COMMA traversalStrategy)*
     ;
 
+classTypeList
+    : classTypeExpr?
+    ;
+
+classTypeExpr
+    : classType (COMMA classType)*
+    ;
+
 nestedTraversalList
     : nestedTraversalExpr?
     ;
@@ -1747,6 +1705,10 @@ infLiteral
     : SignedInfLiteral
     ;
 
+classType
+    : Identifier
+    ;
+
 variable
     : Identifier
     ;
@@ -1766,185 +1728,185 @@ NEW : 'new';
 // Integer Literals
 
 IntegerLiteral
-    :    Sign? DecimalIntegerLiteral
-    |    Sign? HexIntegerLiteral
-    |    Sign? OctalIntegerLiteral
+    : Sign? DecimalIntegerLiteral
+    | Sign? HexIntegerLiteral
+    | Sign? OctalIntegerLiteral
     ;
 
 fragment
 DecimalIntegerLiteral
-    :    DecimalNumeral IntegerTypeSuffix?
+    : DecimalNumeral IntegerTypeSuffix?
     ;
 
 fragment
 HexIntegerLiteral
-    :    HexNumeral IntegerTypeSuffix?
+    : HexNumeral IntegerTypeSuffix?
     ;
 
 fragment
 OctalIntegerLiteral
-    :    OctalNumeral IntegerTypeSuffix?
+    : OctalNumeral IntegerTypeSuffix?
     ;
 
 fragment
 IntegerTypeSuffix
-    :    [bBsSnNiIlL]
+    : [bBsSnNiIlL]
     ;
 
 fragment
 DecimalNumeral
-    :    '0'
-    |    NonZeroDigit (Digits? | Underscores Digits)
+    : '0'
+    | NonZeroDigit (Digits? | Underscores Digits)
     ;
 
 fragment
 Digits
-    :    Digit (DigitsAndUnderscores? Digit)?
+    : Digit (DigitsAndUnderscores? Digit)?
     ;
 
 fragment
 Digit
-    :    '0'
-    |    NonZeroDigit
+    : '0'
+    | NonZeroDigit
     ;
 
 fragment
 NonZeroDigit
-    :    [1-9]
+    : [1-9]
     ;
 
 fragment
 DigitsAndUnderscores
-    :    DigitOrUnderscore+
+    : DigitOrUnderscore+
     ;
 
 fragment
 DigitOrUnderscore
-    :    Digit
-    |    '_'
+    : Digit
+    | '_'
     ;
 
 fragment
 Underscores
-    :    '_'+
+    : '_'+
     ;
 
 fragment
 HexNumeral
-    :    '0' [xX] HexDigits
+    : '0' [xX] HexDigits
     ;
 
 fragment
 HexDigits
-    :    HexDigit (HexDigitsAndUnderscores? HexDigit)?
+    : HexDigit (HexDigitsAndUnderscores? HexDigit)?
     ;
 
 fragment
 HexDigit
-    :    [0-9a-fA-F]
+    : [0-9a-fA-F]
     ;
 
 fragment
 HexDigitsAndUnderscores
-    :    HexDigitOrUnderscore+
+    : HexDigitOrUnderscore+
     ;
 
 fragment
 HexDigitOrUnderscore
-    :    HexDigit
-    |    '_'
+    : HexDigit
+    | '_'
     ;
 
 fragment
 OctalNumeral
-    :    '0' Underscores? OctalDigits
+    : '0' Underscores? OctalDigits
     ;
 
 fragment
 OctalDigits
-    :    OctalDigit (OctalDigitsAndUnderscores? OctalDigit)?
+    : OctalDigit (OctalDigitsAndUnderscores? OctalDigit)?
     ;
 
 fragment
 OctalDigit
-    :    [0-7]
+    : [0-7]
     ;
 
 fragment
 OctalDigitsAndUnderscores
-    :    OctalDigitOrUnderscore+
+    : OctalDigitOrUnderscore+
     ;
 
 fragment
 OctalDigitOrUnderscore
-    :    OctalDigit
-    |    '_'
+    : OctalDigit
+    | '_'
     ;
 
 // Floating-Point Literals
 
 FloatingPointLiteral
-    :    Sign? DecimalFloatingPointLiteral
+    : Sign? DecimalFloatingPointLiteral
     ;
 
 fragment
 DecimalFloatingPointLiteral
-    :   Digits ('.' Digits ExponentPart? | ExponentPart) FloatTypeSuffix?
-    |    Digits FloatTypeSuffix
+    : Digits ('.' Digits ExponentPart? | ExponentPart) FloatTypeSuffix?
+    | Digits FloatTypeSuffix
     ;
 
 fragment
 ExponentPart
-    :    ExponentIndicator SignedInteger
+    : ExponentIndicator SignedInteger
     ;
 
 fragment
 ExponentIndicator
-    :    [eE]
+    : [eE]
     ;
 
 fragment
 SignedInteger
-    :    Sign? Digits
+    : Sign? Digits
     ;
 
 fragment
 Sign
-    :    [+-]
+    : [+-]
     ;
 
 fragment
 FloatTypeSuffix
-    :    [fFdDmM]
+    : [fFdDmM]
     ;
 
 // Boolean Literals
 
 BooleanLiteral
-    :    'true'
-    |    'false'
+    : 'true'
+    | 'false'
     ;
 
 // Null Literal
 
 NullLiteral
-    :    'null'
+    : 'null'
     ;
 
 // NaN Literal
 
 NaNLiteral
-    :    'NaN'
+    : 'NaN'
     ;
 
 // Inf Literal
 
 SignedInfLiteral
-    :    Sign? InfLiteral
+    : Sign? InfLiteral
     ;
 
 InfLiteral
-    :    'Infinity'
+    : 'Infinity'
     ;
 
 
@@ -1954,38 +1916,38 @@ InfLiteral
 // literals also. A side effect of this is ANTLR will not be able to parse single character string literals with
 // single quoted so we instead remove char literal altogether and only have string literal in lexer tokens.
 NonEmptyStringLiteral
-    :   '"' DoubleQuotedStringCharacters '"'
-    |   '\'' SingleQuotedStringCharacters '\''
+    : '"' DoubleQuotedStringCharacters '"'
+    | '\'' SingleQuotedStringCharacters '\''
     ;
 
 // We define NonEmptyStringLiteral and EmptyStringLiteral separately so that we can unambiguously handle empty queries
 EmptyStringLiteral
-    :   '""'
-    |   '\'\''
+    : '""'
+    | '\'\''
     ;
 
 fragment
 DoubleQuotedStringCharacters
-    :    DoubleQuotedStringCharacter+
+    : DoubleQuotedStringCharacter+
     ;
 
 fragment
 DoubleQuotedStringCharacter
-    :    ~('"' | '\\')
-    |   JoinLineEscape
-    |    EscapeSequence
+    : ~('"' | '\\')
+    | JoinLineEscape
+    | EscapeSequence
     ;
 
 fragment
 SingleQuotedStringCharacters
-    :    SingleQuotedStringCharacter+
+    : SingleQuotedStringCharacter+
     ;
 
 fragment
 SingleQuotedStringCharacter
-    :    ~('\'' | '\\')
-    |   JoinLineEscape
-    |    EscapeSequence
+    : ~('\'' | '\\')
+    | JoinLineEscape
+    | EscapeSequence
     ;
 
 // Escape Sequences for Character and String Literals
@@ -1995,21 +1957,21 @@ fragment JoinLineEscape
 
 fragment
 EscapeSequence
-    :    '\\' [btnfr"'\\]
-    |    OctalEscape
-    |   UnicodeEscape // This is not in the spec but prevents having to preprocess the input
+    : '\\' [btnfr"'\\]
+    | OctalEscape
+    | UnicodeEscape // This is not in the spec but prevents having to preprocess the input
     ;
 
 fragment
 OctalEscape
-    :    '\\' OctalDigit
-    |    '\\' OctalDigit OctalDigit
-    |    '\\' ZeroToThree OctalDigit OctalDigit
+    : '\\' OctalDigit
+    | '\\' OctalDigit OctalDigit
+    | '\\' ZeroToThree OctalDigit OctalDigit
     ;
 
 fragment
 ZeroToThree
-    :    [0-3]
+    : [0-3]
     ;
 
 // This is not in the spec but prevents having to preprocess the input