Преглед изворни кода

Работа над saveRecent

Book Pauk пре 5 година
родитељ
комит
a1f4a83e72
2 измењених фајлова са 64 додато и 9 уклоњено
  1. 60 9
      client/components/Reader/ServerStorage/ServerStorage.vue
  2. 4 0
      client/share/utils.js

+ 60 - 9
client/components/Reader/ServerStorage/ServerStorage.vue

@@ -345,8 +345,8 @@ class ServerStorage extends Vue {
             }
         }
 
-        if (force || revs.items.recentDiff.rev != oldRecentDiffRev || revs.items.recent.rev != oldRecentRev) {
-            let recent = null;
+        let recent = null;
+        if (force || revs.items.recent.rev != oldRecentRev || revs.items.recentDiff.rev != oldRecentDiffRev) {
             try {
                 recent = await this.storageGet({recent: {}, recentDiff: {}});
             } catch(e) {
@@ -361,17 +361,22 @@ class ServerStorage extends Vue {
                 if (recent.rev == 0)
                     recent.data = {};
 
+                this.oldRecent = _.cloneDeep(recent.data);
                 let newRecent = {};
                 if (recentDiff && recentDiff.data) {
                     newRecent = utils.applyObjDiff(recent.data, recentDiff.data);
+                    this.recentDiff = _.cloneDeep(recentDiff.data);
+                    if (!utils.isObjDiff(this.recentDiff))
+                        this.recentDiff = null;
                 } else {
                     newRecent = recent.data;
+                    this.recentDiff = null;
                 }
 
+
                 await bookManager.setRecent(newRecent);
                 await bookManager.setRecentRev(recent.rev);
                 await bookManager.setRecentDiffRev(recentDiff.rev);
-console.log('loaded');                
             } else {
                 this.warning(`Неверный ответ сервера: ${recent.state}`);
             }
@@ -392,14 +397,59 @@ console.log('loaded');
             return;
         }
 
+        //несколько замудреная инициализация oldRecent
+        if (!this.oldRecent) {
+            this.oldRecent = _.cloneDeep(bookManager.recent);
+        }
+
+        if (bookManager.loaded && !this.oldRecentInited) {
+            this.oldRecent = _.cloneDeep(bookManager.recent);
+            this.oldRecentInited = true;
+        }
+
         //вычисляем дифф
-        /*let diff = utils.getObjDiff(this.oldRecent, bm.recent);
+        let diff = null;
+        if (itemKey) {//ускоренное вычисления диффа
+            let itemDiff;
+            if (this.oldRecent[itemKey]) {
+                itemDiff = utils.getObjDiff({[itemKey]: (this.oldRecentInited ? this.oldRecent[itemKey] : {})}, {[itemKey]: bm.recent[itemKey]});
+            } else {
+                itemDiff = utils.getObjDiff({}, {[itemKey]: bm.recent[itemKey]});
+            }
+            if (this.recentDiff) {
+                diff = this.recentDiff;
+                if (itemDiff.change[itemKey])
+                    diff.change[itemKey] = itemDiff.change[itemKey];
+                if (itemDiff.add[itemKey])
+                    diff.add[itemKey] = itemDiff.add[itemKey];
+            } else {
+                diff = itemDiff;
+            }
+        } else {//медленное вычисление диффа
+            if (this.oldRecentInited) {
+                diff = utils.getObjDiff(this.oldRecent, bm.recent);
+            } else
+                return;
+        }
 
         if (utils.isEmptyObjDiff(diff))
-            return;*/
+            return;
 
-        let forceSaveRecent = true;
+        //вычисление критерия сохранения целиком
+        let forceSaveRecent = JSON.stringify(diff).length > 2000;
+        if (!forceSaveRecent && itemKey) {
+            if (!this.sameKeyCount)
+                this.sameKeyCount = 0;
+            if (this.prevItemKey == itemKey)
+                this.sameKeyCount++;
+
+            forceSaveRecent = this.sameKeyCount > 5 && (Object.keys(diff.change).length > 1);
+
+            this.sameKeyCount = (!forceSaveRecent ? this.sameKeyCount : 0);
+            this.prevItemKey = itemKey;
+        }
 
+        this.recentDiff = diff;
         this.savingRecent = true;        
         try {
             if (forceSaveRecent) {//сохраняем recent целиком
@@ -415,11 +465,11 @@ console.log('loaded');
                     await this.loadRecent(true, false);
                     this.warning(`Последние изменения отменены. Данные синхронизированы с сервером.`);
                 } else if (result.state == 'success') {
-                    //this.oldRecent = _.cloneDeep(bm.recent);
-                    //this.recentDiff = null;
+                    this.oldRecent = _.cloneDeep(bm.recent);
+                    this.recentDiff = null;
                     await bm.setRecentRev(bm.recentRev + 1);
                     await bm.setRecentDiffRev(bm.recentDiffRev + 1);
-console.log('saved');                    
+console.log('saved1');                    
                 }
             } else {//сохраняем только дифф
                 let result = {state: ''};
@@ -436,6 +486,7 @@ console.log('saved');
                 } else if (result.state == 'success') {
                     await bm.setRecentDiffRev(bm.recentDiffRev + 1);
                 }
+console.log('saved2');                    
             }
         } finally {
             this.savingRecent = false;

+ 4 - 0
client/share/utils.js

@@ -129,6 +129,10 @@ export function getObjDiff(oldObj, newObj) {
     return result;
 }
 
+export function isObjDiff(diff) {
+    return (_.isObject(diff) && diff.__isDiff);
+}
+
 export function isEmptyObjDiff(diff) {
     return (!_.isObject(diff) || !diff.__isDiff ||
         (!Object.keys(diff.change).length &&