This is an automated email from the ASF dual-hosted git repository. xiazcy pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 2c5efb1139a580b73d2f6403434c3a76098235fb Merge: 0e83640927 5c36ca252e Author: Yang Xia <[email protected]> AuthorDate: Thu Aug 6 11:55:43 2026 -0700 Merge branch '3.8-dev' CHANGELOG.asciidoc | 2 + docs/src/dev/provider/gremlin-semantics.asciidoc | 58 +++++++++++++++++++--- docs/src/reference/the-traversal.asciidoc | 27 +++++----- docs/src/upgrade/release-3.7.x.asciidoc | 12 +++++ gremlin-console/src/main/static/NOTICE | 4 +- .../io/graphson/GraphSONSerializerProvider.java | 11 ++++ .../io/graphson/GraphSONTypeDeserializer.java | 4 +- .../graphson/PdtGraphSONSerializerProviderV4.java | 13 +++++ .../io/graphson/GraphSONStreamConstraintsTest.java | 12 ++--- gremlin-driver/src/main/static/NOTICE | 4 +- gremlin-groovy/pom.xml | 7 ++- gremlin-server/pom.xml | 2 +- gremlin-server/src/main/static/NOTICE | 4 +- gremlin-shaded/pom.xml | 2 +- gremlin-shaded/src/main/static/NOTICE | 2 +- pom.xml | 4 +- spark-gremlin/pom.xml | 2 +- 17 files changed, 127 insertions(+), 43 deletions(-) diff --cc docs/src/dev/provider/gremlin-semantics.asciidoc index 5ba2fca94c,03ee174de8..633083c939 --- a/docs/src/dev/provider/gremlin-semantics.asciidoc +++ b/docs/src/dev/provider/gremlin-semantics.asciidoc @@@ -774,10 -690,12 +775,12 @@@ Non *Considerations:* - The `and()` step is a filter step that allows the traverser to pass if all of the provided traversals yield a result. - It follows the ternary boolean logic described in the <<gremlin-semantics-concepts,Ternary Boolean Logics>> section. + The `and()` step is a filter step that allows the traverser to pass only if every provided traversal yields at least + one result. If any child traversal produces no result, the traverser is filtered out. Boolean value expressions + evaluated within those traversals follow the <<gremlin-semantics-concepts,Comparability>> semantics, under which an + incomputable comparison (for example against `NaN`, or across types) is defined to be `FALSE`. -*Exceptions* +*Exceptions:* None @@@ -1515,26 -1375,23 +1518,27 @@@ argument date, while a negative result [width="100%",options="header"] |========================================================= |Start Step |Mid Step |Modulated |Domain |Range - |N |Y |N |`DATETIME` |`DATETIME` -|N |Y |N |`OffsetDateTime` |`Long` ++|N |Y |N |`DATETIME` |`LONG` |========================================================= *Arguments:* -* `value` - The date to subtract from the incoming traverser. An `OffsetDateTime` is expected; a `java.util.Date` is -also accepted but is deprecated as of 3.8.0. -* `dateTraversal` - A `Traversal` that must resolve to an `OffsetDateTime` (or a deprecated `Date`). The first result -returned from the traversal is subtracted from the incoming traverser. +* `value` - The `DATETIME` to subtract from the incoming traverser (result = incoming `DATETIME` - `value`). +* `dateTraversal` - The `Traversal` value must resolve to a `DATETIME`. The first result returned from the traversal +is subtracted from the incoming traverser (result = incoming `DATETIME` - traversal result). + +*Modulation:* + +None + +*Considerations:* - If argument resolves as `null` then incoming date will not be changed. + If the argument (or the `Traversal`) resolves to `null` it is treated as the epoch, so the result is the incoming + date's own value in epoch milliseconds. -*Exceptions* +*Exceptions:* -* If the incoming traverser (or resolved argument) is neither an `OffsetDateTime` nor a `Date` then an -`IllegalArgumentException` will be thrown. +* If the incoming traverser is a non-`DATETIME` value then an `Argument Error` is raised. See: link:https://github.com/apache/tinkerpop/tree/x.y.z/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/step/map/DateDiffStep.java[source], link:https://tinkerpop.apache.org/docs/x.y.z/reference/#dateDiff-step[reference] @@@ -2583,21 -2003,22 +2622,22 @@@ link:https://tinkerpop.apache.org/docs/ *Arguments:* -* `searchCreate` - A `Map` used to match a `Vertex` and if not found will be the default set of data to create the new one. -* `onCreate` - A `Map` used to specify additional existence criteria and/or properties not already specified in `searchCreate`. -* `onMatch` - A `Map` used to update the `Vertex` that is found using the `searchCreate` criteria. +* `searchCreate` - A `MAP` used to match a `Vertex` and if not found will be the default set of data to create the new one. +* `onCreate` - A `MAP` used to specify additional existence criteria and/or properties not already specified in `searchCreate`. +* `onMatch` - A `MAP` used to update the `Vertex` that is found using the `searchCreate` criteria. -The `searchCreate` and `onCreate` `Map` instances must consist of any combination of `T.id`, `T.label`, or arbitrary -`String` keys (which are assumed to be vertex properties). The `onMatch` `Map` instance only allows for `String` keys -as the `id` and `label` of a `Vertex` are immutable. Values for these valid keys that are `null` will be treated -according to the semantics of the `addV()` step. +The `searchCreate` and `onCreate` `MAP` instances must consist of any combination of `T.id`, `T.label`, or arbitrary +`STRING` keys (which are assumed to be vertex properties). The `onMatch` `MAP` instance only allows for `STRING` keys - as the `id` and `label` of a `Vertex` are immutable. `null` values for these valid keys are not allowed. ++as the `id` and `label` of a `Vertex` are immutable. `null` values are not allowed for the `T` token keys, while ++`null` values for `STRING` property keys are treated according to the semantics of the `addV()` step. -The `Map` that is used as the argument for `searchCreate` may be assigned from the incoming `Traverser` for the no-arg +The `MAP` that is used as the argument for `searchCreate` may be assigned from the incoming `Traverser` for the no-arg `mergeV()`. If `mergeV(Map)` is used, then it will override the incoming `Traverser`. If `mergeV(Traversal)` is used, -the `Traversal` argument must resolve to a `Map` and it would also override the incoming Traverser. The `onCreate` and +the `Traversal` argument must resolve to a `MAP` and it would also override the incoming Traverser. The `onCreate` and `onMatch` arguments are assigned via modulation as described below. -If `onMatch` is triggered the `Traverser` becomes the matched `Vertex`, but the traversal still must return a `Map` -instance to be applied. `Null` is considered semantically equivalent to an empty `Map`. +If `onMatch` is triggered the `Traverser` becomes the matched `Vertex`, but the traversal still must return a `MAP` +instance to be applied. `Null` is considered semantically equivalent to an empty `MAP`. [width="100%",options="header"] |========================================================= @@@ -3055,7 -2403,7 +3095,7 @@@ link:https://tinkerpop.apache.org/docs/ *Description:* Returns a substring of the incoming string traverser with a 0-based start index (inclusive) and end index (exclusive). - *Syntax:* `substring(startIndex: INT, endIndex: INT)` | `substring(scope: Scope, startIndex: INT, endIndex: INT)` -*Syntax:* `substring(int startIndex)` | `substring(int startIndex, int endIndex)` | `substring(Scope scope, int startIndex)` | `substring(Scope scope, int startIndex, int endIndex)` ++*Syntax:* `substring(startIndex: INT)` | `substring(startIndex: INT, endIndex: INT)` | `substring(scope: Scope, startIndex: INT)` | `substring(scope: Scope, startIndex: INT, endIndex: INT)` [width="100%",options="header"] |========================================================= diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/PdtGraphSONSerializerProviderV4.java index 1cc0daf56f,0000000000..e092d6d640 mode 100644,000000..100644 --- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/PdtGraphSONSerializerProviderV4.java +++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphson/PdtGraphSONSerializerProviderV4.java @@@ -1,72 -1,0 +1,85 @@@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.tinkerpop.gremlin.structure.io.graphson; + +import org.apache.tinkerpop.gremlin.structure.io.pdt.PDTRegistry; +import org.apache.tinkerpop.shaded.jackson.databind.JsonSerializer; +import org.apache.tinkerpop.shaded.jackson.databind.SerializationConfig; +import org.apache.tinkerpop.shaded.jackson.databind.SerializerProvider; ++import org.apache.tinkerpop.shaded.jackson.databind.cfg.CacheProvider; +import org.apache.tinkerpop.shaded.jackson.databind.ser.DefaultSerializerProvider; +import org.apache.tinkerpop.shaded.jackson.databind.ser.SerializerFactory; + +/** + * A {@link DefaultSerializerProvider} for GraphSON V4 that returns a PDT adapter-based serializer + * for classes registered in the {@link PDTRegistry}. + */ +final class PdtGraphSONSerializerProviderV4 extends DefaultSerializerProvider { + private static final long serialVersionUID = 1L; + private final PDTRegistry pdtRegistry; + private final JsonSerializer<Object> pdtAdapterSerializer; + private final JsonSerializer<Object> primitivePdtAdapterSerializer; + + PdtGraphSONSerializerProviderV4(final PDTRegistry pdtRegistry) { + super(); + this.pdtRegistry = pdtRegistry; + this.pdtAdapterSerializer = new PdtGraphSONSerializersV4.PdtAdapterJacksonSerializer(pdtRegistry); + this.primitivePdtAdapterSerializer = new PdtGraphSONSerializersV4.PrimitivePdtAdapterJacksonSerializer(pdtRegistry); + } + + private PdtGraphSONSerializerProviderV4(final SerializerProvider src, + final SerializationConfig config, final SerializerFactory f, + final PDTRegistry pdtRegistry, + final JsonSerializer<Object> pdtAdapterSerializer, + final JsonSerializer<Object> primitivePdtAdapterSerializer) { + super(src, config, f); + this.pdtRegistry = pdtRegistry; + this.pdtAdapterSerializer = pdtAdapterSerializer; + this.primitivePdtAdapterSerializer = primitivePdtAdapterSerializer; + } + ++ private PdtGraphSONSerializerProviderV4(final PdtGraphSONSerializerProviderV4 src, final CacheProvider cacheProvider) { ++ super(src, cacheProvider); ++ this.pdtRegistry = src.pdtRegistry; ++ this.pdtAdapterSerializer = src.pdtAdapterSerializer; ++ this.primitivePdtAdapterSerializer = src.primitivePdtAdapterSerializer; ++ } ++ + @Override + public JsonSerializer<Object> getUnknownTypeSerializer(final Class<?> aClass) { + if (pdtRegistry != null && pdtRegistry.getCompositeAdapterByClass(aClass).isPresent()) { + return pdtAdapterSerializer; + } + if (pdtRegistry != null && pdtRegistry.getPrimitiveAdapterByClass(aClass).isPresent()) { + return primitivePdtAdapterSerializer; + } + return super.getUnknownTypeSerializer(aClass); + } + + @Override + public PdtGraphSONSerializerProviderV4 createInstance(final SerializationConfig config, + final SerializerFactory jsf) { + return new PdtGraphSONSerializerProviderV4(this, config, jsf, pdtRegistry, pdtAdapterSerializer, primitivePdtAdapterSerializer); + } ++ ++ @Override ++ public PdtGraphSONSerializerProviderV4 withCaches(final CacheProvider cacheProvider) { ++ return new PdtGraphSONSerializerProviderV4(this, cacheProvider); ++ } +} diff --cc gremlin-groovy/pom.xml index aaafa65750,fec178b82f..3daf32bb48 --- a/gremlin-groovy/pom.xml +++ b/gremlin-groovy/pom.xml @@@ -56,8 -56,18 +56,13 @@@ limitations under the License <groupId>org.ow2.asm</groupId> <artifactId>asm-util</artifactId> </exclusion> + <!-- Use our own ivy version for security vulnerability fixes (see direct dependency above) --> + <exclusion> + <groupId>org.apache.ivy</groupId> + <artifactId>ivy</artifactId> + </exclusion> </exclusions> </dependency> - <dependency> - <groupId>org.apache.groovy</groupId> - <artifactId>groovy-json</artifactId> - <version>${groovy.version}</version> - </dependency> <dependency> <groupId>org.apache.groovy</groupId> <artifactId>groovy-jsr223</artifactId> diff --cc pom.xml index 1b964d654a,d234cd5ede..add7e78def --- a/pom.xml +++ b/pom.xml @@@ -177,16 -171,16 +177,16 @@@ limitations under the License <javapoet.version>1.13.0</javapoet.version> <jbcrypt.version>0.4</jbcrypt.version> <junit.version>4.13.1</junit.version> - <kerby.version>2.0.3</kerby.version> - <logback.version>1.2.13</logback.version> + <logback.version>1.3.15</logback.version> <metrics.version>3.0.2</metrics.version> <mockito.version>5.19.0</mockito.version> - <netty.version>4.1.136.Final</netty.version> - <slf4j.version>1.7.25</slf4j.version> + <netty.version>4.2.7.Final</netty.version> + <slf4j.version>2.0.16</slf4j.version> <snakeyaml.version>2.0</snakeyaml.version> - <spark.version>3.3.2</spark.version> + <spark.version>4.1.2</spark.version> + <awssdk.version>2.29.3</awssdk.version> <!-- Version aligned with Netty's optional bcpkix dependency used for SelfSignedCertificate --> - <bouncycastle.version>1.69</bouncycastle.version> + <bouncycastle.version>1.70</bouncycastle.version> <ayza.version>10.0.0</ayza.version> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
