From 6aaa7ba8d593a3169e5d11da47165d4edb3ebbba Mon Sep 17 00:00:00 2001 From: James Allen Date: Thu, 20 Mar 2014 13:37:23 +0000 Subject: [PATCH] Group toV and fromV by the doc they correspond to --- .../app/coffee/UpdatesManager.coffee | 16 +++-- .../coffee/GettingUpdatesTests.coffee | 30 ++++---- .../UpdatesManager/UpdatesManagerTests.coffee | 68 +++++++++++-------- 3 files changed, 66 insertions(+), 48 deletions(-) diff --git a/services/track-changes/app/coffee/UpdatesManager.coffee b/services/track-changes/app/coffee/UpdatesManager.coffee index cf5a83ce71..839c74fe6d 100644 --- a/services/track-changes/app/coffee/UpdatesManager.coffee +++ b/services/track-changes/app/coffee/UpdatesManager.coffee @@ -176,21 +176,29 @@ module.exports = UpdatesManager = if !userExists earliestUpdate.meta.users.push update.meta.user - if update.doc_id.toString() not in earliestUpdate.doc_ids - earliestUpdate.doc_ids.push update.doc_id.toString() + doc_id = update.doc_id.toString() + doc = earliestUpdate.docs[doc_id] + if doc? + doc.fromV = Math.min(doc.fromV, update.v) + doc.toV = Math.max(doc.toV, update.v) + else + earliestUpdate.docs[doc_id] = + fromV: update.v + toV: update.v earliestUpdate.meta.start_ts = Math.min(earliestUpdate.meta.start_ts, update.meta.start_ts) earliestUpdate.meta.end_ts = Math.max(earliestUpdate.meta.end_ts, update.meta.end_ts) - earliestUpdate.fromV = update.v else newUpdate = meta: users: [] start_ts: update.meta.start_ts end_ts: update.meta.end_ts + docs: {} + + newUpdate.docs[update.doc_id.toString()] = fromV: update.v toV: update.v - doc_ids: [update.doc_id.toString()] if update.meta.user? newUpdate.meta.users.push update.meta.user diff --git a/services/track-changes/test/acceptance/coffee/GettingUpdatesTests.coffee b/services/track-changes/test/acceptance/coffee/GettingUpdatesTests.coffee index 1bfc939629..13e70162da 100644 --- a/services/track-changes/test/acceptance/coffee/GettingUpdatesTests.coffee +++ b/services/track-changes/test/acceptance/coffee/GettingUpdatesTests.coffee @@ -63,30 +63,30 @@ describe "Getting updates", -> .should.equal true it "should return at least the min_count number of summarized updates", -> + docs1 = {} + docs1[@doc_id] = toV: 20, fromV: 19 + docs2 = {} + docs2[@doc_id] = toV: 18, fromV: 17 + docs3 = {} + docs3[@doc_id] = toV: 16, fromV: 15 expect(@updates.slice(0,3)).to.deep.equal [{ - doc_ids: [@doc_id] + docs: docs1 meta: start_ts: @to - 2 * @minutes end_ts: @to users: [@user] - toV: 20 - fromV: 19 }, { - doc_ids: [@doc_id] + docs: docs2 meta: start_ts: @to - 1 * @days - 2 * @minutes end_ts: @to - 1 * @days users: [@user] - toV: 18 - fromV: 17 }, { - doc_ids: [@doc_id] + docs: docs3 meta: start_ts: @to - 2 * @days - 2 * @minutes end_ts: @to - 2 * @days users: [@user] - toV: 16 - fromV: 15 }] @@ -98,21 +98,21 @@ describe "Getting updates", -> done() it "should return as many updates as it can", -> + docs1 = {} + docs1[@doc_id] = toV: 4, fromV: 3 + docs2 = {} + docs2[@doc_id] = toV: 2, fromV: 1 expect(@updates).to.deep.equal [{ - doc_ids: [@doc_id] + docs: docs1 meta: start_ts: @to - 8 * @days - 2 * @minutes end_ts: @to - 8 * @days users: [@user] - toV: 4 - fromV: 3 }, { - doc_ids: [@doc_id] + docs: docs2 meta: start_ts: @to - 9 * @days - 2 * @minutes end_ts: @to - 9 * @days users: [@user] - toV: 2 - fromV: 1 }] diff --git a/services/track-changes/test/unit/coffee/UpdatesManager/UpdatesManagerTests.coffee b/services/track-changes/test/unit/coffee/UpdatesManager/UpdatesManagerTests.coffee index d5608f8bee..59e1293ac4 100644 --- a/services/track-changes/test/unit/coffee/UpdatesManager/UpdatesManagerTests.coffee +++ b/services/track-changes/test/unit/coffee/UpdatesManager/UpdatesManagerTests.coffee @@ -480,97 +480,107 @@ describe "UpdatesManager", -> @now = Date.now() @user_1 = { id: "mock-user-1" } @user_2 = { id: "mock-user-2" } - @doc_id_1 = "mock-doc-id-1" - @doc_id_2 = "mock-doc-id-2" it "should concat updates that are close in time", -> - expect(@UpdatesManager._summarizeUpdates [{ - doc_id: @doc_id_1 + result = @UpdatesManager._summarizeUpdates [{ + doc_id: "doc-id-1" meta: user: @user_1 start_ts: @now + 20 end_ts: @now + 30 v: 5 }, { - doc_id: @doc_id_1 + doc_id: "doc-id-1" meta: user: @user_2 start_ts: @now end_ts: @now + 10 v: 4 - }]).to.deep.equal [{ - doc_ids: [@doc_id_1] + }] + + expect(result).to.deep.equal [{ + docs: + "doc-id-1": + fromV: 4 + toV: 5 meta: users: [@user_1, @user_2] start_ts: @now end_ts: @now + 30 - fromV: 4 - toV: 5 }] it "should leave updates that are far apart in time", -> oneDay = 1000 * 60 * 60 * 24 - expect(@UpdatesManager._summarizeUpdates [{ - doc_id: @doc_id_1 + result = @UpdatesManager._summarizeUpdates [{ + doc_id: "doc-id-1" meta: user: @user_2 start_ts: @now + oneDay end_ts: @now + oneDay + 10 v: 5 }, { - doc_id: @doc_id_1 + doc_id: "doc-id-1" meta: user: @user_1 start_ts: @now end_ts: @now + 10 v: 4 - }]).to.deep.equal [{ - doc_ids: [@doc_id_1] + }] + expect(result).to.deep.equal [{ + docs: + "doc-id-1": + fromV: 5 + toV: 5 meta: users: [@user_2] start_ts: @now + oneDay end_ts: @now + oneDay + 10 - fromV: 5 - toV: 5 }, { - doc_ids: [@doc_id_1] + docs: + "doc-id-1": + fromV: 4 + toV: 4 meta: users: [@user_1] start_ts: @now end_ts: @now + 10 - fromV: 4 - toV: 4 }] it "should concat onto existing summarized updates", -> - expect(@UpdatesManager._summarizeUpdates [{ - doc_id: @doc_id_2 + result = @UpdatesManager._summarizeUpdates [{ + doc_id: "doc-id-2" meta: user: @user_1 start_ts: @now + 20 end_ts: @now + 30 v: 5 }, { - doc_id: @doc_id_2 + doc_id: "doc-id-2" meta: user: @user_2 start_ts: @now end_ts: @now + 10 v: 4 }], [{ - doc_ids: [@doc_id_1] + docs: + "doc-id-1": + fromV: 6 + toV: 8 meta: users: [@user_1] start_ts: @now + 40 end_ts: @now + 50 - fromV: 6 - toV: 8 - }]).to.deep.equal [{ - doc_ids: [@doc_id_1, @doc_id_2] + }] + expect(result).to.deep.equal [{ + docs: + "doc-id-1": + toV: 8 + fromV: 6 + "doc-id-2": + toV: 5 + fromV: 4 meta: users: [@user_1, @user_2] start_ts: @now end_ts: @now + 50 - fromV: 4 - toV: 8 }]