commit 6f04b34d597f97ec5fa548bb4cce6947c7528e64
parent 56dcd6da268a5e8bcd6472e022d4ba700c9733ad
Author: Dan Stillman <dstillman@zotero.org>
Date: Mon, 16 May 2016 18:25:35 -0400
Close #945, Optimize bulk reload on multi-item changes
Diffstat:
1 file changed, 26 insertions(+), 3 deletions(-)
diff --git a/chrome/content/zotero/xpcom/data/dataObjects.js b/chrome/content/zotero/xpcom/data/dataObjects.js
@@ -654,9 +654,32 @@ Zotero.DataObjects.prototype.reload = Zotero.Promise.coroutine(function* (ids, d
Zotero.debug('Reloading ' + (dataTypes ? '[' + dataTypes.join(', ') + '] for ' : '')
+ this._ZDO_objects + ' ' + ids);
- for (let i=0; i<ids.length; i++) {
- if (this._objectCache[ids[i]]) {
- yield this._objectCache[ids[i]].reload(dataTypes, reloadUnchanged);
+ // If data types not specified, reload loaded data for each object individually.
+ // TODO: optimize
+ if (!dataTypes) {
+ for (let i=0; i<ids.length; i++) {
+ if (this._objectCache[ids[i]]) {
+ yield this._objectCache[ids[i]].reload(dataTypes, reloadUnchanged);
+ }
+ }
+ return;
+ }
+
+ for (let dataType of dataTypes) {
+ let typeIDsByLibrary = {};
+ for (let id of ids) {
+ let obj = this._objectCache[id];
+ if (!obj || !obj._loaded[dataType] || obj._skipDataTypeLoad[dataType]
+ || (!reloadUnchanged && !obj._changed[dataType])) {
+ continue;
+ }
+ if (!typeIDsByLibrary[obj.libraryID]) {
+ typeIDsByLibrary[obj.libraryID] = [];
+ }
+ typeIDsByLibrary[obj.libraryID].push(id);
+ }
+ for (let libraryID in typeIDsByLibrary) {
+ yield this._loadDataType(dataType, parseInt(libraryID), typeIDsByLibrary[libraryID]);
}
}