This is an automated email from the ASF dual-hosted git repository. colegreer pushed a commit to branch miscGremlinLangGBandResultSetFixes in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 65835a8430638a9d065257e6e3dd78cfec8da4c6 Author: Cole Greer <[email protected]> AuthorDate: Mon Mar 30 13:54:08 2026 -0700 Misc .Net fixes Automatically box non-Traverser results into Traverser's in ResultSet. If the server is sending bulked results, this boxing happens automatically during deserialization, but if results are unboxed, they come back as raw results (Vertex, Edge, Map...). ResultSet assumes that all results are wrapped in Traverser's, so this change adds an extra check to ensure all results become boxed. Fixes precision of DateTimes in GremlinLang. The format used when converting datetimes to strings in GremlinLang was rounding to the nearest second, where millisecond precision is expected. Both the format and tests have been updated to include millis. --- .../src/Gremlin.Net/Driver/Connection.cs | 11 +++++-- .../Gremlin.Net/Process/Traversal/GremlinLang.cs | 2 +- gremlin-dotnet/src/pom.xml | 7 ++--- .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 4 +-- .../Process/Traversal/GremlinLangTests.cs | 14 ++++----- gremlin-dotnet/test/pom.xml | 7 ++--- gremlin-go/driver/cucumber/gremlin.go | 4 +-- .../gremlin-javascript/test/cucumber/gremlin.js | 4 +-- .../src/main/python/tests/feature/gremlin.py | 4 +-- .../gremlin/language/translator/translations.json | 36 +++++++++++----------- .../gremlin/test/features/data/DateTime.feature | 8 ++--- 11 files changed, 52 insertions(+), 49 deletions(-) diff --git a/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs b/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs index 84ec963d40..415513918c 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Driver/Connection.cs @@ -32,6 +32,7 @@ using System.Threading; using System.Threading.Tasks; using Gremlin.Net.Driver.Messages; using Gremlin.Net.Process; +using Gremlin.Net.Process.Traversal; using Gremlin.Net.Structure.IO; namespace Gremlin.Net.Driver @@ -237,9 +238,13 @@ namespace Gremlin.Net.Driver private static ResultSet<T> BuildResultSet<T>(ResponseMessage<List<object>> responseMessage) { - return new ResultSet<T>( - responseMessage.Result.Cast<T>().ToList(), - new Dictionary<string, object>()); + var results = typeof(T) == typeof(Traverser) + ? responseMessage.Result + .Select(item => item is Traverser ? item : (object)new Traverser(item)) + .Cast<T>().ToList() + : responseMessage.Result.Cast<T>().ToList(); + + return new ResultSet<T>(results, new Dictionary<string, object>()); } /// <summary> diff --git a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs index f6df5bc87b..aa5a975879 100644 --- a/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs +++ b/gremlin-dotnet/src/Gremlin.Net/Process/Traversal/GremlinLang.cs @@ -233,7 +233,7 @@ namespace Gremlin.Net.Process.Traversal return $"{decimalVal.ToString(CultureInfo.InvariantCulture)}M"; if (arg is DateTimeOffset dto) - return $"datetime(\"{dto.ToUniversalTime():yyyy-MM-ddTHH:mm:ssZ}\")"; + return $"datetime(\"{dto.ToUniversalTime():yyyy-MM-ddTHH:mm:ss.fffZ}\")"; if (arg is Guid guid) return $"UUID(\"{guid}\")"; diff --git a/gremlin-dotnet/src/pom.xml b/gremlin-dotnet/src/pom.xml index 69b75d4ddb..50a3b2a521 100644 --- a/gremlin-dotnet/src/pom.xml +++ b/gremlin-dotnet/src/pom.xml @@ -121,10 +121,9 @@ limitations under the License. <id>gremlin-dotnet</id> <activation> <activeByDefault>false</activeByDefault> - <!-- TODO re-enable after gremlin-dotnet is implemented --> -<!-- <file>--> -<!-- <exists>.glv</exists>--> -<!-- </file>--> + <file> + <exists>.glv</exists> + </file> </activation> <properties> <packaging.type>dotnet-library</packaging.type> diff --git a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs index d9b871d889..2efd471c8e 100644 --- a/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs +++ b/gremlin-dotnet/test/Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs @@ -237,11 +237,11 @@ namespace Gremlin.Net.IntegrationTest.Gherkin {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime))}}, {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_project_byXidentityX_byXdateAddXDT_dayX1XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Project<object>("original", "nextDay").By(__.Identity()).By(__.DateAdd(DT.Day, 1))}}, {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_dateDiffXdatetimeX2023_08_10XX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).DateDiff(DateTimeOffset.Parse("2023-08-08T00:00:30Z"))}}, - {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Where(__.Is(P.Gt(DateTimeOffset.Parse("2020-01-01T00:00Z"))))}}, + {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "event").Property("datetime", DateTimeOffset.Parse("2023-08-08T12:34:56Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Where(__.Is(P.Gt(DateTimeOffset.Parse("2020-01-01T00:00Z"))))}}, {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_chooseXisXeqXdatetimeX2023_08_08XXXX_constantXmatchX_constantXnoMatchXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Choose<object>(__.Is(P.Eq(DateTimeOffset.Parse("2023-08-08T00:00Z"))), __.Constant<object>("match"), __.Co [...] {"g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_localXaggregateXaX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "event").Property("datetime", DateTimeOffset.Parse("2023-08-08T00:00Z")), (g,p) =>g.V().Values<object>("datetime").Is(P.TypeOf(GType.DateTime)).Local<object>(__.Aggregate("a")).Cap<object>("a")}}, {"g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_aggregateXaX_capXaX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.Parse("2023-08-08T00:00Z")).Is(P.TypeOf(GType.DateTime)).Aggregate("a").Cap<object>("a")}}, - {"g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.Parse("2023-08-08T00:00Z")).Is(P.TypeOf(GType.DateTime)).GroupCount<object>()}}, + {"g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.Inject<object>(DateTimeOffset.Parse("2023-08-08T12:34:56Z")).Is(P.TypeOf(GType.DateTime)).GroupCount<object>()}}, {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "data").Property("double", 1.5d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double))}}, {"g_E_valuesXweightX_isXtypeOfXGType_DOUBLEXX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.E().Values<object>("weight").Is(P.TypeOf(GType.Double))}}, {"g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_mathXceilX", new List<Func<GraphTraversalSource, IDictionary<string, object>, ITraversal>> {(g,p) =>g.AddV((string) "data").Property("double", 2.7d), (g,p) =>g.V().Values<object>("double").Is(P.TypeOf(GType.Double)).Math("ceil _")}}, diff --git a/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/GremlinLangTests.cs b/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/GremlinLangTests.cs index f1a78c1ae2..3167499c45 100644 --- a/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/GremlinLangTests.cs +++ b/gremlin-dotnet/test/Gremlin.Net.UnitTest/Process/Traversal/GremlinLangTests.cs @@ -470,14 +470,14 @@ namespace Gremlin.Net.UnitTest.Process.Traversal [Fact] public void g_AddV_test_Property_date_DateTimeOffset() { - Assert.Equal("g.addV(\"test\").property(\"date\",datetime(\"2021-02-01T09:30:00Z\"))", + Assert.Equal("g.addV(\"test\").property(\"date\",datetime(\"2021-02-01T09:30:00.000Z\"))", _g.AddV("test").Property("date", new DateTimeOffset(2021, 2, 1, 9, 30, 0, TimeSpan.Zero)).GremlinLang.GetGremlin()); } [Fact] public void g_AddV_test_Property_date_DateTimeOffset_midnight() { - Assert.Equal("g.addV(\"test\").property(\"date\",datetime(\"2021-02-01T00:00:00Z\"))", + Assert.Equal("g.addV(\"test\").property(\"date\",datetime(\"2021-02-01T00:00:00.000Z\"))", _g.AddV("test").Property("date", new DateTimeOffset(2021, 2, 1, 0, 0, 0, TimeSpan.Zero)).GremlinLang.GetGremlin()); } @@ -587,14 +587,14 @@ namespace Gremlin.Net.UnitTest.Process.Traversal [Fact] public void g_V_Has_date_DateTimeOffset() { - Assert.Equal("g.V().has(\"date\",datetime(\"2021-02-22T00:00:00Z\"))", + Assert.Equal("g.V().has(\"date\",datetime(\"2021-02-22T00:00:00.000Z\"))", _g.V().Has("date", new DateTimeOffset(2021, 2, 22, 0, 0, 0, TimeSpan.Zero)).GremlinLang.GetGremlin()); } [Fact] public void g_V_Has_date_Within_dates() { - Assert.Equal("g.V().has(\"date\",within([datetime(\"2021-02-22T00:00:00Z\"),datetime(\"2021-01-01T00:00:00Z\")]))", + Assert.Equal("g.V().has(\"date\",within([datetime(\"2021-02-22T00:00:00.000Z\"),datetime(\"2021-01-01T00:00:00.000Z\")]))", _g.V().Has("date", P.Within( new DateTimeOffset(2021, 2, 22, 0, 0, 0, TimeSpan.Zero), new DateTimeOffset(2021, 1, 1, 0, 0, 0, TimeSpan.Zero))).GremlinLang.GetGremlin()); @@ -603,7 +603,7 @@ namespace Gremlin.Net.UnitTest.Process.Traversal [Fact] public void g_V_Has_date_Between_dates() { - Assert.Equal("g.V().has(\"date\",between(datetime(\"2021-01-01T00:00:00Z\"),datetime(\"2021-02-22T00:00:00Z\")))", + Assert.Equal("g.V().has(\"date\",between(datetime(\"2021-01-01T00:00:00.000Z\"),datetime(\"2021-02-22T00:00:00.000Z\")))", _g.V().Has("date", P.Between( new DateTimeOffset(2021, 1, 1, 0, 0, 0, TimeSpan.Zero), new DateTimeOffset(2021, 2, 22, 0, 0, 0, TimeSpan.Zero))).GremlinLang.GetGremlin()); @@ -612,7 +612,7 @@ namespace Gremlin.Net.UnitTest.Process.Traversal [Fact] public void g_V_Has_date_Inside_dates() { - Assert.Equal("g.V().has(\"date\",inside(datetime(\"2021-01-01T00:00:00Z\"),datetime(\"2021-02-22T00:00:00Z\")))", + Assert.Equal("g.V().has(\"date\",inside(datetime(\"2021-01-01T00:00:00.000Z\"),datetime(\"2021-02-22T00:00:00.000Z\")))", _g.V().Has("date", P.Inside( new DateTimeOffset(2021, 1, 1, 0, 0, 0, TimeSpan.Zero), new DateTimeOffset(2021, 2, 22, 0, 0, 0, TimeSpan.Zero))).GremlinLang.GetGremlin()); @@ -621,7 +621,7 @@ namespace Gremlin.Net.UnitTest.Process.Traversal [Fact] public void g_V_Has_date_Gt_DateTimeOffset() { - Assert.Equal("g.V().has(\"date\",gt(datetime(\"2021-01-01T09:30:00Z\")))", + Assert.Equal("g.V().has(\"date\",gt(datetime(\"2021-01-01T09:30:00.000Z\")))", _g.V().Has("date", P.Gt(new DateTimeOffset(2021, 1, 1, 9, 30, 0, TimeSpan.Zero))).GremlinLang.GetGremlin()); } diff --git a/gremlin-dotnet/test/pom.xml b/gremlin-dotnet/test/pom.xml index 4e18f40088..a546d7f8a1 100644 --- a/gremlin-dotnet/test/pom.xml +++ b/gremlin-dotnet/test/pom.xml @@ -76,10 +76,9 @@ limitations under the License. <id>gremlin-dotnet</id> <activation> <activeByDefault>false</activeByDefault> - <!-- TODO re-enable after gremlin-dotnet is implemented --> -<!-- <file>--> -<!-- <exists>.glv</exists>--> -<!-- </file>--> + <file> + <exists>.glv</exists> + </file> </activation> <build> <finalName>${project.artifactId}-${project.version}</finalName> diff --git a/gremlin-go/driver/cucumber/gremlin.go b/gremlin-go/driver/cucumber/gremlin.go index bfa80b3fa1..069e508ada 100644 --- a/gremlin-go/driver/cucumber/gremlin.go +++ b/gremlin-go/driver/cucumber/gremlin.go @@ -207,11 +207,11 @@ var translationMap = map[string][]func(g *gremlingo.GraphTraversalSource, p map[ "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("event").Property("datetime", time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0)))}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("datetime").Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime))}}, "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_project_byXidentityX_byXdateAddXDT_dayX1XX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("event").Property("datetime", time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0)))}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("datetime").Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).Project("orig [...] "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_dateDiffXdatetimeX2023_08_10XX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("event").Property("datetime", time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0)))}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("datetime").Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).DateDiff(time.Date(2023, [...] - "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("event").Property("datetime", time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0)))}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("datetime").Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).Where(gremlingo.T__. [...] + "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("event").Property("datetime", time.Date(2023, 8, 8, 12, 34, 56, 0, time.FixedZone("UTC+00:00", 0)))}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("datetime").Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).Where(gremlingo.T [...] "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_chooseXisXeqXdatetimeX2023_08_08XXXX_constantXmatchX_constantXnoMatchXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("event").Property("datetime", time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0)))}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("datetime").Is(gremlingo.P.TypeOf(gremlingo.G [...] "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_localXaggregateXaX_capXaX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("event").Property("datetime", time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0)))}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("datetime").Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).Local(gremlingo.T__.Aggregate( [...] "g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_aggregateXaX_capXaX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0))).Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).Aggregate("a").Cap("a")}}, - "g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone("UTC+00:00", 0))).Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).GroupCount()}}, + "g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.Inject(time.Date(2023, 8, 8, 12, 34, 56, 0, time.FixedZone("UTC+00:00", 0))).Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).GroupCount()}}, "g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("data").Property("double", 1.5)}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("double").Is(gremlingo.P.TypeOf(gremlingo.GType.Double))}}, "g_E_valuesXweightX_isXtypeOfXGType_DOUBLEXX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.E().Values("weight").Is(gremlingo.P.TypeOf(gremlingo.GType.Double))}}, "g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_mathXceilX": {func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.AddV("data").Property("double", 2.7)}, func(g *gremlingo.GraphTraversalSource, p map[string]interface{}) *gremlingo.GraphTraversal {return g.V().Values("double").Is(gremlingo.P.TypeOf(gremlingo.GType.Double)).Math("ceil _")}}, diff --git a/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js b/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js index 008c9d96df..66138f47f6 100644 --- a/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js +++ b/gremlin-js/gremlin-javascript/test/cucumber/gremlin.js @@ -238,11 +238,11 @@ const gremlins = { g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX: [function({g}) { return g.addV("event").property("datetime", new Date('2023-08-08T00:00Z')) }, function({g}) { return g.V().values("datetime").is(P.typeOf(GType.datetime)) }], g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_project_byXidentityX_byXdateAddXDT_dayX1XX: [function({g}) { return g.addV("event").property("datetime", new Date('2023-08-08T00:00Z')) }, function({g}) { return g.V().values("datetime").is(P.typeOf(GType.datetime)).project("original", "nextDay").by(__.identity()).by(__.dateAdd(DT.day, 1)) }], g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_dateDiffXdatetimeX2023_08_10XX: [function({g}) { return g.addV("event").property("datetime", new Date('2023-08-08T00:00Z')) }, function({g}) { return g.V().values("datetime").is(P.typeOf(GType.datetime)).dateDiff(new Date('2023-08-08T00:00:30Z')) }], - g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX: [function({g}) { return g.addV("event").property("datetime", new Date('2023-08-08T00:00Z')) }, function({g}) { return g.V().values("datetime").is(P.typeOf(GType.datetime)).where(__.is(P.gt(new Date('2020-01-01T00:00Z')))) }], + g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX: [function({g}) { return g.addV("event").property("datetime", new Date('2023-08-08T12:34:56Z')) }, function({g}) { return g.V().values("datetime").is(P.typeOf(GType.datetime)).where(__.is(P.gt(new Date('2020-01-01T00:00Z')))) }], g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_chooseXisXeqXdatetimeX2023_08_08XXXX_constantXmatchX_constantXnoMatchXX: [function({g}) { return g.addV("event").property("datetime", new Date('2023-08-08T00:00Z')) }, function({g}) { return g.V().values("datetime").is(P.typeOf(GType.datetime)).choose(__.is(P.eq(new Date('2023-08-08T00:00Z'))), __.constant("match"), __.constant("noMatch")) }], g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_localXaggregateXaX_capXaX: [function({g}) { return g.addV("event").property("datetime", new Date('2023-08-08T00:00Z')) }, function({g}) { return g.V().values("datetime").is(P.typeOf(GType.datetime)).local(__.aggregate("a")).cap("a") }], g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_aggregateXaX_capXaX: [function({g}) { return g.inject(new Date('2023-08-08T00:00Z')).is(P.typeOf(GType.datetime)).aggregate("a").cap("a") }], - g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount: [function({g}) { return g.inject(new Date('2023-08-08T00:00Z')).is(P.typeOf(GType.datetime)).groupCount() }], + g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount: [function({g}) { return g.inject(new Date('2023-08-08T12:34:56Z')).is(P.typeOf(GType.datetime)).groupCount() }], g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX: [function({g}) { return g.addV("data").property("double", 1.5) }, function({g}) { return g.V().values("double").is(P.typeOf(GType.double)) }], g_E_valuesXweightX_isXtypeOfXGType_DOUBLEXX: [function({g}) { return g.E().values("weight").is(P.typeOf(GType.double)) }], g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_mathXceilX: [function({g}) { return g.addV("data").property("double", 2.7) }, function({g}) { return g.V().values("double").is(P.typeOf(GType.double)).math("ceil _") }], diff --git a/gremlin-python/src/main/python/tests/feature/gremlin.py b/gremlin-python/src/main/python/tests/feature/gremlin.py index e8f87ae80f..d1cfbf06ab 100644 --- a/gremlin-python/src/main/python/tests/feature/gremlin.py +++ b/gremlin-python/src/main/python/tests/feature/gremlin.py @@ -210,11 +210,11 @@ world.gremlins = { 'g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX': [(lambda g:g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))), (lambda g:g.V().values('datetime').is_(P.type_of(GType.DATETIME)))], 'g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_project_byXidentityX_byXdateAddXDT_dayX1XX': [(lambda g:g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))), (lambda g:g.V().values('datetime').is_(P.type_of(GType.DATETIME)).project('original', 'nextDay').by(__.identity()).by(__.date_add(DT.day, 1)))], 'g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_dateDiffXdatetimeX2023_08_10XX': [(lambda g:g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))), (lambda g:g.V().values('datetime').is_(P.type_of(GType.DATETIME)).date_diff(datetime.datetime.fromisoformat('2023-08-08T00:00:30+00:00')))], - 'g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX': [(lambda g:g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))), (lambda g:g.V().values('datetime').is_(P.type_of(GType.DATETIME)).where(__.is_(P.gt(datetime.datetime.fromisoformat('2020-01-01T00:00+00:00')))))], + 'g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX': [(lambda g:g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T12:34:56+00:00'))), (lambda g:g.V().values('datetime').is_(P.type_of(GType.DATETIME)).where(__.is_(P.gt(datetime.datetime.fromisoformat('2020-01-01T00:00+00:00')))))], 'g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_chooseXisXeqXdatetimeX2023_08_08XXXX_constantXmatchX_constantXnoMatchXX': [(lambda g:g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))), (lambda g:g.V().values('datetime').is_(P.type_of(GType.DATETIME)).choose(__.is_(P.eq(datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))), __.constant('match'), __.constant('noMatch')))], 'g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_localXaggregateXaX_capXaX': [(lambda g:g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))), (lambda g:g.V().values('datetime').is_(P.type_of(GType.DATETIME)).local(__.aggregate('a')).cap('a'))], 'g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_aggregateXaX_capXaX': [(lambda g:g.inject(datetime.datetime.fromisoformat('2023-08-08T00:00+00:00')).is_(P.type_of(GType.DATETIME)).aggregate('a').cap('a'))], - 'g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount': [(lambda g:g.inject(datetime.datetime.fromisoformat('2023-08-08T00:00+00:00')).is_(P.type_of(GType.DATETIME)).group_count())], + 'g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount': [(lambda g:g.inject(datetime.datetime.fromisoformat('2023-08-08T12:34:56+00:00')).is_(P.type_of(GType.DATETIME)).group_count())], 'g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX': [(lambda g:g.add_v('data').property('double', 1.5)), (lambda g:g.V().values('double').is_(P.type_of(GType.DOUBLE)))], 'g_E_valuesXweightX_isXtypeOfXGType_DOUBLEXX': [(lambda g:g.E().values('weight').is_(P.type_of(GType.DOUBLE)))], 'g_V_valuesXdoubleX_isXtypeOfXGType_DOUBLEXX_mathXceilX': [(lambda g:g.add_v('data').property('double', 2.7)), (lambda g:g.V().values('double').is_(P.type_of(GType.DOUBLE)).math('ceil _'))], diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json index 579faea9e3..04249b8786 100644 --- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json +++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/language/translator/translations.json @@ -3309,16 +3309,16 @@ "scenario": "g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_whereXisXgtXdatetimeX2020_01_01XXXX", "traversals": [ { - "original": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T00:00:00Z\"))", - "language": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T00:00:00Z\"))", - "canonical": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T00:00:00Z\"))", + "original": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T12:34:56Z\"))", + "language": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T12:34:56Z\"))", + "canonical": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T12:34:56Z\"))", "anonymized": "g.addV(string0).property(string1, offsetdatetime0)", - "dotnet": "g.AddV((string) \"event\").Property(\"datetime\", DateTimeOffset.Parse(\"2023-08-08T00:00Z\"))", - "go": "g.AddV(\"event\").Property(\"datetime\", time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone(\"UTC+00:00\", 0)))", - "groovy": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T00:00:00Z\"))", - "java": "g.addV(\"event\").property(\"datetime\", OffsetDateTime.parse(\"2023-08-08T00:00Z\"))", - "javascript": "g.addV(\"event\").property(\"datetime\", new Date('2023-08-08T00:00Z'))", - "python": "g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T00:00+00:00'))" + "dotnet": "g.AddV((string) \"event\").Property(\"datetime\", DateTimeOffset.Parse(\"2023-08-08T12:34:56Z\"))", + "go": "g.AddV(\"event\").Property(\"datetime\", time.Date(2023, 8, 8, 12, 34, 56, 0, time.FixedZone(\"UTC+00:00\", 0)))", + "groovy": "g.addV(\"event\").property(\"datetime\", datetime(\"2023-08-08T12:34:56Z\"))", + "java": "g.addV(\"event\").property(\"datetime\", OffsetDateTime.parse(\"2023-08-08T12:34:56Z\"))", + "javascript": "g.addV(\"event\").property(\"datetime\", new Date('2023-08-08T12:34:56Z'))", + "python": "g.add_v('event').property('datetime', datetime.datetime.fromisoformat('2023-08-08T12:34:56+00:00'))" }, { "original": "g.V().values(\"datetime\").is(P.typeOf(GType.DATETIME)).where(__.is(P.gt(datetime(\"2020-01-01T00:00:00Z\"))))", @@ -3413,16 +3413,16 @@ "scenario": "g_injectXdatetimeX_isXtypeOfXGType_DATETIMEXX_groupCount", "traversals": [ { - "original": "g.inject(datetime(\"2023-08-08T00:00:00Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", - "language": "g.inject(datetime(\"2023-08-08T00:00:00Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", - "canonical": "g.inject(datetime(\"2023-08-08T00:00:00Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", + "original": "g.inject(datetime(\"2023-08-08T12:34:56Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", + "language": "g.inject(datetime(\"2023-08-08T12:34:56Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", + "canonical": "g.inject(datetime(\"2023-08-08T12:34:56Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", "anonymized": "g.inject(offsetdatetime0).is(P.typeOf(GType.DATETIME)).groupCount()", - "dotnet": "g.Inject<object>(DateTimeOffset.Parse(\"2023-08-08T00:00Z\")).Is(P.TypeOf(GType.DateTime)).GroupCount<object>()", - "go": "g.Inject(time.Date(2023, 8, 8, 0, 0, 0, 0, time.FixedZone(\"UTC+00:00\", 0))).Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).GroupCount()", - "groovy": "g.inject(datetime(\"2023-08-08T00:00:00Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", - "java": "g.inject(OffsetDateTime.parse(\"2023-08-08T00:00Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", - "javascript": "g.inject(new Date('2023-08-08T00:00Z')).is(P.typeOf(GType.datetime)).groupCount()", - "python": "g.inject(datetime.datetime.fromisoformat('2023-08-08T00:00+00:00')).is_(P.type_of(GType.DATETIME)).group_count()" + "dotnet": "g.Inject<object>(DateTimeOffset.Parse(\"2023-08-08T12:34:56Z\")).Is(P.TypeOf(GType.DateTime)).GroupCount<object>()", + "go": "g.Inject(time.Date(2023, 8, 8, 12, 34, 56, 0, time.FixedZone(\"UTC+00:00\", 0))).Is(gremlingo.P.TypeOf(gremlingo.GType.DateTime)).GroupCount()", + "groovy": "g.inject(datetime(\"2023-08-08T12:34:56Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", + "java": "g.inject(OffsetDateTime.parse(\"2023-08-08T12:34:56Z\")).is(P.typeOf(GType.DATETIME)).groupCount()", + "javascript": "g.inject(new Date('2023-08-08T12:34:56Z')).is(P.typeOf(GType.datetime)).groupCount()", + "python": "g.inject(datetime.datetime.fromisoformat('2023-08-08T12:34:56+00:00')).is_(P.type_of(GType.DATETIME)).group_count()" } ] }, diff --git a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/data/DateTime.feature b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/data/DateTime.feature index 06956a9185..338b196fd0 100644 --- a/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/data/DateTime.feature +++ b/gremlin-test/src/main/resources/org/apache/tinkerpop/gremlin/test/features/data/DateTime.feature @@ -71,7 +71,7 @@ Feature: Data - DATETIME Given the empty graph And the graph initializer of """ - g.addV("event").property("datetime", datetime("2023-08-08T00:00:00Z")) + g.addV("event").property("datetime", datetime("2023-08-08T12:34:56Z")) """ And the traversal of """ @@ -80,7 +80,7 @@ Feature: Data - DATETIME When iterated to list Then the result should be unordered | result | - | dt[2023-08-08T00:00:00Z] | + | dt[2023-08-08T12:34:56Z] | @AllowDateTimePropertyValues Scenario: g_V_valuesXdatetimeX_isXtypeOfXGType_DATETIMEXX_chooseXisXeqXdatetimeX2023_08_08XXXX_constantXmatchX_constantXnoMatchXX @@ -131,9 +131,9 @@ Feature: Data - DATETIME Given the empty graph And the traversal of """ - g.inject(datetime("2023-08-08T00:00:00Z")).is(P.typeOf(GType.DATETIME)).groupCount() + g.inject(datetime("2023-08-08T12:34:56Z")).is(P.typeOf(GType.DATETIME)).groupCount() """ When iterated to list Then the result should be unordered | result | - | m[{"dt[2023-08-08T00:00:00Z]":"d[1].l"}] | + | m[{"dt[2023-08-08T12:34:56Z]":"d[1].l"}] |
