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 2021/09/15 13:03:57 UTC

[tinkerpop] branch master updated (3cb89c2 -> e92250c)

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

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


    from 3cb89c2  Merge branch '3.5-dev'
     new c629a7e  Added ConnectedComponent tokens given to with() to the grammar CTR
     new d8a41bc  Fixed bug in DotNetTranslator around ambiguous has() calls CTR
     new 730f70c  Preferred withEmbedded() in generate scripts CTR
     new e92250c  Merge branch '3.5-dev'

The 4 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.


Summary of changes:
 CHANGELOG.asciidoc                                 |  2 ++
 .../grammar/GraphTraversalSourceVisitor.java       | 14 +++++++--
 .../language/grammar/GremlinAntlrToJava.java       | 35 ++++++++++++++++++++++
 .../language/grammar/GremlinBaseVisitor.java       | 25 ++++++++++++++++
 .../grammar/GremlinStringConstantsVisitor.java     | 21 +++++++++++++
 .../language/grammar/TraversalMethodVisitor.java   | 23 ++++++++++++--
 .../traversal/translator/DotNetTranslator.java     | 12 +++++++-
 .../traversal/translator/DotNetTranslatorTest.java |  8 +++++
 gremlin-dotnet/build/generate.groovy               |  2 +-
 gremlin-javascript/build/generate.groovy           |  2 +-
 gremlin-language/src/main/antlr4/Gremlin.g4        | 26 ++++++++++++++--
 .../language/grammar/ReferenceGrammarTest.java     |  1 -
 gremlin-python/build/generate.groovy               |  2 +-
 13 files changed, 160 insertions(+), 13 deletions(-)

[tinkerpop] 03/04: Preferred withEmbedded() in generate scripts CTR

Posted by sp...@apache.org.
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

commit 730f70c665a64fa182d9d4ea3b539fdfa2037da1
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Wed Sep 15 08:47:48 2021 -0400

    Preferred withEmbedded() in generate scripts CTR
---
 gremlin-dotnet/build/generate.groovy     | 2 +-
 gremlin-javascript/build/generate.groovy | 2 +-
 gremlin-python/build/generate.groovy     | 2 +-
 3 files changed, 3 insertions(+), 3 deletions(-)

diff --git a/gremlin-dotnet/build/generate.groovy b/gremlin-dotnet/build/generate.groovy
index 5fa64fa..4d6de0e 100644
--- a/gremlin-dotnet/build/generate.groovy
+++ b/gremlin-dotnet/build/generate.groovy
@@ -42,7 +42,7 @@ gremlinGroovyScriptEngine = new GremlinGroovyScriptEngine(new GroovyCustomizer()
     }
 })
 translator = DotNetTranslator.of('g')
-g = traversal().withGraph(EmptyGraph.instance())
+g = traversal().withEmbedded(EmptyGraph.instance())
 bindings = new SimpleBindings()
 bindings.put('g', g)
 
diff --git a/gremlin-javascript/build/generate.groovy b/gremlin-javascript/build/generate.groovy
index c82b14d..09bd9e7 100644
--- a/gremlin-javascript/build/generate.groovy
+++ b/gremlin-javascript/build/generate.groovy
@@ -42,7 +42,7 @@ gremlinGroovyScriptEngine = new GremlinGroovyScriptEngine(new GroovyCustomizer()
     }
 })
 translator = JavascriptTranslator.of('g')
-g = traversal().withGraph(EmptyGraph.instance())
+g = traversal().withEmbedded(EmptyGraph.instance())
 bindings = new SimpleBindings()
 bindings.put('g', g)
 
diff --git a/gremlin-python/build/generate.groovy b/gremlin-python/build/generate.groovy
index bac3d1b..701d47b 100644
--- a/gremlin-python/build/generate.groovy
+++ b/gremlin-python/build/generate.groovy
@@ -42,7 +42,7 @@ gremlinGroovyScriptEngine = new GremlinGroovyScriptEngine(new GroovyCustomizer()
     }
 })
 translator = PythonTranslator.of('g')
-g = traversal().withGraph(EmptyGraph.instance())
+g = traversal().withEmbedded(EmptyGraph.instance())
 bindings = new SimpleBindings()
 bindings.put('g', g)
 

[tinkerpop] 01/04: Added ConnectedComponent tokens given to with() to the grammar CTR

Posted by sp...@apache.org.
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

