From 68eb75fadf3ebdb9194b8340eb495f00183fbdb6 Mon Sep 17 00:00:00 2001 From: ericdepotter Date: Thu, 7 Sep 2017 19:27:38 +0200 Subject: [PATCH 1/2] Keep sort position of observed docs consistent with real sorting and only use observed docs to publish changes in sort position --- .../lib/core/search-collection.js | 40 ++++++++++++++----- 1 file changed, 29 insertions(+), 11 deletions(-) diff --git a/packages/easysearch:core/lib/core/search-collection.js b/packages/easysearch:core/lib/core/search-collection.js index e5494d1..b818c01 100644 --- a/packages/easysearch:core/lib/core/search-collection.js +++ b/packages/easysearch:core/lib/core/search-collection.js @@ -227,8 +227,9 @@ class SearchCollection { if (observedDocs.map(d => d.__sortPosition).includes(atIndex)) { observedDocs = observedDocs.map((doc, docIndex) => { if (doc.__sortPosition >= atIndex) { + const newSortPosition = doc.__sortPosition + 1; doc = collectionScope.addCustomFields(doc, { - sortPosition: doc.__sortPosition + 1, + sortPosition: newSortPosition, }); // do not throw changed event on last doc as it will be removed from cursor @@ -236,7 +237,7 @@ class SearchCollection { this.changed( collectionName, collectionScope.generateId(doc), - doc + {__sortPosition: newSortPosition} ); } } @@ -261,19 +262,35 @@ class SearchCollection { movedTo: (doc, fromIndex, toIndex, before) => { doc = collectionScope.engine.config.beforePublish('movedTo', doc, fromIndex, toIndex, before); doc = updateDocWithCustomFields(doc, toIndex); + this.changed(collectionName, collectionScope.generateId(doc), doc); - let beforeDoc = collectionScope._indexConfiguration.collection.findOne(before); + let start = fromIndex, end = toIndex, sortIncrement = -1; + if (toIndex < fromIndex) { + start = toIndex, end = fromIndex, sortIncrement = 1; + } - if (beforeDoc) { - beforeDoc = collectionScope.addCustomFields(beforeDoc, { - searchDefinition: definitionString, - searchOptions: optionsString, - sortPosition: fromIndex - }); - this.changed(collectionName, collectionScope.generateId(beforeDoc), beforeDoc); + const sortPositions = observedDocs.map(d => d.__sortPosition); + if (!(sortPositions.includes(start) || sortPositions.includes(end))) { + return; } - this.changed(collectionName, collectionScope.generateId(doc), doc); + observedDocs = observedDocs.map(observedDoc => { + if (observedDoc.__sortPosition >= start && observedDoc.__sortPosition <= end) { + const isMovedDoc = doc._id === observedDoc._id; + const newSortPosition = isMovedDoc ? toIndex : observedDoc.__sortPosition + sortIncrement; + observedDoc = collectionScope.addCustomFields(observedDoc, { + sortPosition: newSortPosition, + }); + + !isMovedDoc && this.changed( + collectionName, + collectionScope.generateId(observedDoc), + {__sortPosition: newSortPosition} + ); + } + + return observedDoc; + }); }, removedAt: (doc, atIndex) => { doc = collectionScope.engine.config.beforePublish('removedAt', doc, atIndex); @@ -311,3 +328,4 @@ class SearchCollection { } export default SearchCollection; + From 8f9fe1855abacaee505ac4585a3bb0dae364c7aa Mon Sep 17 00:00:00 2001 From: ericdepotter Date: Tue, 12 Sep 2017 19:02:10 +0200 Subject: [PATCH 2/2] Address comments --- .../lib/core/search-collection.js | 20 ++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/packages/easysearch:core/lib/core/search-collection.js b/packages/easysearch:core/lib/core/search-collection.js index b818c01..aa6fa63 100644 --- a/packages/easysearch:core/lib/core/search-collection.js +++ b/packages/easysearch:core/lib/core/search-collection.js @@ -264,10 +264,10 @@ class SearchCollection { doc = updateDocWithCustomFields(doc, toIndex); this.changed(collectionName, collectionScope.generateId(doc), doc); - let start = fromIndex, end = toIndex, sortIncrement = -1; - if (toIndex < fromIndex) { - start = toIndex, end = fromIndex, sortIncrement = 1; - } + const isReversed = toIndex < fromIndex; + const start = isReversed ? toIndex : fromIndex; + const end = isReversed ? fromIndex : toIndex; + const sortIncrement = isReversed ? 1 : -1; const sortPositions = observedDocs.map(d => d.__sortPosition); if (!(sortPositions.includes(start) || sortPositions.includes(end))) { @@ -282,11 +282,13 @@ class SearchCollection { sortPosition: newSortPosition, }); - !isMovedDoc && this.changed( - collectionName, - collectionScope.generateId(observedDoc), - {__sortPosition: newSortPosition} - ); + if (!isMovedDoc) { + this.changed( + collectionName, + collectionScope.generateId(observedDoc), + {__sortPosition: newSortPosition} + ); + } } return observedDoc;