This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch TINKERPOP-2681 in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 294292958d69e50533b1527e791188b4ec8d566a Author: Stephen Mallette <[email protected]> AuthorDate: Thu Jan 20 06:48:19 2022 -0500 wip --- docs/src/dev/io/graphbinary.asciidoc | 5 +++ .../traversal/step/map/MergeVertexStep.java | 2 +- .../traversal/translator/GroovyTranslator.java | 2 +- .../gremlin/structure/io/binary/DataType.java | 1 + .../structure/io/graphson/GraphSONModule.java | 7 ++++ .../lib/process/graph-traversal.js | 20 ++++++++++++ .../test/cucumber/feature-steps.js | 8 ++++- .../gremlin-javascript/test/cucumber/gremlin.js | 3 +- .../language/grammar/ReferenceGrammarTest.java | 2 +- gremlin-python/build/generate.groovy | 2 +- .../gremlin_python/process/graph_traversal.py | 38 ++++++++++++++++++++++ .../python/gremlin_python/process/traversal.py | 5 +++ .../gremlin_python/structure/io/graphbinaryV1.py | 10 ++++-- .../src/main/python/radish/feature_steps.py | 9 +++-- gremlin-python/src/main/python/radish/gremlin.py | 5 ++- gremlin-test/features/sideEffect/Group.feature | 22 ++++++------- gremlin-test/features/sideEffect/Inject.feature | 7 ++-- .../tinkerpop/gremlin/features/StepDefinition.java | 5 +-- .../traversal/step/map/TinkerMergeVertexStep.java | 1 + .../gremlin/tinkergraph/TinkerGraphWorld.java | 1 + 20 files changed, 122 insertions(+), 33 deletions(-) diff --git a/docs/src/dev/io/graphbinary.asciidoc b/docs/src/dev/io/graphbinary.asciidoc index 065370a..f3b0a82 100644 --- a/docs/src/dev/io/graphbinary.asciidoc +++ b/docs/src/dev/io/graphbinary.asciidoc @@ -107,6 +107,7 @@ Changes to existing types require new revision. - `0x2b`: Tree - `0x2c`: Metrics - `0x2d`: TraversalMetrics +- `0x2e`: Merge - `0xfe`: Unspecified null object - `0x00`: Custom @@ -567,6 +568,10 @@ Where: - `{duration}` is a `Long` describing the duration in nanoseconds. - `{metrics}` is a `List` composed by `Metrics` items. +==== Merge + +Format: a single `String` representing the enum value. + ==== Custom A custom type, represented as a blob value. diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java index 319db5d..365d83a 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/MergeVertexStep.java @@ -60,7 +60,7 @@ public class MergeVertexStep<S> extends FlatMapStep<S, Vertex> implements Mutati private Traversal.Admin<S, Map<Object, Object>> onCreateTraversal = null; private Traversal.Admin<S, Map<String, Object>> onMatchTraversal = null; - private CallbackRegistry<Event> callbackRegistry; + protected CallbackRegistry<Event> callbackRegistry; public MergeVertexStep(final Traversal.Admin traversal, final boolean isStart, final Map<Object, Object> searchCreate) { this(traversal, isStart, new ConstantTraversal<>(searchCreate)); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/GroovyTranslator.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/GroovyTranslator.java index bfa3065..0143c27 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/GroovyTranslator.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/translator/GroovyTranslator.java @@ -174,7 +174,7 @@ public final class GroovyTranslator implements Translator.ScriptTranslator { @Override protected String getSyntax(final Pick o) { - return "TraversalOptionParent.Pick." + o.toString(); + return "Pick." + o.toString(); } @Override diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/DataType.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/DataType.java index 0159d4f..75b8060 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/DataType.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/binary/DataType.java @@ -70,6 +70,7 @@ public enum DataType { TREE(0X2B), METRICS(0x2C), TRAVERSALMETRICS(0x2D), + MERGE(0x2E), CHAR(0X80), DURATION(0X81), diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java index fccab3f..82d818f 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/GraphSONModule.java @@ -21,6 +21,7 @@ package org.apache.tinkerpop.gremlin.structure.io.graphson; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.decoration.VertexProgramStrategy; import org.apache.tinkerpop.gremlin.process.computer.traversal.strategy.optimization.GraphFilterStrategy; import org.apache.tinkerpop.gremlin.process.traversal.Bytecode; +import org.apache.tinkerpop.gremlin.process.traversal.Merge; import org.apache.tinkerpop.gremlin.process.traversal.Operator; import org.apache.tinkerpop.gremlin.process.traversal.Order; import org.apache.tinkerpop.gremlin.process.traversal.P; @@ -174,6 +175,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { VertexProperty.Cardinality.class, Column.class, Direction.class, + Merge.class, Operator.class, Order.class, Pop.class, @@ -257,6 +259,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Stream.of(VertexProperty.Cardinality.class, Column.class, Direction.class, + Merge.class, Operator.class, Order.class, Pop.class, @@ -299,6 +302,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Stream.of(VertexProperty.Cardinality.values(), Column.values(), Direction.values(), + Merge.values(), Operator.values(), Order.values(), Pop.values(), @@ -412,6 +416,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { VertexProperty.Cardinality.class, Column.class, Direction.class, + Merge.class, Operator.class, Order.class, Pop.class, @@ -491,6 +496,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Stream.of(VertexProperty.Cardinality.class, Column.class, Direction.class, + Merge.class, Operator.class, Order.class, Pop.class, @@ -527,6 +533,7 @@ abstract class GraphSONModule extends TinkerPopJacksonModule { Stream.of(VertexProperty.Cardinality.values(), Column.values(), Direction.values(), + Merge.values(), Operator.values(), Order.values(), Pop.values(), diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js index c609ba0..ae3d7f3 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/process/graph-traversal.js @@ -212,6 +212,16 @@ class GraphTraversalSource { const b = new Bytecode(this.bytecode).addStep('addE', args); return new this.graphTraversalClass(this.graph, new TraversalStrategies(this.traversalStrategies), b); } + + /** + * mergeV GraphTraversalSource step method. + * @param {...Object} args + * @returns {GraphTraversal} + */ + mergeE(...args) { + const b = new Bytecode(this.bytecode).addStep('mergeE', args); + return new this.graphTraversalClass(this.graph, new TraversalStrategies(this.traversalStrategies), b); + } /** * addV GraphTraversalSource step method. @@ -222,6 +232,16 @@ class GraphTraversalSource { const b = new Bytecode(this.bytecode).addStep('addV', args); return new this.graphTraversalClass(this.graph, new TraversalStrategies(this.traversalStrategies), b); } + + /** + * mergeV GraphTraversalSource step method. + * @param {...Object} args + * @returns {GraphTraversal} + */ + mergeV(...args) { + const b = new Bytecode(this.bytecode).addStep('mergeV', args); + return new this.graphTraversalClass(this.graph, new TraversalStrategies(this.traversalStrategies), b); + } /** * inject GraphTraversalSource step method. diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js index d500feb..ba23650 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/feature-steps.js @@ -273,7 +273,13 @@ function toNumeric(stringValue) { } function toVertex(name) { - return this.getData().vertices.get(name); + // some vertices are cached, like those from toy graphs but some are just references. if they are + // not cached then they are meant to be references. + const vertices = this.getData().vertices; + if (vertices.has(name)) + return this.getData().vertices.get(name); + else + return new graphModule.Vertex(name, "vertex") } function toVertexId(name) { diff --git a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js index 6079579..6af6338 100644 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/test/cucumber/gremlin.js @@ -820,7 +820,6 @@ const gremlins = { g_V_outXfollowedByX_group_byXsongTypeX_byXbothE_group_byXlabelX_byXweight_sumXX: [function({g}) { return g.V().out("followedBy").group().by("songType").by(__.bothE().group().by(T.label).by(__.values("weight").sum())) }], g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX: [function({g}) { return g.V().group("m").by("name").by(__.in_("knows").values("name")).cap("m") }], g_V_group_byXlabelX_byXbothE_groupXaX_byXlabelX_byXweight_sumX_weight_sumX: [function({g}) { return g.V().group().by(T.label).by(__.bothE().group("a").by(T.label).by(__.values("weight").sum()).values("weight").sum()) }], - g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX: [function({g, xx1}) { return g.withSideEffect("a",xx1).V().group("a").by("name").by(__.outE().label().fold()).cap("a").unfold().group().by(Column.keys).by(__.select(Column.values).order(Scope.local).by(Order.asc)) }], g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX: [function({g}) { return g.V().hasLabel("person").as("p").out("created").group().by("name").by(__.select("p").values("age").sum()) }], g_V_hasLabelXpersonX_asXpX_outXcreatedX_groupXaX_byXnameX_byXselectXpX_valuesXageX_sumX_capXaX: [function({g}) { return g.V().hasLabel("person").as("p").out("created").group("a").by("name").by(__.select("p").values("age").sum()).cap("a") }], g_V_group_byXlabelX_byXlabel_countX: [function({g}) { return g.V().group().by(__.label()).by(__.label().count()) }], @@ -843,7 +842,7 @@ const gremlins = { g_V_hasXperson_name_markoX_bothXknowsX_groupCount_byXvaluesXnameX_foldX: [function({g}) { return g.V().has("person","name","marko").both("knows").groupCount().by(__.values("name").fold()) }], g_VX1X_out_injectXv2X_name: [function({g, vid1, v2}) { return g.V(vid1).out().inject(v2).values("name") }], g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path: [function({g, l1, vid1}) { return g.V(vid1).out().values("name").inject("daniel").as("a").map(l1).path() }], - g_VX1X_injectXg_VX4XX_out_name: [function({g, vid1, v4}) { return g.V(vid1).inject(v4).out().values("name") }], + g_VX1X_injectXg_VX4XX_out_name: [function({g, vid1, v2}) { return g.V(vid1).inject(v2).out().values("name") }], g_injectXnull_1_3_nullX: [function({g}) { return g.inject(null,1,3,null) }], g_injectX10_20_null_20_10_10X_groupCountXxX_dedup_asXyX_projectXa_bX_by_byXselectXxX_selectXselectXyXXX: [function({g}) { return g.inject(10,20,null,20,10,10).groupCount("x").dedup().as("y").project("a","b").by().by(__.select("x").select(__.select("y"))) }], g_injectXname_marko_age_nullX_selectXname_ageX: [function({g, xx1}) { return g.inject(xx1).select("name","age") }], 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 a0e91fe..b241c59 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 @@ -70,7 +70,7 @@ public class ReferenceGrammarTest extends AbstractGrammarTest { return String.format("[%s]", listItems); })); add(Pair.with(Pattern.compile("v\\[(.+)\\]"), (k,v) -> "\"1\"")); - add(Pair.with(Pattern.compile("v(\\d)"), (k,v) -> String.format("new Vertex(%s)", v))); + add(Pair.with(Pattern.compile("v(\\d)"), (k,v) -> String.format("new Vertex(%s, \"vertex\")", v))); add(Pair.with(Pattern.compile("e\\[(.+)\\]"), (k,v) -> "\"1\"")); add(Pair.with(Pattern.compile("d\\[(.*)\\]\\.?.*"), (k,v) -> v)); add(Pair.with(Pattern.compile("m\\[(.*)\\]"), (k,v) -> v.replace('{','[').replace('}', ']'))); diff --git a/gremlin-python/build/generate.groovy b/gremlin-python/build/generate.groovy index a633cd7..0c6dd42 100644 --- a/gremlin-python/build/generate.groovy +++ b/gremlin-python/build/generate.groovy @@ -87,7 +87,7 @@ radishGremlinFile.withWriter('UTF-8') { Writer writer -> 'from gremlin_python.process.traversal import TraversalStrategy\n' + 'from gremlin_python.process.graph_traversal import __\n' + 'from gremlin_python.structure.graph import Graph\n' + - 'from gremlin_python.process.traversal import Barrier, Cardinality, P, TextP, Pop, Scope, Column, Order, Direction, T, Pick, Operator, IO, WithOptions\n') + 'from gremlin_python.process.traversal import Barrier, Cardinality, P, TextP, Pop, Scope, Column, Order, Direction, Merge, T, Pick, Operator, IO, WithOptions\n') // Groovy can't process certain null oriented calls because it gets confused with the right overload to call // at runtime. using this approach for now as these are the only such situations encountered so far. a better diff --git a/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py b/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py index 525bc9d..c8e8ae4 100644 --- a/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py +++ b/gremlin-python/src/main/python/gremlin_python/process/graph_traversal.py @@ -144,6 +144,16 @@ class GraphTraversalSource(object): traversal.bytecode.add_step("addV", *args) return traversal + def mergeV(self, *args): + traversal = self.get_graph_traversal() + traversal.bytecode.add_step("mergeV", *args) + return traversal + + def mergeE(self, *args): + traversal = self.get_graph_traversal() + traversal.bytecode.add_step("mergeE", *args) + return traversal + def inject(self, *args): traversal = self.get_graph_traversal() traversal.bytecode.add_step("inject", *args) @@ -401,6 +411,14 @@ class GraphTraversal(Traversal): self.bytecode.add_step("mean", *args) return self + def mergeE(self, *args): + self.bytecode.add_step("mergeE", *args) + return self + + def mergeV(self, *args): + self.bytecode.add_step("mergeV", *args) + return self + def min_(self, *args): self.bytecode.add_step("min", *args) return self @@ -827,6 +845,14 @@ class __(object, metaclass=MagicType): return cls.graph_traversal(None, None, Bytecode()).mean(*args) @classmethod + def mergeE(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).mergeE(*args) + + @classmethod + def mergeV(cls, *args): + return cls.graph_traversal(None, None, Bytecode()).mergeV(*args) + + @classmethod def min_(cls, *args): return cls.graph_traversal(None, None, Bytecode()).min_(*args) @@ -1254,6 +1280,14 @@ def mean(*args): return __.mean(*args) +def mergeE(*args): + return __.mergeE(*args) + + +def mergeV(*args): + return __.mergeV(*args) + + def min_(*args): return __.min_(*args) @@ -1514,6 +1548,10 @@ statics.add_static('max_', max_) statics.add_static('mean', mean) +statics.add_static('mergeE', mergeE) + +statics.add_static('mergeV', mergeV) + statics.add_static('min_', min_) statics.add_static('not_', not_) diff --git a/gremlin-python/src/main/python/gremlin_python/process/traversal.py b/gremlin-python/src/main/python/gremlin_python/process/traversal.py index f7bd31d..e24948c 100644 --- a/gremlin-python/src/main/python/gremlin_python/process/traversal.py +++ b/gremlin-python/src/main/python/gremlin_python/process/traversal.py @@ -152,6 +152,11 @@ GryoVersion = Enum('GryoVersion', ' V1_0 V3_0') statics.add_static('V1_0', GryoVersion.V1_0) statics.add_static('V3_0', GryoVersion.V3_0) +Merge = Enum('Merge', ' onCreate onMatch') + +statics.add_static('onCreate', Merge.onCreate) +statics.add_static('onMatch', Merge.onMatch) + Order = Enum('Order', ' asc desc shuffle') statics.add_static('shuffle', Order.shuffle) diff --git a/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV1.py b/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV1.py index a5a258a..f39197a 100644 --- a/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV1.py +++ b/gremlin-python/src/main/python/gremlin_python/structure/io/graphbinaryV1.py @@ -33,8 +33,8 @@ from datetime import timedelta from gremlin_python import statics from gremlin_python.statics import FloatType, FunctionType, IntType, LongType, TypeType, DictType, ListType, SetType, \ SingleByte, ByteBufferType, GremlinType, SingleChar -from gremlin_python.process.traversal import Barrier, Binding, Bytecode, Cardinality, Column, Direction, Operator, \ - Order, Pick, Pop, P, Scope, TextP, Traversal, Traverser, \ +from gremlin_python.process.traversal import Barrier, Binding, Bytecode, Cardinality, Column, Direction, Merge, \ + Operator, Order, Pick, Pop, P, Scope, TextP, Traversal, Traverser, \ TraversalStrategy, T from gremlin_python.process.graph_traversal import GraphTraversal from gremlin_python.structure.graph import Graph, Edge, Property, Vertex, VertexProperty, Path @@ -96,6 +96,7 @@ class DataType(Enum): tree = 0x2b # not supported - no tree object in Python yet metrics = 0x2c traversalmetrics = 0x2d + merge = 0x2e char = 0x80 duration = 0x81 inetaddress = 0x82 # todo @@ -850,6 +851,11 @@ class PSerializer(_GraphBinaryTypeIO): return to_extend +class MergeIO(_EnumIO): + graphbinary_type = DataType.merge + python_type = Merge + + class ScopeIO(_EnumIO): graphbinary_type = DataType.scope python_type = Scope diff --git a/gremlin-python/src/main/python/radish/feature_steps.py b/gremlin-python/src/main/python/radish/feature_steps.py index 66bfc45..560bc30 100644 --- a/gremlin-python/src/main/python/radish/feature_steps.py +++ b/gremlin-python/src/main/python/radish/feature_steps.py @@ -20,7 +20,7 @@ import json import re from gremlin_python.statics import long -from gremlin_python.structure.graph import Path +from gremlin_python.structure.graph import Path, Vertex from gremlin_python.process.anonymous_traversal import traversal from gremlin_python.process.graph_traversal import __ from gremlin_python.process.traversal import Barrier, Cardinality, P, TextP, Pop, Scope, Column, Order, Direction, T, Pick, Operator, IO, WithOptions @@ -73,6 +73,7 @@ def add_parameter(step, param_name, param): step.context.traversal_params = {} step.context.traversal_params[param_name] = _convert(param.replace('\\"', '"'), step.context) + print(step.context.traversal_params[param_name]) @given("the traversal of") @@ -221,7 +222,11 @@ def __find_cached_element(ctx, graph_name, identifier, element_type): else: cache = ctx.lookup_v[graph_name] if element_type == "v" else ctx.lookup_e[graph_name] - return cache[identifier] + # try to lookup the element - if it can't be found then it must be a reference Vertex + if cache.__contains__(identifier): + return cache[identifier] + else: + return Vertex(identifier) def _convert_results(val): diff --git a/gremlin-python/src/main/python/radish/gremlin.py b/gremlin-python/src/main/python/radish/gremlin.py index 7f4a084..8f9368d 100644 --- a/gremlin-python/src/main/python/radish/gremlin.py +++ b/gremlin-python/src/main/python/radish/gremlin.py @@ -29,7 +29,7 @@ from gremlin_python.process.anonymous_traversal import traversal from gremlin_python.process.traversal import TraversalStrategy from gremlin_python.process.graph_traversal import __ from gremlin_python.structure.graph import Graph -from gremlin_python.process.traversal import Barrier, Cardinality, P, TextP, Pop, Scope, Column, Order, Direction, T, Pick, Operator, IO, WithOptions +from gremlin_python.process.traversal import Barrier, Cardinality, P, TextP, Pop, Scope, Column, Order, Direction, Merge, T, Pick, Operator, IO, WithOptions world.gremlins = { 'g_V_branchXlabel_eq_person__a_bX_optionXa__ageX_optionXb__langX_optionXb__nameX': [(lambda g, l1=None:g.V().branch(l1).option('a',__.age).option('b',__.lang).option('b',__.name))], @@ -804,7 +804,6 @@ world.gremlins = { 'g_V_outXfollowedByX_group_byXsongTypeX_byXbothE_group_byXlabelX_byXweight_sumXX': [(lambda g:g.V().out('followedBy').group().by('songType').by(__.bothE().group().by(T.label).by(__.weight.sum_())))], 'g_V_groupXmX_byXnameX_byXinXknowsX_nameX_capXmX': [(lambda g:g.V().group('m').by('name').by(__.in_('knows').name).cap('m'))], 'g_V_group_byXlabelX_byXbothE_groupXaX_byXlabelX_byXweight_sumX_weight_sumX': [(lambda g:g.V().group().by(T.label).by(__.bothE().group('a').by(T.label).by(__.weight.sum_()).weight.sum_()))], - 'g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX': [(lambda g, xx1=None:g.withSideEffect('a',xx1).V().group('a').by('name').by(__.outE().label().fold()).cap('a').unfold().group().by(Column.keys).by(__.select(Column.values).order(Scope.local).by(Order.asc)))], 'g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX': [(lambda g:g.V().hasLabel('person').as_('p').out('created').group().by('name').by(__.select('p').age.sum_()))], 'g_V_hasLabelXpersonX_asXpX_outXcreatedX_groupXaX_byXnameX_byXselectXpX_valuesXageX_sumX_capXaX': [(lambda g:g.V().hasLabel('person').as_('p').out('created').group('a').by('name').by(__.select('p').age.sum_()).cap('a'))], 'g_V_group_byXlabelX_byXlabel_countX': [(lambda g:g.V().group().by(__.label()).by(__.label().count()))], @@ -827,7 +826,7 @@ world.gremlins = { 'g_V_hasXperson_name_markoX_bothXknowsX_groupCount_byXvaluesXnameX_foldX': [(lambda g:g.V().has('person','name','marko').both('knows').groupCount().by(__.name.fold()))], 'g_VX1X_out_injectXv2X_name': [(lambda g, vid1=None,v2=None:g.V(vid1).out().inject(v2).name)], 'g_VX1X_out_name_injectXdanielX_asXaX_mapXlengthX_path': [(lambda g, l1=None,vid1=None:g.V(vid1).out().name.inject('daniel').as_('a').map(l1).path())], - 'g_VX1X_injectXg_VX4XX_out_name': [(lambda g, vid1=None,v4=None:g.V(vid1).inject(v4).out().name)], + 'g_VX1X_injectXg_VX4XX_out_name': [(lambda g, vid1=None,v2=None:g.V(vid1).inject(v2).out().name)], 'g_injectXnull_1_3_nullX': [(lambda g:g.inject(None,1,3,None))], 'g_injectX10_20_null_20_10_10X_groupCountXxX_dedup_asXyX_projectXa_bX_by_byXselectXxX_selectXselectXyXXX': [(lambda g:g.inject(10,20,None,20,10,10).groupCount('x').dedup().as_('y').project('a','b').by().by(__.select('x').select(__.select('y'))))], 'g_injectXname_marko_age_nullX_selectXname_ageX': [(lambda g, xx1=None:g.inject(xx1).select('name','age'))], diff --git a/gremlin-test/features/sideEffect/Group.feature b/gremlin-test/features/sideEffect/Group.feature index b8e7b5c..01a5a21 100644 --- a/gremlin-test/features/sideEffect/Group.feature +++ b/gremlin-test/features/sideEffect/Group.feature @@ -264,17 +264,17 @@ Feature: Step - group() | m[{"software":"d[2.0].d", "person":"d[5.0].d"}] | # The post-ordering really isn't really right but works around TINKERPOP-2600 - Scenario: g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX - Given the modern graph - And using the parameter xx1 defined as "m[{\"marko\":l[\"666\"], \"noone\":l[\"blah\"]}]" - And the traversal of - """ - g.withSideEffect("a", xx1).V().group("a").by("name").by(__.outE().label().fold()).cap("a").unfold().group().by(keys).by(select(values).order(Scope.local).by(Order.asc)) - """ - When iterated to list - Then the result should be unordered - | result | - | m[{"ripple":[], "peter":["created"], "noone":["blah"], "vadas":[], "josh":["created", "created"], "lop":[], "marko":["666", "created", "knows", "knows"]}] | +# Scenario: g_withSideEffectXa__marko_666_noone_blahX_V_groupXaX_byXnameX_byXoutE_label_foldX_capXaX +# Given the modern graph +# And using the parameter xx1 defined as "m[{\"marko\":\"l[\"666\"]\", \"noone\":\"l[\"blah\"]\"}]" +# And the traversal of +# """ +# g.withSideEffect("a", xx1).V().group("a").by("name").by(__.outE().label().fold()).cap("a").unfold().group().by(Column.keys).by(select(Column.values).order(Scope.local).by(Order.asc)) +# """ +# When iterated to list +# Then the result should be unordered +# | result | +# | m[{"ripple":[], "peter":["created"], "noone":["blah"], "vadas":[], "josh":["created", "created"], "lop":[], "marko":["666", "created", "knows", "knows"]}] | @GraphComputerVerificationStarGraphExceeded Scenario: g_V_hasLabelXpersonX_asXpX_outXcreatedX_group_byXnameX_byXselectXpX_valuesXageX_sumX diff --git a/gremlin-test/features/sideEffect/Inject.feature b/gremlin-test/features/sideEffect/Inject.feature index a186095..75edc15 100644 --- a/gremlin-test/features/sideEffect/Inject.feature +++ b/gremlin-test/features/sideEffect/Inject.feature @@ -51,13 +51,14 @@ Feature: Step - inject() | p[v[marko],v[vadas],vadas,d[5].i] | | p[v[marko],v[josh],josh,d[4].i] | + @GraphComputerVerificationInjectionNotSupported Scenario: g_VX1X_injectXg_VX4XX_out_name Given the modern graph And using the parameter vid1 defined as "v[marko].id" - And using the parameter v4 defined as "v[josh]" + And using the parameter v2 defined as "v[josh]" And the traversal of """ - g.V(vid1).inject(v4).out().values("name") + g.V(vid1).inject(v2).out().values("name") """ When iterated to list Then the result should be unordered @@ -130,7 +131,6 @@ Feature: Step - inject() | result | | null | - Scenario: g_inject Given the empty graph And the traversal of @@ -140,7 +140,6 @@ Feature: Step - inject() When iterated to list Then the result should be empty - @GraphComputerVerificationInjectionNotSupported Scenario: g_VX1X_valuesXageX_injectXnull_nullX Given the modern graph And using the parameter xx1 defined as "v[marko].id" diff --git a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java index ea5eed3..d896228 100644 --- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java +++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/features/StepDefinition.java @@ -125,7 +125,7 @@ public final class StepDefinition { add(Pair.with(Pattern.compile("v\\[(.+)\\]\\.sid"), s -> g.V().has("name", s).id().next().toString())); add(Pair.with(Pattern.compile("v\\[(.+)\\]"), s -> { final Iterator<Object> itty = g.V().has("name", s).id(); - return String.format("new Vertex(\"%s\",\"%s\")", itty.hasNext() ? itty.next() : s, Vertex.DEFAULT_LABEL); + return String.format("new Vertex(%s,\"%s\")", itty.hasNext() ? itty.next() : s, Vertex.DEFAULT_LABEL); })); add(Pair.with(Pattern.compile("e\\[(.+)\\]\\.id"), s -> getEdgeIdString(g, s))); add(Pair.with(Pattern.compile("e\\[(.+)\\]\\.sid"), s -> getEdgeIdString(g, s))); @@ -138,9 +138,6 @@ public final class StepDefinition { add(Pair.with(Pattern.compile("c\\[(.*)\\]"), s -> { throw new AssumptionViolatedException("This test uses a lambda as a parameter which is not supported by gremlin-language"); })); - add(Pair.with(Pattern.compile("v\\[(.+)\\]"), s -> { - throw new AssumptionViolatedException("This test uses a Vertex as a parameter which is not supported by gremlin-language"); - })); add(Pair.with(Pattern.compile("e\\[(.+)\\]"), s -> { throw new AssumptionViolatedException("This test uses a Edge as a parameter which is not supported by gremlin-language"); })); diff --git a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/map/TinkerMergeVertexStep.java b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/map/TinkerMergeVertexStep.java index 5876879..6771ebd 100644 --- a/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/map/TinkerMergeVertexStep.java +++ b/tinkergraph-gremlin/src/main/java/org/apache/tinkerpop/gremlin/tinkergraph/process/traversal/step/map/TinkerMergeVertexStep.java @@ -42,6 +42,7 @@ public class TinkerMergeVertexStep<S> extends MergeVertexStep<S> { super(step.getTraversal(), step.isStart(), step.getSearchCreateTraversal()); if (step.getOnMatchTraversal() != null) this.addChildOption(Merge.onMatch, step.getOnMatchTraversal()); if (step.getOnCreateTraversal() != null) this.addChildOption(Merge.onCreate, step.getOnCreateTraversal()); + if (step.getCallbackRegistry() != null) this.callbackRegistry = step.getCallbackRegistry(); } @Override diff --git a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java index 7d6f820..46856f8 100644 --- a/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java +++ b/tinkergraph-gremlin/src/test/java/org/apache/tinkerpop/gremlin/tinkergraph/TinkerGraphWorld.java @@ -106,6 +106,7 @@ public class TinkerGraphWorld implements World { private static final List<String> TAGS_TO_IGNORE = Arrays.asList( "@StepDrop", + "@StepInject", "@StepV", "@GraphComputerVerificationOneBulk", "@GraphComputerVerificationStrategyNotSupported",
