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>

Reply via email to