Press n or j to go to the next uncovered block, b, p or k for the previous block.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 | 396x 396x 396x 396x 18451x 37066x 20723x 16343x 9734370x 9734370x 129x 9734241x 9734241x 9669880x 64361x 63028x 1333x 1333x 9734241x 9734241x 19961x 9734241x 1755x 1755x 9734241x 9734241x 9734241x 9734241x 9734241x 9669880x 9669880x 64361x 63028x 1333x 1333x 9734241x 9734241x 9734241x | import type { Document } from '../bson'; import * as BSON from '../bson'; import type { Collection } from '../collection'; import { MongoInvalidArgumentError } from '../error'; import type { DeleteStatement } from '../operations/delete'; import type { UpdateStatement } from '../operations/update'; import { Batch, BatchType, BulkOperationBase, type BulkWriteOptions, type BulkWriteResult } from './common'; /** @public */ export class UnorderedBulkOperation extends BulkOperationBase { /** @internal */ constructor(collection: Collection, options: BulkWriteOptions) { super(collection, options, false); } override handleWriteError(writeResult: BulkWriteResult): void { if (this.s.batches.length) { return; } return super.handleWriteError(writeResult); } addToOperationsList( batchType: BatchType, document: Document | UpdateStatement | DeleteStatement ): this { // Get the bsonSize const bsonSize = BSON.calculateObjectSize(document, { checkKeys: false, // Since we don't know what the user selected for BSON options here, // err on the safe side, and check the size with ignoreUndefined: false. ignoreUndefined: false } as any); // Throw error if the doc is bigger than the max BSON size if (bsonSize >= this.s.maxBsonObjectSize) { // TODO(NODE-3483): Change this to MongoBSONError throw new MongoInvalidArgumentError( `Document is larger than the maximum size ${this.s.maxBsonObjectSize}` ); } // Holds the current batch this.s.currentBatch = undefined; // Get the right type of batch if (batchType === BatchType.INSERT) { this.s.currentBatch = this.s.currentInsertBatch; } else if (batchType === BatchType.UPDATE) { this.s.currentBatch = this.s.currentUpdateBatch; } else Eif (batchType === BatchType.DELETE) { this.s.currentBatch = this.s.currentRemoveBatch; } const maxKeySize = this.s.maxKeySize; // Create a new batch object if we don't have a current one if (this.s.currentBatch == null) { this.s.currentBatch = new Batch(batchType, this.s.currentIndex); } // Check if we need to create a new batch if ( // New batch if we exceed the max batch op size this.s.currentBatch.size + 1 >= this.s.maxWriteBatchSize || // New batch if we exceed the maxBatchSizeBytes. Only matters if batch already has a doc, // since we can't sent an empty batch (this.s.currentBatch.size > 0 && this.s.currentBatch.sizeBytes + maxKeySize + bsonSize >= this.s.maxBatchSizeBytes) || // New batch if the new op does not have the same op type as the current batch this.s.currentBatch.batchType !== batchType ) { // Save the batch to the execution stack this.s.batches.push(this.s.currentBatch); // Create a new batch this.s.currentBatch = new Batch(batchType, this.s.currentIndex); } // We have an array of documents Iif (Array.isArray(document)) { throw new MongoInvalidArgumentError('Operation passed in cannot be an Array'); } this.s.currentBatch.operations.push(document); this.s.currentBatch.originalIndexes.push(this.s.currentIndex); this.s.currentIndex = this.s.currentIndex + 1; // Save back the current Batch to the right type if (batchType === BatchType.INSERT) { this.s.currentInsertBatch = this.s.currentBatch; this.s.bulkResult.insertedIds.push({ index: this.s.bulkResult.insertedIds.length, _id: (document as Document)._id }); } else if (batchType === BatchType.UPDATE) { this.s.currentUpdateBatch = this.s.currentBatch; } else Eif (batchType === BatchType.DELETE) { this.s.currentRemoveBatch = this.s.currentBatch; } // Update current batch size this.s.currentBatch.size += 1; this.s.currentBatch.sizeBytes += maxKeySize + bsonSize; return this; } } |