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