From 79b621c9a0ddc2d96f951c54ee3f1db3c8490d4c Mon Sep 17 00:00:00 2001 From: "Marko A. Rodriguez" Date: Wed, 18 Oct 2017 16:45:16 -0600 Subject: [PATCH 1/2] Fixed an attachement-bug in with a solution generalized to . --- CHANGELOG.asciidoc | 1 + .../process/traversal/step/sideEffect/StartStep.java | 7 ++++++- .../traversal/step/sideEffect/InjectStepTest.java | 5 ++++- .../tests/driver/test_driver_remote_connection.py | 12 +++++++++--- 4 files changed, 20 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 8ecff99d821..778660e0065 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -23,6 +23,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima [[release-3-2-7]] === TinkerPop 3.2.7 (Release Date: NOT OFFICIALLY RELEASED YET) +* Fixed an "attachement"-bug in `InjectStep` with a solution generalized to `StartStep`. * Truncate the script in error logs and error return messages for "Method code too large" errors in Gremlin Server. * Fixed a bug in `LambdaRestrictionStrategy` where it was too eager to consider a step as being a lambda step. * `ReferenceVertex` was missing its `label()` string. `ReferenceElement` now supports all label handling. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java index cfb732330d3..77d4a487ab2 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/StartStep.java @@ -22,6 +22,7 @@ import org.apache.tinkerpop.gremlin.process.traversal.Traversal; import org.apache.tinkerpop.gremlin.process.traversal.Traverser; import org.apache.tinkerpop.gremlin.process.traversal.step.util.AbstractStep; +import org.apache.tinkerpop.gremlin.structure.util.Attachable; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import java.util.ArrayList; @@ -65,7 +66,11 @@ protected Traverser.Admin processNextStart() { } this.first = false; } - return this.starts.next(); + /// + final Traverser.Admin start = this.starts.next(); + if (start.get() instanceof Attachable && this.getTraversal().getGraph().isPresent()) + start.set(((Attachable) start.get()).attach(Attachable.Method.get(this.getTraversal().getGraph().get()))); + return start; } @Override diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStepTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStepTest.java index fd72b1b07c2..fced80247a7 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStepTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectStepTest.java @@ -33,7 +33,10 @@ public class InjectStepTest extends StepTest { @Override protected List getTraversals() { return Arrays.asList( - __.identity() + __.identity(), + __.inject("a", "b"), + __.inject("a"), + __.inject("b") ); } } diff --git a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py index 0f8c06b697c..1071493d264 100644 --- a/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py +++ b/gremlin-python/src/main/jython/tests/driver/test_driver_remote_connection.py @@ -67,7 +67,8 @@ def test_traversals(self, remote_connection): # # todo: need a traversal metrics deserializer g.V().out().profile().next() # # - results = g.V().has('name','peter').as_('a').out('created').as_('b').select('a','b').by(__.valueMap()).toList() + results = g.V().has('name', 'peter').as_('a').out('created').as_('b').select('a', 'b').by( + __.valueMap()).toList() assert 1 == len(results) assert 'peter' == results[0]['a']['name'][0] assert 35 == results[0]['a']['age'][0] @@ -75,6 +76,11 @@ def test_traversals(self, remote_connection): assert 'java' == results[0]['b']['lang'][0] assert 2 == len(results[0]['a']) assert 2 == len(results[0]['b']) + # # + results = g.V(1).inject(g.V(2).next()).values('name').toList() + assert 2 == len(results) + assert 'marko' in results + assert 'vadas' in results def test_strategies(self, remote_connection): statics.load_statics(globals()) @@ -169,13 +175,13 @@ def test_side_effects(self, remote_connection): assert "knows" == edge.label assert a == edge.outV assert b == edge.inV - g.V().has("name","marko").outE("knows").where(__.inV().has("name","peter")).drop().iterate() + g.V().has("name", "marko").outE("knows").where(__.inV().has("name", "peter")).drop().iterate() ## edge = g.withSideEffect("a", a).withSideEffect("b", b).V().limit(1).addE("knows").from_("a").to("b").next() assert "knows" == edge.label assert a == edge.outV assert b == edge.inV - g.V().has("name","marko").outE("knows").where(__.inV().has("name","peter")).drop().iterate() + g.V().has("name", "marko").outE("knows").where(__.inV().has("name", "peter")).drop().iterate() def test_side_effect_close(self, remote_connection): g = Graph().traversal().withRemote(remote_connection) From ff49cbea3d388592f911323ff2fd9144c2665aa6 Mon Sep 17 00:00:00 2001 From: "Marko A. Rodriguez" Date: Thu, 19 Oct 2017 10:26:39 -0600 Subject: [PATCH 2/2] fixed an old hack in GroovyTranslator and PythonTranslator that makes it possible to translate Elements to their detached form. Added an InjectTest that demonstrates proper functioning for the respective XXXTranslators. --- CHANGELOG.asciidoc | 1 + .../step/sideEffect/GroovyInjectTest.groovy | 5 +++ .../groovy/jsr223/GroovyTranslator.java | 31 +++++++++++++++++-- .../python/jsr223/PythonTranslator.java | 22 +++++++++++-- .../traversal/step/sideEffect/InjectTest.java | 16 +++++++++- 5 files changed, 68 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.asciidoc b/CHANGELOG.asciidoc index 778660e0065..07f1d6936a3 100644 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@ -23,6 +23,7 @@ image::https://raw.githubusercontent.com/apache/tinkerpop/master/docs/static/ima [[release-3-2-7]] === TinkerPop 3.2.7 (Release Date: NOT OFFICIALLY RELEASED YET) +* Fixed an old hack in `GroovyTranslator` and `PythonTranslator` where `Elements` were being mapped to their id only. * Fixed an "attachement"-bug in `InjectStep` with a solution generalized to `StartStep`. * Truncate the script in error logs and error return messages for "Method code too large" errors in Gremlin Server. * Fixed a bug in `LambdaRestrictionStrategy` where it was too eager to consider a step as being a lambda step. diff --git a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy index fb8efb2ebcb..06b79a29bb1 100644 --- a/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy +++ b/gremlin-groovy-test/src/main/groovy/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/GroovyInjectTest.groovy @@ -38,5 +38,10 @@ public abstract class GroovyInjectTest { public Traversal get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) { new ScriptTraversal<>(g, "gremlin-groovy", "g.V(v1Id).out().name.inject('daniel').as('a').map { it.length() }.path", "v1Id", v1Id); } + + @Override + public Traversal get_g_VX1X_injectXg_VX4XX_out_name(final Object v1Id, final Object v4Id) { + new ScriptTraversal<>(g, "gremlin-groovy", "g.V(v1Id).inject(g.V(v4Id).next()).out.name", "v1Id", v1Id, "v4Id", v4Id) + } } } diff --git a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java index 85490ae9330..b6410ec1caa 100644 --- a/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java +++ b/gremlin-groovy/src/main/java/org/apache/tinkerpop/gremlin/groovy/jsr223/GroovyTranslator.java @@ -31,7 +31,9 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; +import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Element; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.util.function.Lambda; @@ -157,9 +159,32 @@ else if (object instanceof TraversalOptionParent.Pick) return "TraversalOptionParent.Pick." + object.toString(); else if (object instanceof Enum) return ((Enum) object).getDeclaringClass().getSimpleName() + "." + object.toString(); - else if (object instanceof Element) - return convertToString(((Element) object).id()); // hack - else if (object instanceof Lambda) { + else if (object instanceof Element) { + if (object instanceof Vertex) { + final Vertex vertex = (Vertex) object; + return "new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertex(" + + convertToString(vertex.id()) + "," + + convertToString(vertex.label()) + ", Collections.emptyMap())"; + } else if (object instanceof Edge) { + final Edge edge = (Edge) object; + return "new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedEdge(" + + convertToString(edge.id()) + "," + + convertToString(edge.label()) + "," + + "Collections.emptyMap()," + + convertToString(edge.outVertex().id()) + "," + + convertToString(edge.outVertex().label()) + "," + + convertToString(edge.inVertex().id()) + "," + + convertToString(edge.inVertex().label()) + ")"; + } else {// VertexProperty + final VertexProperty vertexProperty = (VertexProperty) object; + return "new org.apache.tinkerpop.gremlin.structure.util.detached.DetachedVertexProperty(" + + convertToString(vertexProperty.id()) + "," + + convertToString(vertexProperty.label()) + "," + + convertToString(vertexProperty.value()) + "," + + "Collections.emptyMap()," + + convertToString(vertexProperty.element()) + ")"; + } + } else if (object instanceof Lambda) { final String lambdaString = ((Lambda) object).getLambdaScript().trim(); return lambdaString.startsWith("{") ? lambdaString : "{" + lambdaString + "}"; } else if (object instanceof TraversalStrategyProxy) { diff --git a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java index 0739c9267b1..a5bfd2562dc 100644 --- a/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java +++ b/gremlin-python/src/main/java/org/apache/tinkerpop/gremlin/python/jsr223/PythonTranslator.java @@ -33,8 +33,10 @@ import org.apache.tinkerpop.gremlin.process.traversal.strategy.TraversalStrategyProxy; import org.apache.tinkerpop.gremlin.process.traversal.util.ConnectiveP; import org.apache.tinkerpop.gremlin.process.traversal.util.OrP; +import org.apache.tinkerpop.gremlin.structure.Edge; import org.apache.tinkerpop.gremlin.structure.Element; import org.apache.tinkerpop.gremlin.structure.T; +import org.apache.tinkerpop.gremlin.structure.Vertex; import org.apache.tinkerpop.gremlin.structure.VertexProperty; import org.apache.tinkerpop.gremlin.structure.util.StringFactory; import org.apache.tinkerpop.gremlin.util.function.Lambda; @@ -190,9 +192,23 @@ else if (object instanceof Enum) return convertStatic(((Enum) object).getDeclaringClass().getSimpleName() + ".") + SymbolHelper.toPython(object.toString()); else if (object instanceof P) return convertPToString((P) object, new StringBuilder()).toString(); - else if (object instanceof Element) - return convertToString(((Element) object).id()); // hack - else if (object instanceof Lambda) + else if (object instanceof Element) { + if (object instanceof Vertex) { + final Vertex vertex = (Vertex) object; + return "Vertex(" + convertToString(vertex.id()) + "," + convertToString(vertex.label()) + ")"; + } else if (object instanceof Edge) { + final Edge edge = (Edge) object; + return "Edge(" + convertToString(edge.id()) + ", " + + "Vertex(" + convertToString(edge.outVertex().id()) + ")," + + convertToString(edge.label()) + + ",Vertex(" + convertToString(edge.inVertex().id()) + "))"; + } else { // VertexProperty + final VertexProperty vertexProperty = (VertexProperty) object; + return "VertexProperty(" + convertToString(vertexProperty.id()) + "," + + convertToString(vertexProperty.label()) + "," + + convertToString(vertexProperty.value()) + ")"; + } + } else if (object instanceof Lambda) return convertLambdaToString((Lambda) object); else return null == object ? "None" : object.toString(); diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java index 44eadb698d8..d3fc1edb25c 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/sideEffect/InjectTest.java @@ -23,7 +23,6 @@ import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner; import org.apache.tinkerpop.gremlin.process.traversal.Path; import org.apache.tinkerpop.gremlin.process.traversal.Traversal; -import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__; import org.apache.tinkerpop.gremlin.process.traversal.step.util.MapHelper; import org.apache.tinkerpop.gremlin.structure.Vertex; import org.junit.Test; @@ -47,6 +46,8 @@ public abstract class InjectTest extends AbstractGremlinProcessTest { public abstract Traversal get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id); + public abstract Traversal get_g_VX1X_injectXg_VX4XX_out_name(final Object v1Id, final Object v4Id); + @Test @LoadGraphWith(MODERN) public void g_VX1X_out_injectXv2X_name() { @@ -83,6 +84,14 @@ public void g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path() { assertEquals(4, counter); } + @Test + @LoadGraphWith(MODERN) + public void g_VX1X_injectXg_VX4XX_out_name() { + final Traversal traversal = get_g_VX1X_injectXg_VX4XX_out_name(convertToVertexId("marko"), convertToVertexId("josh")); + printTraversalForm(traversal); + checkResults(Arrays.asList("ripple", "lop", "lop", "vadas", "josh"), traversal); + } + public static class Traversals extends InjectTest { @Override @@ -94,5 +103,10 @@ public Traversal get_g_VX1X_out_injectXv2X_name(final Object v1I public Traversal get_g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path(final Object v1Id) { return g.V(v1Id).out().values("name").inject("daniel").as("a").map(t -> t.get().length()).path(); } + + @Override + public Traversal get_g_VX1X_injectXg_VX4XX_out_name(final Object v1Id, final Object v4Id) { + return g.V(v1Id).inject(g.V(v4Id).next()).out().values("name"); + } } }