You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by co...@apache.org on 2024/11/19 03:41:16 UTC

(tinkerpop) 01/01: WIP Attempt to resolve ambiguous variable type in grammar

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

colegreer pushed a commit to branch cole-gvalue
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git

commit 6f864cbc79af01d74da5da2d515a9d4b492b407f
Author: Cole-Greer <Co...@improving.com>
AuthorDate: Mon Nov 18 19:32:55 2024 -0800

    WIP Attempt to resolve ambiguous variable type in grammar
---
 .../grammar/DefaultGremlinBaseVisitor.java         |  4 ++++
 .../language/grammar/TraversalMethodVisitor.java   | 28 ++++++++++++++++++++--
 .../language/translator/TranslateVisitor.java      |  5 ++++
 gremlin-language/src/main/antlr4/Gremlin.g4        |  5 ++--
 4 files changed, 38 insertions(+), 4 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 f32e40e44b..a94b547172 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
@@ -903,6 +903,10 @@ public class DefaultGremlinBaseVisitor<T> extends AbstractParseTreeVisitor<T> im
 	 * {@inheritDoc}
 	 */
 	@Override public T visitTraversalMethod_valueMap_boolean_String(final GremlinParser.TraversalMethod_valueMap_boolean_StringContext ctx) { notImplemented(ctx); return null; }
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override public T visitTraversalMethod_valueMap_GValue(final GremlinParser.TraversalMethod_valueMap_GValueContext ctx) { notImplemented(ctx); return null; }
 	/**
 	 * {@inheritDoc}
 	 */
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java
index 4d28a0b8e9..04e52bb821 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/TraversalMethodVisitor.java
@@ -1783,13 +1783,37 @@ public class TraversalMethodVisitor extends TraversalRootVisitor<GraphTraversal>
     @Override
     public GraphTraversal visitTraversalMethod_valueMap_boolean_String(final GremlinParser.TraversalMethod_valueMap_boolean_StringContext ctx) {
         if (ctx.getChildCount() == 4) {
-            return graphTraversal.valueMap((boolean) antlr.argumentVisitor.visitBooleanArgument(ctx.booleanArgument()));
+            return graphTraversal.valueMap((boolean) antlr.argumentVisitor.visitBooleanLiteral(ctx.booleanLiteral()));
         } else {
-            return graphTraversal.valueMap((boolean) antlr.argumentVisitor.visitBooleanArgument(ctx.booleanArgument()),
+            return graphTraversal.valueMap((boolean) antlr.argumentVisitor.visitBooleanLiteral(ctx.booleanLiteral()),
                     antlr.genericVisitor.parseStringVarargs(ctx.stringLiteralVarargs()));
         }
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public GraphTraversal visitTraversalMethod_valueMap_GValue(final GremlinParser.TraversalMethod_valueMap_GValueContext ctx) {
+        Object variable = antlr.argumentVisitor.visitVariable(ctx.variable());
+        if (variable instanceof String) {
+            String[] parsedVarargs = antlr.genericVisitor.parseStringVarargs(ctx.stringLiteralVarargs());
+            String[] stringArgs = new String[parsedVarargs.length+1];
+            stringArgs[0] = (String) variable;
+            System.arraycopy(parsedVarargs, 0, stringArgs, 1, parsedVarargs.length);
+            return graphTraversal.valueMap(stringArgs);
+        } else if (variable instanceof Boolean) {
+            if (ctx.getChildCount() == 4) {
+                return graphTraversal.valueMap((boolean) variable);
+            } else {
+                return graphTraversal.valueMap((boolean) variable,
+                        antlr.genericVisitor.parseStringVarargs(ctx.stringLiteralVarargs()));
+            }
+        } else {
+            throw new IllegalArgumentException("First argument to valueMap must be either String or boolean. Found: "+variable.getClass().getName());
+        }
+    }
+
     /**
      * {@inheritDoc}
      */
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java
index 553ae00be7..3b29fa5db7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/TranslateVisitor.java
@@ -1267,6 +1267,11 @@ public class TranslateVisitor extends AbstractParseTreeVisitor<Void> implements
         return visitChildren(ctx);
     }
 
+    @Override
+    public Void visitTraversalMethod_valueMap_GValue(final GremlinParser.TraversalMethod_valueMap_GValueContext ctx) {
+        return visitChildren(ctx);
+    }
+
     @Override
     public Void visitTraversalMethod_values(final GremlinParser.TraversalMethod_valuesContext ctx) {
         return visitChildren(ctx);
diff --git a/gremlin-language/src/main/antlr4/Gremlin.g4 b/gremlin-language/src/main/antlr4/Gremlin.g4
index 5775c27cbb..d5b3da27a5 100644
--- a/gremlin-language/src/main/antlr4/Gremlin.g4
+++ b/gremlin-language/src/main/antlr4/Gremlin.g4
@@ -844,8 +844,9 @@ traversalMethod_value
     ;
 
 traversalMethod_valueMap
-    : 'valueMap' LPAREN stringLiteralVarargs RPAREN #traversalMethod_valueMap_String
-    | 'valueMap' LPAREN booleanArgument (COMMA stringLiteralVarargs)? RPAREN #traversalMethod_valueMap_boolean_String
+    : 'valueMap' LPAREN (stringNullableLiteral (COMMA stringLiteralVarargs)?)? RPAREN #traversalMethod_valueMap_String
+    | 'valueMap' LPAREN booleanLiteral (COMMA stringLiteralVarargs)? RPAREN #traversalMethod_valueMap_boolean_String
+    | 'valueMap' LPAREN variable (COMMA stringLiteralVarargs)? RPAREN #traversalMethod_valueMap_GValue
     ;
 
 traversalMethod_values