From c8a1df81a7517b0fbc856f002feb55638be35350 Mon Sep 17 00:00:00 2001 From: David Glasser Date: Tue, 28 Jan 2014 15:21:40 -0800 Subject: [PATCH] optimize paused remove({}) which oplog uses --- packages/minimongo/minimongo.js | 27 ++++++++++++++++++++++++--- packages/minimongo/minimongo_tests.js | 8 ++++++++ 2 files changed, 32 insertions(+), 3 deletions(-) diff --git a/packages/minimongo/minimongo.js b/packages/minimongo/minimongo.js index 5bc4857f6c..46d0bf17c0 100644 --- a/packages/minimongo/minimongo.js +++ b/packages/minimongo/minimongo.js @@ -563,10 +563,31 @@ LocalCollection.prototype.insert = function (doc, callback) { LocalCollection.prototype.remove = function (selector, callback) { var self = this; - var remove = []; - var queriesToRecompute = []; + // Easy special case: if we're not calling observeChanges callbacks and we're + // not saving originals and we got asked to remove everything, then just empty + // everything directly. + if (self.paused && !self._savedOriginals && EJSON.equals(selector, {})) { + var result = self._docs.size(); + self._docs.clear(); + _.each(self.queries, function (query) { + if (query.ordered) { + query.results = []; + } else { + query.results.clear(); + } + }); + if (callback) { + Meteor.defer(function () { + callback(null, result); + }); + } + return result; + } + var matcher = new Minimongo.Matcher(selector, self); + var queriesToRecompute = []; + var remove = []; // Avoid O(n) for "remove a single doc by ID". var specificIds = LocalCollection._idsMatchedBySelector(selector); @@ -616,7 +637,7 @@ LocalCollection.prototype.remove = function (selector, callback) { LocalCollection._recomputeResults(query); }); self._observeQueue.drain(); - var result = remove.length; + result = remove.length; if (callback) Meteor.defer(function () { callback(null, result); diff --git a/packages/minimongo/minimongo_tests.js b/packages/minimongo/minimongo_tests.js index 68c6b0203d..3ace1c931e 100644 --- a/packages/minimongo/minimongo_tests.js +++ b/packages/minimongo/minimongo_tests.js @@ -2565,6 +2565,14 @@ Tinytest.add("minimongo - pause", function (test) { test.equal(operations.shift(), ['changed', {a:3}, 0, {a:1}]); test.length(operations, 0); + // test special case for remove({}) + c.pauseObservers(); + test.equal(c.remove({}), 1); + test.length(operations, 0); + c.resumeObservers(); + test.equal(operations.shift(), ['removed', 1, 0, {a:3}]); + test.length(operations, 0); + h.stop(); });