This is an automated email from the ASF dual-hosted git repository. colegreer pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
The following commit(s) were added to refs/heads/master by this push: new 7294ae70d3 CTR Fix UUID arg handling in GremlinLang 7294ae70d3 is described below commit 7294ae70d381232e09b27b9023816e2ae98b6df7 Author: Cole-Greer <cole.gr...@improving.com> AuthorDate: Wed Sep 10 15:47:04 2025 -0700 CTR Fix UUID arg handling in GremlinLang --- .../gremlin/language/translator/GroovyTranslateVisitor.java | 12 ++++++++++++ .../gremlin/language/translator/JavaTranslateVisitor.java | 12 ++++++++++++ .../tinkerpop/gremlin/process/traversal/GremlinLang.java | 5 +++++ .../gremlin/language/translator/GremlinTranslatorTest.java | 8 ++++---- .../tinkerpop/gremlin/process/traversal/GremlinLangTest.java | 2 ++ .../javascript/gremlin-javascript/test/cucumber/gremlin.js | 4 ++-- 6 files changed, 37 insertions(+), 6 deletions(-) diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java index cf3aafd5e2..e2bb9df27e 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/GroovyTranslateVisitor.java @@ -128,6 +128,18 @@ public class GroovyTranslateVisitor extends TranslateVisitor { return null; } + @Override + public Void visitUuidLiteral(final GremlinParser.UuidLiteralContext ctx) { + if (ctx.stringLiteral() == null) { + sb.append("UUID.randomUUID()"); + return null; + } + sb.append("UUID.fromString("); + sb.append(ctx.stringLiteral().getText()); + sb.append(")"); + return null; + } + @Override public Void visitNullLiteral(final GremlinParser.NullLiteralContext ctx) { if (ctx.getParent() instanceof GremlinParser.GenericMapNullableArgumentContext) { diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java index 55a20298d4..d798afbacd 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/language/translator/JavaTranslateVisitor.java @@ -246,6 +246,18 @@ public class JavaTranslateVisitor extends AbstractTranslateVisitor { return null; } + @Override + public Void visitUuidLiteral(final GremlinParser.UuidLiteralContext ctx) { + if (ctx.stringLiteral() == null) { + sb.append("UUID.randomUUID()"); + return null; + } + sb.append("UUID.fromString("); + sb.append(ctx.stringLiteral().getText()); + sb.append(")"); + return null; + } + @Override public Void visitGenericRangeLiteral(final GremlinParser.GenericRangeLiteralContext ctx) { throw new TranslatorException("Java does not support range literals"); diff --git a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java index 3ec2494766..9eb81c1192 100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLang.java @@ -46,6 +46,7 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.UUID; import java.util.concurrent.atomic.AtomicInteger; import static org.apache.tinkerpop.gremlin.util.DatetimeHelper.format; @@ -138,6 +139,10 @@ public class GremlinLang implements Cloneable, Serializable { if (arg instanceof OffsetDateTime) return String.format("datetime(\"%s\")", format(((OffsetDateTime) arg).toInstant())); + if (arg instanceof UUID) { + return String.format("UUID(\"%s\")", arg); + } + if (arg instanceof Enum) { // special handling for enums with additional interfaces if (arg instanceof T) diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java index 57c1050cf4..0a0c896535 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/language/translator/GremlinTranslatorTest.java @@ -157,8 +157,8 @@ public class GremlinTranslatorTest { "g.inject(string0)", "g.Inject<object>(Guid.Parse(\"f47af10b-58cc-4372-a567-0f02b2f3d479\"))", "g.Inject(uuid.MustParse(\"f47af10b-58cc-4372-a567-0f02b2f3d479\"))", - null, - null, + "g.inject(UUID.fromString(\"f47af10b-58cc-4372-a567-0f02b2f3d479\"))", + "g.inject(UUID.fromString(\"f47af10b-58cc-4372-a567-0f02b2f3d479\"))", "g.inject(\"f47af10b-58cc-4372-a567-0f02b2f3d479\")", "g.inject(uuid.UUID('f47af10b-58cc-4372-a567-0f02b2f3d479'))"}, {"g.inject(UUID())", @@ -166,8 +166,8 @@ public class GremlinTranslatorTest { "g.inject(string0)", "g.Inject<object>(Guid.NewGuid())", "g.Inject(uuid.New())", - null, - null, + "g.inject(UUID.randomUUID())", + "g.inject(UUID.randomUUID())", "g.inject(uuid.v4())", "g.inject(uuid.uuid4())"}, {"g.with(\"x\n\\\"yz\")", diff --git a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLangTest.java b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLangTest.java index a6a6636d9f..09a8a21101 100644 --- a/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLangTest.java +++ b/gremlin-core/src/test/java/org/apache/tinkerpop/gremlin/process/traversal/GremlinLangTest.java @@ -41,6 +41,7 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.UUID; import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal; import static org.apache.tinkerpop.gremlin.process.traversal.Scope.local; @@ -88,6 +89,7 @@ public class GremlinLangTest { {g.inject(asMap("age", VertexProperty.Cardinality.list(33))), "g.inject([\"age\":Cardinality.list(33)])"}, {g.inject(new HashMap<>()), "g.inject([:])"}, + {g.inject(UUID.fromString("bfa9bbe8-c3a3-4017-acc3-cd02dda55e3e")), "g.inject(UUID(\"bfa9bbe8-c3a3-4017-acc3-cd02dda55e3e\"))"}, {g.V(1).out("knows").values("name"), "g.V(1).out(\"knows\").values(\"name\")"}, {g.V().has(T.label, "person"), "g.V().has(T.label,\"person\")"}, {g.addE("knows").from(new DetachedVertex(1, "test1", Collections.emptyList())).to(new DetachedVertex(6, "test2", Collections.emptyList())), 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 0d0c25ea21..44f0e3c5c2 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 @@ -1221,8 +1221,8 @@ const gremlins = { g_mergeVXname_aliceX_optionXonCreate_age_setX81XX: [function({g}) { return g.mergeV(new Map([["name", "alice"], [T.label, "person"]])).option(Merge.onCreate, new Map([["age", CardinalityValue.set(81)]])) }, function({g}) { return g.V().has("person", "name", "alice").has("age", 81) }, function({g}) { return g.V().has("person", "name", "alice").has("age") }, function({g}) { return g.V().has("person", "name", "alice").properties("age") }], g_mergeVXname_aliceX_optionXonCreate_age_singleX81X_age_81_setX: [function({g}) { return g.mergeV(new Map([["name", "alice"], [T.label, "person"]])).option(Merge.onCreate, new Map([["age", 81]]), Cardinality.set) }, function({g}) { return g.V().has("person", "name", "alice").has("age", 81) }, function({g}) { return g.V().has("person", "name", "alice").has("age") }, function({g}) { return g.V().has("person", "name", "alice").properties("age") }], g_mergeV_hidden_label_key_onMatch_matched_prohibited: [function({g, xx1}) { return g.mergeV(new Map([])).option(Merge.onMatch, xx1) }], - g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match: [function({g}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g}) { return g.inject(new Map([[T.label, "person"], ["name", "marko"]]), new Map([[T.label, "person"], ["name", "marko"]]), new Map([["created", "N"]])).fold().as("m").mergeV(__.select("m").limit(Scope.l [...] - g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create: [function({g}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g}) { return g.inject(new Map([[T.label, "person"], ["name", "stephen"]]), new Map([[T.label, "person"], ["name", "stephen"]]), new Map([["created", "N"]])).fold().as("m").mergeV(__.select("m").limit(Sc [...] + g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_match: [function({g, xx1, xx2}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g, xx1, xx2}) { return g.inject(xx1, xx1, xx2).fold().as("m").mergeV(__.select("m").limit(Scope.local, 1).unfold()).option(Merge.onCreate, __.select("m").range(Scope.local, 1, 2).unfold()).opti [...] + g_injectXlist1_list2_list3X_fold_asXmX_mergeVXselectXmX_limitXlocal_1X_unfoldX_optionXonCreate_selectXmX_rangeXlocal_1_2X_unfoldX_optionXonMatch_selectXmX_tailXlocalX_unfoldX_to_create: [function({g, xx1, xx2}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g, xx1, xx2}) { return g.inject(xx1, xx1, xx2).fold().as("m").mergeV(__.select("m").limit(Scope.local, 1).unfold()).option(Merge.onCreate, __.select("m").range(Scope.local, 1, 2).unfold()).opt [...] g_mergeVXlabel_person_name_marko_age_29X_optionXonMatch_age_nullX_allowed: [function({g, xx1, xx2}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g, xx1, xx2}) { return g.mergeV(xx1).option(Merge.onMatch, xx2) }, function({g, xx1, xx2}) { return g.V() }, function({g, xx1, xx2}) { return g.V().has("person", "name", "marko").has("age", null) }], g_mergeVXlabel_person_name_marko_age_29X_optionXonMatch_age_nullX: [function({g, xx1, xx2}) { return g.addV("person").property("name", "marko").property("age", 29) }, function({g, xx1, xx2}) { return g.mergeV(xx1).option(Merge.onMatch, xx2) }, function({g, xx1, xx2}) { return g.V() }, function({g, xx1, xx2}) { return g.V().has("person", "name", "marko").has("age") }], g_V_age_min: [function({g}) { return g.V().values("age").min() }],