commit c629a7e8d2c99716ba1f0d64e0c064e37e51582d
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Wed Sep 15 07:48:55 2021 -0400

    Added ConnectedComponent tokens given to with() to the grammar CTR
---
 CHANGELOG.asciidoc                                 |  1 +
 .../grammar/GraphTraversalSourceVisitor.java       | 14 +++++++--
 .../language/grammar/GremlinAntlrToJava.java       | 35 ++++++++++++++++++++++
 .../language/grammar/GremlinBaseVisitor.java       | 25 ++++++++++++++++
 .../grammar/GremlinStringConstantsVisitor.java     | 21 +++++++++++++
 .../language/grammar/TraversalMethodVisitor.java   | 23 ++++++++++++--
 gremlin-language/src/main/antlr4/Gremlin.g4        | 26 ++++++++++++++--
 .../language/grammar/ReferenceGrammarTest.java     |  1 -
 8 files changed, 137 insertions(+), 9 deletions(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index 46fa43b..c25f494 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -25,6 +25,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 
 * Added support for `with()` constant options to `io()`.
 * Fixed bug in the processing of the `io()` step when constructing a `Traversal` from the grammar.
+* Added the `ConnectedComponent` tokens required to properly process the `with()` of the `connectedComponent()` step.
 * Fixed bug where `RepeatUnrollStrategy`, `InlineFilterStrategy` and `MessagePassingReductionStrategy` were all being applied more than necessary.
 * Ensured `PathRetractionStrategy` is applied after `InlineFilterStrategy` which prevents an error in traverser mapping in certain conditions.
 * Deprecated `JsonBuilder` serialization for GraphSON and Gryo.
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GraphTraversalSourceVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GraphTraversalSourceVisitor.java
index 6d44337..bf30941 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GraphTraversalSourceVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GraphTraversalSourceVisitor.java
@@ -29,14 +29,24 @@ public class GraphTraversalSourceVisitor extends GremlinBaseVisitor<GraphTravers
     private final Graph graph;
     private final GremlinAntlrToJava antlr;
     private final String traversalSourceName;
+    private final GraphTraversalSource g;
 
+    /**
+     * Constructs the visitor and if the {@link GremlinAntlrToJava} has a {@link GraphTraversalSource} assigned to it,
+     * the visitor will prefer that "g" rather than creating a new one from the associated {@link Graph} instance.
+     */
     public GraphTraversalSourceVisitor(final GremlinAntlrToJava antlr) {
         this(TRAVERSAL_ROOT, antlr);
     }
 
+    /**
+     * Same as {@link #GraphTraversalSourceVisitor(GremlinAntlrToJava)} but allows the traversal source name to be
+     * configured to something other than "g".
+     */
     public GraphTraversalSourceVisitor(final String traversalSourceName, final GremlinAntlrToJava antlr) {
         this.graph = antlr.graph;
         this.antlr = antlr;
+        this.g = antlr.g;
         this.traversalSourceName = traversalSourceName;
     }
 
@@ -47,13 +57,13 @@ public class GraphTraversalSourceVisitor extends GremlinBaseVisitor<GraphTravers
     public GraphTraversalSource visitTraversalSource(final GremlinParser.TraversalSourceContext ctx) {
         if (ctx.getChildCount() == 1) {
             // handle source method only
-            return graph.traversal();
+            return null == g ? graph.traversal() : g;
         } else {
             final int childIndexOfSelfMethod = 2;
             GraphTraversalSource source;
             if (ctx.getChild(0).getText().equals(traversalSourceName)) {
                 // handle single traversal source
-                source = graph.traversal();
+                source = null == g ? graph.traversal() : g;
             } else {
                 // handle chained self method
                 final int childIndexOfTraversalSource = 0;
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinAntlrToJava.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinAntlrToJava.java
index cb3afff..a06d5e7 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinAntlrToJava.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinAntlrToJava.java
@@ -44,6 +44,11 @@ public class GremlinAntlrToJava extends GremlinBaseVisitor<Object> {
     final Graph graph;
 
     /**
+     * The "g" from which to start the traversal.
+     */
+    final GraphTraversalSource g;
+
+    /**
      * A {@link GremlinBaseVisitor} that processes {@link TraversalSource} methods.
      */
     final GremlinBaseVisitor<GraphTraversalSource> gvisitor;
@@ -84,6 +89,14 @@ public class GremlinAntlrToJava extends GremlinBaseVisitor<Object> {
     }
 
     /**
+     * Constructs a new instance that is bound to the specified {@link GraphTraversalSource} and thus spawns the
+     * {@link Traversal} from this "g" rather than from a fresh one constructed from the {@link Graph} instance.
+     */
+    public GremlinAntlrToJava(final GraphTraversalSource g) {
+        this(g, __::start);
+    }
+
+    /**
      * Constructs a new instance that is bound to the specified {@link Graph} instance with an override to using
      * {@link __} for constructing anonymous {@link Traversal} instances. Assumes that "g" is the name of the
      * {@link GraphTraversalSource}.
@@ -93,6 +106,14 @@ public class GremlinAntlrToJava extends GremlinBaseVisitor<Object> {
     }
 
     /**
+     * Constructs a new instance that is bound to the specified {@link GraphTraversalSource} and thus spawns the
+     * {@link Traversal} from this "g" rather than from a fresh one constructed from the {@link Graph} instance.
+     */
+    protected GremlinAntlrToJava(final GraphTraversalSource g, final Supplier<GraphTraversal<?,?>> createAnonymous) {
+        this(GraphTraversalSourceVisitor.TRAVERSAL_ROOT, g.getGraph(), createAnonymous, g);
+    }
+
+    /**
      * Constructs a new instance that is bound to the specified {@link Graph} instance with an override to using
      * {@link __} for constructing anonymous {@link Traversal} instances.
      *
@@ -100,6 +121,20 @@ public class GremlinAntlrToJava extends GremlinBaseVisitor<Object> {
      */
     protected GremlinAntlrToJava(final String traversalSourceName, final Graph graph,
                                  final Supplier<GraphTraversal<?,?>> createAnonymous) {
+        this(traversalSourceName, graph, createAnonymous, null);
+    }
+
+    /**
+     * Constructs a new instance that is bound to the specified {@link Graph} instance with an override to using
+     * {@link __} for constructing anonymous {@link Traversal} instances. If the {@link GraphTraversalSource} is
+     * provided then the {@link Traversal} will spawn from it as opposed to a fresh one from the {@link Graph} instance.
+     *
+     * @param traversalSourceName The name of the traversal source which will be "g" if not specified.
+     */
+    protected GremlinAntlrToJava(final String traversalSourceName, final Graph graph,
+                                 final Supplier<GraphTraversal<?,?>> createAnonymous,
+                                 final GraphTraversalSource g) {
+        this.g = g;
         this.graph = graph;
         this.gvisitor = new GraphTraversalSourceVisitor(
                 null == traversalSourceName ? GraphTraversalSourceVisitor.TRAVERSAL_ROOT : traversalSourceName,this);
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinBaseVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinBaseVisitor.java
index ac55b96..caa0a8a 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinBaseVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinBaseVisitor.java
@@ -1453,6 +1453,31 @@ public class GremlinBaseVisitor<T> extends AbstractParseTreeVisitor<T> implement
 		notImplemented(ctx); return null;
 	}
 
+	@Override
+	public T visitConnectedComponentConstants(final GremlinParser.ConnectedComponentConstantsContext ctx) {
+		notImplemented(ctx); return null;
+	}
+
+	@Override
+	public T visitGremlinStringConstants_connectedComponentStringConstants_component(final GremlinParser.GremlinStringConstants_connectedComponentStringConstants_componentContext ctx) {
+		notImplemented(ctx); return null;
+	}
+
+	@Override
+	public T visitGremlinStringConstants_connectedComponentStringConstants_edges(final GremlinParser.GremlinStringConstants_connectedComponentStringConstants_edgesContext ctx) {
+		notImplemented(ctx); return null;
+	}
+
+	@Override
+	public T visitGremlinStringConstants_connectedComponentStringConstants_propertyName(GremlinParser.GremlinStringConstants_connectedComponentStringConstants_propertyNameContext ctx) {
+		return null;
+	}
+
+	@Override
+	public T visitConnectedComponentStringConstant(final GremlinParser.ConnectedComponentStringConstantContext ctx) {
+		notImplemented(ctx); return null;
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinStringConstantsVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinStringConstantsVisitor.java
index fee33d4..eec0bdf 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinStringConstantsVisitor.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/grammar/GremlinStringConstantsVisitor.java
@@ -18,6 +18,7 @@
  */
 package org.apache.tinkerpop.gremlin.language.grammar;
 
+import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ConnectedComponent;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PageRank;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.PeerPressure;
 import org.apache.tinkerpop.gremlin.process.computer.traversal.step.map.ShortestPath;
@@ -47,6 +48,11 @@ public class GremlinStringConstantsVisitor extends GremlinBaseVisitor<Object> {
     }
 
     @Override
+    public Object visitConnectedComponentStringConstant(final GremlinParser.ConnectedComponentStringConstantContext ctx) {
+        return visitChildren(ctx);
+    }
+
+    @Override
     public Object visitPageRankStringConstants(final GremlinParser.PageRankStringConstantsContext ctx) {
         return visitChildren(ctx);
     }
@@ -72,6 +78,21 @@ public class GremlinStringConstantsVisitor extends GremlinBaseVisitor<Object> {
     }
 
     @Override
+    public Object visitGremlinStringConstants_connectedComponentStringConstants_edges(final GremlinParser.GremlinStringConstants_connectedComponentStringConstants_edgesContext ctx) {
+        return ConnectedComponent.edges;
+    }
+
+    @Override
+    public Object visitGremlinStringConstants_connectedComponentStringConstants_component(final GremlinParser.GremlinStringConstants_connectedComponentStringConstants_componentContext ctx) {
+        return ConnectedComponent.component;
+    }
+
+    @Override
+    public Object visitGremlinStringConstants_connectedComponentStringConstants_propertyName(final GremlinParser.GremlinStringConstants_connectedComponentStringConstants_propertyNameContext ctx) {
+        return ConnectedComponent.propertyName;
+    }
+
+    @Override
     public Object visitGremlinStringConstants_pageRankStringConstants_edges(final GremlinParser.GremlinStringConstants_pageRankStringConstants_edgesContext ctx) {
         return PageRank.edges;
     }
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 9b67447..67258ce 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
@@ -940,7 +940,7 @@ public class TraversalMethodVisitor extends TraversalRootVisitor<GraphTraversal>
      */
     @Override
     public GraphTraversal visitTraversalMethod_option_Object_Traversal(final GremlinParser.TraversalMethod_option_Object_TraversalContext ctx) {
-        return graphTraversal.option(GenericLiteralVisitor.getInstance().visitGenericLiteral(ctx.genericLiteral()),
+        return graphTraversal.option(new GenericLiteralVisitor(antlr).visitGenericLiteral(ctx.genericLiteral()),
                 antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal()));
     }
 
@@ -1017,6 +1017,11 @@ public class TraversalMethodVisitor extends TraversalRootVisitor<GraphTraversal>
         return graphTraversal.outV();
     }
 
+    @Override
+    public Traversal visitTraversalMethod_connectedComponent(final GremlinParser.TraversalMethod_connectedComponentContext ctx) {
+        return graphTraversal.connectedComponent();
+    }
+
     /**
      * {@inheritDoc}
      */
@@ -1118,8 +1123,8 @@ public class TraversalMethodVisitor extends TraversalRootVisitor<GraphTraversal>
      */
     @Override
     public GraphTraversal visitTraversalMethod_property_Object_Object_Object(final GremlinParser.TraversalMethod_property_Object_Object_ObjectContext ctx) {
-        return graphTraversal.property(GenericLiteralVisitor.getInstance().visitGenericLiteral(ctx.genericLiteral(0)),
-                GenericLiteralVisitor.getInstance().visitGenericLiteral(ctx.genericLiteral(1)),
+        return graphTraversal.property(new GenericLiteralVisitor(antlr).visitGenericLiteral(ctx.genericLiteral(0)),
+                new GenericLiteralVisitor(antlr).visitGenericLiteral(ctx.genericLiteral(1)),
                 GenericLiteralVisitor.getGenericLiteralList(ctx.genericLiteralList()));
     }
 
@@ -1499,11 +1504,23 @@ public class TraversalMethodVisitor extends TraversalRootVisitor<GraphTraversal>
         return this.graphTraversal.where(antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal()));
     }
 
+    /**
+     * {@inheritDoc}
+     */
     @Override
     public GraphTraversal visitTraversalMethod_math(final GremlinParser.TraversalMethod_mathContext ctx) {
         return graphTraversal.math(GenericLiteralVisitor.getStringLiteral(ctx.stringLiteral()));
     }
 
+    /**
+     * {@inheritDoc}
+     */
+    @Override
+    public Traversal visitTraversalMethod_option_Predicate_Traversal(final GremlinParser.TraversalMethod_option_Predicate_TraversalContext ctx) {
+        return graphTraversal.option(TraversalPredicateVisitor.getInstance().visitTraversalPredicate(ctx.traversalPredicate()),
+                antlr.tvisitor.visitNestedTraversal(ctx.nestedTraversal()));
+    }
+
     public GraphTraversal[] getNestedTraversalList(final GremlinParser.NestedTraversalListContext ctx) {
         return ctx.nestedTraversalExpr().nestedTraversal()
                 .stream()
diff --git a/gremlin-language/src/main/antlr4/Gremlin.g4 b/gremlin-language/src/main/antlr4/Gremlin.g4
index f3f9a15..206f341 100644
--- a/gremlin-language/src/main/antlr4/Gremlin.g4
+++ b/gremlin-language/src/main/antlr4/Gremlin.g4
@@ -736,9 +736,6 @@ traversalMethod_write
 	: 'write' LPAREN RPAREN
 	;
 
-
-
-
 /*********************************************
     ARGUMENT AND TERMINAL RULES
 **********************************************/
@@ -1041,11 +1038,18 @@ traversalSelfMethod_none
 gremlinStringConstants
     : withOptionsStringConstants
     | shortestPathStringConstants
+    | connectedComponentConstants
     | pageRankStringConstants
     | peerPressureStringConstants
     | ioOptionsStringConstants
     ;
 
+connectedComponentConstants
+    : gremlinStringConstants_connectedComponentStringConstants_component
+    | gremlinStringConstants_connectedComponentStringConstants_edges
+    | gremlinStringConstants_connectedComponentStringConstants_propertyName
+    ;
+
 pageRankStringConstants
     : gremlinStringConstants_pageRankStringConstants_edges
     | gremlinStringConstants_pageRankStringConstants_times
@@ -1087,6 +1091,18 @@ ioOptionsStringConstants
     | gremlinStringConstants_ioOptionsStringConstants_graphml
     ;
 
+gremlinStringConstants_connectedComponentStringConstants_component
+    : connectedComponentStringConstant DOT 'component'
+    ;
+
+gremlinStringConstants_connectedComponentStringConstants_edges
+    : connectedComponentStringConstant DOT 'edges'
+    ;
+
+gremlinStringConstants_connectedComponentStringConstants_propertyName
+    : connectedComponentStringConstant DOT 'propertyName'
+    ;
+
 gremlinStringConstants_pageRankStringConstants_edges
     : pageRankStringConstant DOT 'edges'
     ;
@@ -1191,6 +1207,10 @@ gremlinStringConstants_ioOptionsStringConstants_graphml
     : ioOptionsStringConstant DOT 'graphml'
     ;
 
+connectedComponentStringConstant
+    : 'ConnectedComponent'
+    ;
+
 pageRankStringConstant
     : 'PageRank'
     ;
diff --git a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java
index 2246fd3..e980519 100644
--- a/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java
+++ b/gremlin-language/src/test/java/org/apache/tinkerpop/gremlin/language/grammar/ReferenceGrammarTest.java
@@ -64,7 +64,6 @@ public class ReferenceGrammarTest extends AbstractGrammarTest {
         assumeThat("Vertex instances are not supported", vertexPattern.matcher(query).matches(), is(false));
         assumeThat("Edge instances are not supported", edgePattern.matcher(query).matches(), is(false));
         assumeThat("fill() terminator is not supported", query.contains("fill("), is(false));
-        assumeThat("connectedComponent() is not fully supported - needs tokens", query.contains("connectedComponent("), is(false));
         assumeThat("withoutStrategies() is not supported", query.contains("withoutStrategies("), is(false));
         assumeThat("program() is not supported", query.contains("program("), is(false));
 

[tinkerpop] 04/04: Merge branch '3.5-dev'

Posted by sp...@apache.org.
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

commit e92250cf094b4e625e392bd69e805aad09156d0a
Merge: 3cb89c2 730f70c
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Wed Sep 15 08:48:26 2021 -0400

    Merge branch '3.5-dev'

 CHANGELOG.asciidoc                                 |  2 ++
 .../grammar/GraphTraversalSourceVisitor.java       | 14 +++++++--
 .../language/grammar/GremlinAntlrToJava.java       | 35 ++++++++++++++++++++++
 .../language/grammar/GremlinBaseVisitor.java       | 25 ++++++++++++++++
 .../grammar/GremlinStringConstantsVisitor.java     | 21 +++++++++++++
 .../language/grammar/TraversalMethodVisitor.java   | 23 ++++++++++++--
 .../traversal/translator/DotNetTranslator.java     | 12 +++++++-
 .../traversal/translator/DotNetTranslatorTest.java |  8 +++++
 gremlin-dotnet/build/generate.groovy               |  2 +-
 gremlin-javascript/build/generate.groovy           |  2 +-
 gremlin-language/src/main/antlr4/Gremlin.g4        | 26 ++++++++++++++--
 .../language/grammar/ReferenceGrammarTest.java     |  1 -
 gremlin-python/build/generate.groovy               |  2 +-
 13 files changed, 160 insertions(+), 13 deletions(-)


[tinkerpop] 02/04: Fixed bug in DotNetTranslator around ambiguous has() calls CTR

Posted by sp...@apache.org.
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

commit d8a41bc3b36d8f75644384ff3de9a94c672d9753
Author: Stephen Mallette <st...@amazon.com>
AuthorDate: Wed Sep 15 07:55:46 2021 -0400

    Fixed bug in DotNetTranslator around ambiguous has() calls CTR
---
 CHANGELOG.asciidoc                                           |  1 +
 .../process/traversal/translator/DotNetTranslator.java       | 12 +++++++++++-
 .../process/traversal/translator/DotNetTranslatorTest.java   |  8 ++++++++
 3 files changed, 20 insertions(+), 1 deletion(-)

diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc
index c25f494..4f4eff4 100644
--- a/CHANGELOG.asciidoc
+++ b/CHANGELOG.asciidoc
@@ -26,6 +26,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima
 * Added support for `with()` constant options to `io()`.
 * Fixed bug in the processing of the `io()` step when constructing a `Traversal` from the grammar.
 * Added the `ConnectedComponent` tokens required to properly process the `with()` of the `connectedComponent()` step.
+* Fixed `DotNetTranslator` bugs where translations produced Gremlin that failed due to ambiguous step calls to `has()`.
 * Fixed bug where `RepeatUnrollStrategy`, `InlineFilterStrategy` and `MessagePassingReductionStrategy` were all being applied more than necessary.
 * Ensured `PathRetractionStrategy` is applied after `InlineFilterStrategy` which prevents an error in traverser mapping in certain conditions.
 * Deprecated `JsonBuilder` serialization for GraphSON and Gryo.
diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslator.java
index 65d4259..0e6ff8c 100644
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslator.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslator.java
@@ -357,7 +357,17 @@ public final class DotNetTranslator implements Translator.ScriptTranslator {
                                 } else if (methodName.equals(GraphTraversal.Symbols.hasValue)) {
                                     script.append("(object) ");
                                 } else if (methodName.equals(GraphTraversal.Symbols.has)) {
-                                    if (instArgs[0] instanceof T && idx > 0) script.append("(object) ");
+                                    if (instArgs.length == 2) {
+                                        if ((instArgs[0] instanceof T || instArgs[0] instanceof String) && idx == 1) {
+                                            script.append("(object) ");
+                                        }
+                                    } else if (instArgs.length == 3) {
+                                        if ((instArgs[0] instanceof T || instArgs[0] instanceof String) && idx == 1) {
+                                            script.append("(string) ");
+                                        } else if ((instArgs[0] instanceof T || instArgs[0] instanceof String) && idx == 2) {
+                                            script.append("(object) ");
+                                        }
+                                    }
                                 }
                             }
                             convertToScript(instArg);
diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslatorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslatorTest.java
index 1b0fd71..8d61454 100644
--- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslatorTest.java
+++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/translator/DotNetTranslatorTest.java
@@ -180,6 +180,14 @@ public class DotNetTranslatorTest {
     }
 
     @Test
+    public void shouldTranslateHasNull() {
+        String script = translator.translate(g.V().has("k", (Object) null).asAdmin().getBytecode()).getScript();
+        assertEquals("g.V().Has(\"k\",(object) null)", script);
+        script = translator.translate(g.V().has("l", "k", (Object) null).asAdmin().getBytecode()).getScript();
+        assertEquals("g.V().Has(\"l\",\"k\",(object) null)", script);
+    }
+
+    @Test
     public void shouldEscapeStrings() {
         final String script = translator.translate(g.addV("customer")
                 .property("customer_id", 501L)