This is an automated email from the ASF dual-hosted git repository. spmallette pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit a892813dcdf0bd8d2d7ae5d716a0c3c37fa8afa1 Merge: 7c3a7ecd17 750f0811d1 Author: Stephen Mallette <[email protected]> AuthorDate: Fri Mar 13 13:45:10 2026 -0400 Merge branch '3.8-dev' CHANGELOG.asciidoc | 1 + docs/src/dev/provider/gremlin-semantics.asciidoc | 10 +- docs/src/upgrade/release-3.7.x.asciidoc | 22 ++++ .../map/AbstractMergeElementStepPlaceholder.java | 2 + .../step/map/MergeEdgeStepPlaceholder.java | 5 +- .../traversal/step/map/MergeElementStep.java | 40 +++++- .../step/map/MergeVertexStepPlaceholder.java | 5 +- .../Gremlin.Net.IntegrationTest/Gherkin/Gremlin.cs | 10 +- gremlin-go/driver/cucumber/gremlin.go | 10 +- .../io/binary/internals/ArraySerializer.js | 4 +- .../io/binary/internals/EnumSerializer.js | 5 +- .../structure/io/binary/internals/SetSerializer.js | 6 +- .../gremlin-javascript/test/cucumber/gremlin.js | 10 +- .../src/main/python/tests/feature/gremlin.py | 10 +- .../gremlin/test/features/map/MergeEdge.feature | 137 ++++++++++++++++++++- .../gremlin/test/features/map/MergeVertex.feature | 12 ++ .../tinkerpop/gremlin/tinkergraph/TinkerWorld.java | 22 +++- 17 files changed, 292 insertions(+), 19 deletions(-) diff --cc CHANGELOG.asciidoc index 4bf395cff6,918a1820ba..8163211650 --- a/CHANGELOG.asciidoc +++ b/CHANGELOG.asciidoc @@@ -289,7 -208,10 +289,8 @@@ image::https://raw.githubusercontent.co * Integrated Python driver examples into automated build process to ensure examples remain functional. * Fixed bug in `SubgraphStrategy` where specifying `edges` and `vertices` filters that had `map`-type steps could generate an error. * Fixed bug in `ReservedKeysVerificationStrategy` where `AddPropertyStep` was not triggering proper validations. + * Fixed bug in `mergeE` where `onCreate` validation of invalid static argument overrides did not trigger until traversal runtime. * Added `closeSessionPostGraphOp` to the Gremlin Server settings to indicate that the `Session` should be closed on either a successful commit or rollback. -* Added `SessionedChildClient` that borrows connections from a different `Client` for use with `Sessions`. -* Added `reuseConnectionsForSessions` to Java GLV settings to decide whether to use `SessionedChildClient` for remote transactions. [[release-3-7-5]] === TinkerPop 3.7.5 (Release Date: November 12, 2025) diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/ArraySerializer.js index 758575f342,77aabd4cec..5aaae1dcfe --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/ArraySerializer.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/ArraySerializer.js @@@ -127,21 -126,7 +127,21 @@@ export default class ArraySerializer throw err; } cursor = cursor.slice(value_len); - - v.push(value); ++ + if (isBulked) { + if (cursor.length < 8) { + throw new Error(`{item_${i}}: bulk count is missing`); + } + const bulkCount = cursor.readBigInt64BE(); + len += 8; + cursor = cursor.slice(8); - ++ + for (let j = 0n; j < bulkCount; j++) { + v.push(value); + } + } else { + v.push(value); + } } return { v, len }; diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/EnumSerializer.js index 76f72234e5,ab36841ec6..f8c27dfd56 --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/EnumSerializer.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/EnumSerializer.js @@@ -48,7 -62,14 +48,10 @@@ export default class EnumSerializer } canBeUsedFor(value) { - return value instanceof EnumValue && (value.typeName === 'Direction' || value.typeName === 'Merge' || value.typeName === 'T'); - if (!(value instanceof t.EnumValue)) { - return false; - } - if (!this.byname[value.typeName]) { - throw new Error(`EnumSerializer.serialize: typeName=${value.typeName} is not supported.`); - } - - return true; ++ return ( ++ value instanceof EnumValue && ++ (value.typeName === 'Direction' || value.typeName === 'Merge' || value.typeName === 'T') ++ ); } serialize(item, fullyQualifiedFormat = true) { diff --cc gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/SetSerializer.js index 623b5ebd11,3ae518ab0a..0b7f5f275b --- a/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/SetSerializer.js +++ b/gremlin-javascript/src/main/javascript/gremlin-javascript/lib/structure/io/binary/internals/SetSerializer.js @@@ -124,20 -123,7 +124,20 @@@ export default class SetSerializer throw err; } cursor = cursor.slice(valueLen); - - v.add(value); ++ + if (isBulked) { + if (cursor.length < 8) { + throw new Error(`{item_${i}}: bulk count is missing`); + } - const bulkCount = cursor.readBigInt64BE(); ++ cursor.readBigInt64BE(); + len += 8; + cursor = cursor.slice(8); - ++ + // Set.add is idempotent; bulk count only affects cardinality, not Set membership + v.add(value); + } else { + v.add(value); + } } return { v, len };
