From a7e28fe7597f047dae78a57f27371cc70e1c61cf Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Wed, 17 Aug 2022 11:16:25 -0400 Subject: [PATCH 1/5] test: add unified tests for disambiguatedPaths --- .../change-streams-disambiguatedPaths.json | 240 ++++++++++++++++++ .../change-streams-disambiguatedPaths.yml | 98 +++++++ 2 files changed, 338 insertions(+) create mode 100644 test/spec/change-streams/unified/change-streams-disambiguatedPaths.json create mode 100644 test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml diff --git a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json new file mode 100644 index 0000000000..a676e3df58 --- /dev/null +++ b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json @@ -0,0 +1,240 @@ +{ + "description": "disambiguatedPaths", + "schemaVersion": "1.9", + "createEntities": [ + { + "client": { + "id": "client0", + "useMultipleMongoses": false + } + }, + { + "database": { + "id": "database0", + "client": "client0", + "databaseName": "database0" + } + }, + { + "collection": { + "id": "collection0", + "database": "database0", + "collectionName": "collection0" + } + } + ], + "initialData": [ + { + "collectionName": "collection0", + "databaseName": "database0", + "documents": [] + } + ], + "tests": [ + { + "description": "disambiguatedPaths is not present when showExpandedEvents is false/unset", + "operations": [ + { + "name": "insertOne", + "object": "collection0", + "arguments": { + "document": { + "_id": 1, + "a": { + "1": 1 + } + } + } + }, + { + "name": "createChangeStream", + "object": "collection0", + "arguments": { + "pipeline": [] + }, + "saveResultAsEntity": "changeStream0" + }, + { + "name": "updateOne", + "object": "collection0", + "arguments": { + "filter": { + "_id": 1 + }, + "update": { + "$set": { + "a.1": 2 + } + } + } + }, + { + "name": "iterateUntilDocumentOrError", + "object": "changeStream0", + "expectResult": { + "operationType": "update", + "ns": { + "db": "database0", + "coll": "collection0" + }, + "updateDescription": { + "updatedFields": { + "$$exists": true + }, + "removedFields": { + "$$exists": true + }, + "truncatedArrays": { + "$$exists": true + }, + "disambiguatedPaths": { + "$$exists": false + } + } + } + } + ] + }, + { + "description": "disambiguatedPaths is present on updateDescription when an ambiguous path is present", + "operations": [ + { + "name": "insertOne", + "object": "collection0", + "arguments": { + "document": { + "_id": 1, + "a": { + "1": 1 + } + } + } + }, + { + "name": "createChangeStream", + "object": "collection0", + "arguments": { + "pipeline": [], + "showExpandedEvents": true + }, + "saveResultAsEntity": "changeStream0" + }, + { + "name": "updateOne", + "object": "collection0", + "arguments": { + "filter": { + "_id": 1 + }, + "update": { + "$set": { + "a.1": 2 + } + } + } + }, + { + "name": "iterateUntilDocumentOrError", + "object": "changeStream0", + "expectResult": { + "operationType": "update", + "ns": { + "db": "database0", + "coll": "collection0" + }, + "updateDescription": { + "updatedFields": { + "$$exists": true + }, + "removedFields": { + "$$exists": true + }, + "truncatedArrays": { + "$$exists": true + }, + "disambiguatedPaths": { + "a.1": [ + "a", + "1" + ] + } + } + } + } + ] + }, + { + "description": "disambiguatedPaths returns array indices as integers", + "operations": [ + { + "name": "insertOne", + "object": "collection0", + "arguments": { + "document": { + "_id": 1, + "a": [ + { + "1": 1 + } + ] + } + } + }, + { + "name": "createChangeStream", + "object": "collection0", + "arguments": { + "pipeline": [], + "showExpandedEvents": true + }, + "saveResultAsEntity": "changeStream0" + }, + { + "name": "updateOne", + "object": "collection0", + "arguments": { + "filter": { + "_id": 1 + }, + "update": { + "$set": { + "a.0.1": 2 + } + } + } + }, + { + "name": "iterateUntilDocumentOrError", + "object": "changeStream0", + "expectResult": { + "operationType": "update", + "ns": { + "db": "database0", + "coll": "collection0" + }, + "updateDescription": { + "updatedFields": { + "$$exists": true + }, + "removedFields": { + "$$exists": true + }, + "truncatedArrays": { + "$$exists": true + }, + "disambiguatedPaths": { + "a.0.1": [ + "a", + { + "$$type": "int" + }, + "1" + ] + } + } + } + } + ] + } + ] +} diff --git a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml new file mode 100644 index 0000000000..134d7f99f8 --- /dev/null +++ b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml @@ -0,0 +1,98 @@ +description: "disambiguatedPaths" +schemaVersion: "1.9" # todo - choose schema version +createEntities: + - client: + id: &client0 client0 + useMultipleMongoses: false + - database: + id: &database0 database0 + client: *client0 + databaseName: *database0 + - collection: + id: &collection0 collection0 + database: *database0 + collectionName: *collection0 + +initialData: + - collectionName: *collection0 + databaseName: *database0 + documents: [] + +tests: + - description: "disambiguatedPaths is not present when showExpandedEvents is false/unset" + operations: + - name: insertOne + object: *collection0 + arguments: + document: { _id: 1, 'a': { '1': 1 } } + - name: createChangeStream + object: *collection0 + arguments: { pipeline: [] } + saveResultAsEntity: &changeStream0 changeStream0 + - name: updateOne + object: *collection0 + arguments: + filter: { _id: 1 } + update: { $set: { 'a.1': 2 } } + - name: iterateUntilDocumentOrError + object: *changeStream0 + expectResult: + operationType: "update" + ns: { db: *database0, coll: *collection0 } + updateDescription: + updatedFields: { $$exists: true } + removedFields: { $$exists: true } + truncatedArrays: { $$exists: true } + disambiguatedPaths: { $$exists: false } + + - description: "disambiguatedPaths is present on updateDescription when an ambiguous path is present" + operations: + - name: insertOne + object: *collection0 + arguments: + document: { _id: 1, 'a': { '1': 1 } } + - name: createChangeStream + object: *collection0 + arguments: { pipeline: [], showExpandedEvents: true } + saveResultAsEntity: &changeStream0 changeStream0 + - name: updateOne + object: *collection0 + arguments: + filter: { _id: 1 } + update: { $set: { 'a.1': 2 } } + - name: iterateUntilDocumentOrError + object: *changeStream0 + expectResult: + operationType: "update" + ns: { db: *database0, coll: *collection0 } + updateDescription: + updatedFields: { $$exists: true } + removedFields: { $$exists: true } + truncatedArrays: { $$exists: true } + disambiguatedPaths: { 'a.1': ['a', '1'] } + + - description: "disambiguatedPaths returns array indices as integers" + operations: + - name: insertOne + object: *collection0 + arguments: + document: { _id: 1, 'a': [{'1': 1 }] } + - name: createChangeStream + object: *collection0 + arguments: { pipeline: [], showExpandedEvents: true } + saveResultAsEntity: &changeStream0 changeStream0 + - name: updateOne + object: *collection0 + arguments: + filter: { _id: 1 } + update: { $set: { 'a.0.1': 2 } } + - name: iterateUntilDocumentOrError + object: *changeStream0 + expectResult: + operationType: "update" + ns: { db: *database0, coll: *collection0 } + updateDescription: + updatedFields: { $$exists: true } + removedFields: { $$exists: true } + truncatedArrays: { $$exists: true } + disambiguatedPaths: { 'a.0.1': ['a', { $$type: 'int' }, '1'] } From 11cfea9021564889519f30a0f6a9cc54a4daaf9d Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Wed, 17 Aug 2022 11:33:13 -0400 Subject: [PATCH 2/5] feat: add support for disambiguatedPaths in change stream updates --- src/change_stream.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/src/change_stream.ts b/src/change_stream.ts index 93be71047f..0dffb4bd9c 100644 --- a/src/change_stream.ts +++ b/src/change_stream.ts @@ -496,6 +496,25 @@ export interface UpdateDescription { /** The number of elements in the truncated array. */ newSize: number; }>; + + /** + * A document containing additional information about any ambiguous update paths from the update event. The document + * maps the full ambiguous update path to an array containing the actual resolved components of the path. For example, + * given a document shaped like `{ a: { '0': 0 } }`, and an update of `{ $inc: 'a.0' }`, disambiguated paths would look like + * the following: + * + * ``` + * { + * 'a.0': ['a', '0'] + * } + * ``` + * + * This field is only present when there are ambiguous paths are updated as a part of the update event and `showExpandedEvents` + * is enabled for the change stream. + * @since 6.1.0 + * @experimental + */ + disambiguatedPaths?: Document; } /** @public */ From 5eceddb21e6b2e4bb4a4c8d1e89a74f598760475 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Wed, 17 Aug 2022 11:38:27 -0400 Subject: [PATCH 3/5] doc: add correct minserverversion to disambiguatedPath tests --- .../unified/change-streams-disambiguatedPaths.json | 10 ++++++++++ .../unified/change-streams-disambiguatedPaths.yml | 6 +++++- 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json index a676e3df58..b53ff41c74 100644 --- a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json +++ b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json @@ -23,6 +23,16 @@ } } ], + "runOnRequirements": [ + { + "minServerVersion": "6.1.0", + "topologies": [ + "replicaset", + "sharded-replicaset", + "load-balanced" + ] + } + ], "initialData": [ { "collectionName": "collection0", diff --git a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml index 134d7f99f8..59e2f8966a 100644 --- a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml +++ b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml @@ -1,5 +1,5 @@ description: "disambiguatedPaths" -schemaVersion: "1.9" # todo - choose schema version +schemaVersion: "1.9" createEntities: - client: id: &client0 client0 @@ -13,6 +13,10 @@ createEntities: database: *database0 collectionName: *collection0 +runOnRequirements: + - minServerVersion: "6.1.0" + topologies: [ replicaset, sharded-replicaset, load-balanced ] + initialData: - collectionName: *collection0 databaseName: *database0 From b54dc2e24960c0c5cb91c8abfba6bf415c3aa606 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Thu, 18 Aug 2022 15:43:49 -0400 Subject: [PATCH 4/5] apply changes to spec tests from specs PR --- .../unified/change-streams-disambiguatedPaths.json | 5 +++-- .../unified/change-streams-disambiguatedPaths.yml | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json index b53ff41c74..9a639801ee 100644 --- a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json +++ b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.json @@ -1,6 +1,6 @@ { "description": "disambiguatedPaths", - "schemaVersion": "1.9", + "schemaVersion": "1.3", "createEntities": [ { "client": { @@ -29,7 +29,8 @@ "topologies": [ "replicaset", "sharded-replicaset", - "load-balanced" + "load-balanced", + "sharded" ] } ], diff --git a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml index 59e2f8966a..674c876b02 100644 --- a/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml +++ b/test/spec/change-streams/unified/change-streams-disambiguatedPaths.yml @@ -1,5 +1,5 @@ description: "disambiguatedPaths" -schemaVersion: "1.9" +schemaVersion: "1.3" createEntities: - client: id: &client0 client0 @@ -15,7 +15,7 @@ createEntities: runOnRequirements: - minServerVersion: "6.1.0" - topologies: [ replicaset, sharded-replicaset, load-balanced ] + topologies: [ replicaset, sharded-replicaset, load-balanced, sharded ] initialData: - collectionName: *collection0 From eadb104ef978de4780c06ac4af8c953b59e79053 Mon Sep 17 00:00:00 2001 From: Bailey Pearson Date: Mon, 22 Aug 2022 17:45:00 -0400 Subject: [PATCH 5/5] chore: address comments on PR --- src/change_stream.ts | 8 ++++---- tsdoc.json | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/change_stream.ts b/src/change_stream.ts index 0dffb4bd9c..d9b6adefa9 100644 --- a/src/change_stream.ts +++ b/src/change_stream.ts @@ -210,7 +210,7 @@ export interface ChangeStreamDocumentCollectionUUID { * **NOTE:** collectionUUID will be converted to a NodeJS Buffer if the promoteBuffers * flag is enabled. * - * @since 6.1.0 + * @sinceServerVersion 6.1.0 */ collectionUUID: Binary; } @@ -222,7 +222,7 @@ export interface ChangeStreamDocumentOperationDescription { * * Only present when the `showExpandedEvents` flag is enabled. * - * @since 6.1.0 + * @sinceServerVersion 6.1.0 */ operationDescription?: Document; } @@ -509,9 +509,9 @@ export interface UpdateDescription { * } * ``` * - * This field is only present when there are ambiguous paths are updated as a part of the update event and `showExpandedEvents` + * This field is only present when there are ambiguous paths that are updated as a part of the update event and `showExpandedEvents` * is enabled for the change stream. - * @since 6.1.0 + * @sinceServerVersion 6.1.0 * @experimental */ disambiguatedPaths?: Document; diff --git a/tsdoc.json b/tsdoc.json index 81ce5c1da8..0d65244184 100644 --- a/tsdoc.json +++ b/tsdoc.json @@ -9,6 +9,10 @@ "syntaxKind": "block", "tagName": "@since" }, + { + "syntaxKind": "block", + "tagName": "@sinceServerVersion" + }, { "syntaxKind": "block", "tagName": "@category"