Skip to content

Commit d26b67e

Browse files
committed
differential realttime updates to firebase
1 parent 01866eb commit d26b67e

File tree

3 files changed

+108
-10
lines changed

3 files changed

+108
-10
lines changed

my-mind.js

+54-5
Original file line numberDiff line numberDiff line change
@@ -3092,18 +3092,69 @@ MM.Backend.Firebase.reset = function() {
30923092
/**
30933093
* Merge current (remote) data with updated map
30943094
*/
3095-
MM.Backend.Firebase.mergeWidth = function(data, name) {
3095+
MM.Backend.Firebase.mergeWith = function(data, name) {
30963096
if (name != this._current.name) {
30973097
this._current.name = name;
30983098
this.ref.child("names/" + this._current.id).set(name);
30993099
}
31003100

31013101
var dataRef = this.ref.child("data/" + this._current.id);
31023102
this._recursiveRefMerge(dataRef, this._current.data, data);
3103+
this._current.data = data;
31033104
}
31043105

3106+
/**
3107+
* @param {Firebase} ref
3108+
* @param {object} oldData
3109+
* @param {object} newData
3110+
*/
31053111
MM.Backend.Firebase._recursiveRefMerge = function(ref, oldData, newData) {
3106-
/* FIXME */
3112+
var updateObject = {};
3113+
3114+
if (newData instanceof Array) { /* merge arrays */
3115+
3116+
for (var i=0; i<newData.length; i++) {
3117+
var newValue = newData[i];
3118+
3119+
if (!(i in oldData)) { /* new key */
3120+
updateObject[i] = newValue;
3121+
} else if (typeof(newValue) == "object") { /* recurse */
3122+
this._recursiveRefMerge(ref.child(i), oldData[i], newValue);
3123+
} else if (newValue !== oldData[i]) { /* changed key */
3124+
updateObject[i] = newValue;
3125+
}
3126+
}
3127+
3128+
for (var i=newData.length; i<oldData.length; i++) { updateObject[i] = null; } /* removed array items */
3129+
3130+
} else { /* merge objects */
3131+
3132+
for (var p in newData) { /* new/changed keys */
3133+
var newValue = newData[p];
3134+
3135+
if (!(p in oldData)) { /* new key */
3136+
updateObject[p] = newValue;
3137+
} else if (typeof(newValue) == "object") { /* recurse */
3138+
this._recursiveRefMerge(ref.child(p), oldData[p], newValue);
3139+
} else if (newValue !== oldData[p]) { /* changed key */
3140+
updateObject[p] = newValue;
3141+
}
3142+
3143+
}
3144+
3145+
for (var p in oldData) { /* removed keys */
3146+
if (!(p in newData)) { updateObject[p] = null; }
3147+
}
3148+
3149+
}
3150+
3151+
if (Object.keys(updateObject).length) {
3152+
console.log("Update set for " + ref, updateObject);
3153+
ref.update(updateObject);
3154+
}/* else {
3155+
console.log("No update needed for " + ref);
3156+
} */
3157+
31073158
}
31083159

31093160
MM.Backend.Firebase._listenStart = function(data, id) {
@@ -4211,10 +4262,8 @@ MM.UI.Backend.Firebase.reset = function() {
42114262
}
42124263

42134264
MM.UI.Backend.Firebase._itemChange = function() {
4214-
console.log("updating to firebase");
4215-
42164265
var map = MM.App.map;
4217-
// FIXME this._backend.mergeWith(map.toJSON(), map.getName());
4266+
this._backend.mergeWith(map.toJSON(), map.getName());
42184267
}
42194268

42204269
MM.UI.Backend.Firebase._action = function() {

src/backend.firebase.js

+53-2
Original file line numberDiff line numberDiff line change
@@ -83,18 +83,69 @@ MM.Backend.Firebase.reset = function() {
8383
/**
8484
* Merge current (remote) data with updated map
8585
*/
86-
MM.Backend.Firebase.mergeWidth = function(data, name) {
86+
MM.Backend.Firebase.mergeWith = function(data, name) {
8787
if (name != this._current.name) {
8888
this._current.name = name;
8989
this.ref.child("names/" + this._current.id).set(name);
9090
}
9191

9292
var dataRef = this.ref.child("data/" + this._current.id);
9393
this._recursiveRefMerge(dataRef, this._current.data, data);
94+
this._current.data = data;
9495
}
9596

97+
/**
98+
* @param {Firebase} ref
99+
* @param {object} oldData
100+
* @param {object} newData
101+
*/
96102
MM.Backend.Firebase._recursiveRefMerge = function(ref, oldData, newData) {
97-
/* FIXME */
103+
var updateObject = {};
104+
105+
if (newData instanceof Array) { /* merge arrays */
106+
107+
for (var i=0; i<newData.length; i++) {
108+
var newValue = newData[i];
109+
110+
if (!(i in oldData)) { /* new key */
111+
updateObject[i] = newValue;
112+
} else if (typeof(newValue) == "object") { /* recurse */
113+
this._recursiveRefMerge(ref.child(i), oldData[i], newValue);
114+
} else if (newValue !== oldData[i]) { /* changed key */
115+
updateObject[i] = newValue;
116+
}
117+
}
118+
119+
for (var i=newData.length; i<oldData.length; i++) { updateObject[i] = null; } /* removed array items */
120+
121+
} else { /* merge objects */
122+
123+
for (var p in newData) { /* new/changed keys */
124+
var newValue = newData[p];
125+
126+
if (!(p in oldData)) { /* new key */
127+
updateObject[p] = newValue;
128+
} else if (typeof(newValue) == "object") { /* recurse */
129+
this._recursiveRefMerge(ref.child(p), oldData[p], newValue);
130+
} else if (newValue !== oldData[p]) { /* changed key */
131+
updateObject[p] = newValue;
132+
}
133+
134+
}
135+
136+
for (var p in oldData) { /* removed keys */
137+
if (!(p in newData)) { updateObject[p] = null; }
138+
}
139+
140+
}
141+
142+
if (Object.keys(updateObject).length) {
143+
console.log("Update set for " + ref, updateObject);
144+
ref.update(updateObject);
145+
}/* else {
146+
console.log("No update needed for " + ref);
147+
} */
148+
98149
}
99150

100151
MM.Backend.Firebase._listenStart = function(data, id) {

src/ui.backend.firebase.js

+1-3
Original file line numberDiff line numberDiff line change
@@ -97,10 +97,8 @@ MM.UI.Backend.Firebase.reset = function() {
9797
}
9898

9999
MM.UI.Backend.Firebase._itemChange = function() {
100-
console.log("updating to firebase");
101-
102100
var map = MM.App.map;
103-
// FIXME this._backend.mergeWith(map.toJSON(), map.getName());
101+
this._backend.mergeWith(map.toJSON(), map.getName());
104102
}
105103

106104
MM.UI.Backend.Firebase._action = function() {

0 commit comments

Comments
 (0)