Skip to content

Commit 7a8cee1

Browse files
WangPerryWPYphillwiggins
authored andcommitted
MergeWithPrevious change (#240)
* The method of setAdd, setRemove, setAddAll, setRemoveAll, Increment, Decrement, AddUnique, AddRelation, RemoveRelation can be merged between the same operation and some other operation. Implementation method reference iOS SDK. I do this by Implementing a tool class in "parse_merge.dart" and calling the "mergeWithPrevious" Method in the set method which implemented in parse_base.dart. * remove the commented out code.
1 parent 73e2937 commit 7a8cee1

File tree

3 files changed

+259
-7
lines changed

3 files changed

+259
-7
lines changed

lib/parse_server_sdk.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,8 @@ part 'src/utils/parse_utils.dart';
9292

9393
part 'src/utils/parse_login_helpers.dart';
9494

95+
part 'src/objects/parse_merge.dart';
96+
9597
class Parse {
9698
ParseCoreData data;
9799
bool _hasBeenInitialized = false;
@@ -116,8 +118,8 @@ class Parse {
116118
String masterKey,
117119
String sessionId,
118120
bool autoSendSessionId,
119-
SecurityContext securityContext,
120-
CoreStore coreStore}) async {
121+
SecurityContext securityContext,
122+
CoreStore coreStore}) async {
121123
final String url = removeTrailingSlash(serverUrl);
122124

123125
await ParseCoreData.init(appId, url,
@@ -147,7 +149,7 @@ class Parse {
147149
final ParseHTTPClient _client = client ??
148150
ParseHTTPClient(
149151
sendSessionId:
150-
sendSessionIdByDefault ?? ParseCoreData().autoSendSessionId,
152+
sendSessionIdByDefault ?? ParseCoreData().autoSendSessionId,
151153
securityContext: ParseCoreData().securityContext);
152154

153155
const String className = 'parseBase';

lib/src/objects/parse_base.dart

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -191,13 +191,12 @@ abstract class ParseBase {
191191
if (_getObjectData()[key] == value) {
192192
return;
193193
}
194-
if (forceUpdate) {
195-
_getObjectData()[key] = value;
196-
}
194+
_getObjectData()[key] =
195+
ParseMergeTool().mergeWithPrevious(_unsavedChanges[key], value);
197196
} else {
198197
_getObjectData()[key] = value;
199198
}
200-
_unsavedChanges[key] = value;
199+
_unsavedChanges[key] = _getObjectData()[key];
201200
}
202201
}
203202

lib/src/objects/parse_merge.dart

Lines changed: 251 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,251 @@
1+
part of flutter_parse_sdk;
2+
3+
class ParseMergeTool {
4+
// merge method
5+
dynamic mergeWithPrevious(dynamic previous, dynamic values) {
6+
if (previous == null) {
7+
return values;
8+
}
9+
String previousAction = 'Set';
10+
if (previous is Map) {
11+
previousAction = previous['__op'];
12+
}
13+
if (values is Map) {
14+
if (values['__op'] == 'Add') {
15+
values = _mergeWithPreviousAdd(previousAction, previous, values);
16+
} else if (values['__op'] == 'Remove') {
17+
values = _mergeWithPreviousRemove(previousAction, previous, values);
18+
} else if (values['__op'] == 'Increment') {
19+
values = _mergeWithPreviousIncrement(previousAction, previous, values);
20+
} else if (values['__op'] == 'AddUnique') {
21+
values = _mergeWithPreviousAddUnique(previousAction, previous, values);
22+
} else if (values['__op'] == 'AddRelation') {
23+
values =
24+
_mergeWithPreviousAddRelation(previousAction, previous, values);
25+
} else if (values['__op'] == 'RemoveRelation') {
26+
values =
27+
_mergeWithPreviousRemoveRelation(previousAction, previous, values);
28+
}
29+
}
30+
return values;
31+
}
32+
33+
// Add operation Merge
34+
dynamic _mergeWithPreviousAdd(
35+
String previousAction, dynamic previous, dynamic values) {
36+
if (previousAction == 'Set') {
37+
if (previous is List) {
38+
return List<dynamic>.from(previous)..addAll(values['objects']);
39+
} else {
40+
throw 'Unable to add an item to a non-array.';
41+
}
42+
}
43+
if (previousAction == 'Add') {
44+
if (values['objects'].length == 1) {
45+
previous['objects'].add(values['objects'].first);
46+
} else {
47+
previous['objects'].add(values['objects']);
48+
}
49+
values = previous;
50+
}
51+
if (previousAction == 'Increment') {
52+
throw 'Add operation is invalid after Increment operation';
53+
}
54+
if (previousAction == 'Remove') {
55+
throw 'Add operation is invalid after Remove operation';
56+
}
57+
if (previousAction == 'AddUnique') {
58+
throw 'Add operation is invalid after AddUnique operation';
59+
}
60+
if (previousAction == 'AddRelation') {
61+
throw 'Add operation is invalid after AddRelation operation';
62+
}
63+
if (previousAction == 'RemoveRelation') {
64+
throw 'Add operation is invalid after RemoveRelation operation';
65+
}
66+
return values;
67+
}
68+
69+
// Remove operation Merge
70+
dynamic _mergeWithPreviousRemove(
71+
String previousAction, dynamic previous, dynamic values) {
72+
if (previousAction == 'Set') {
73+
return previous;
74+
}
75+
if (previousAction == 'Remove') {
76+
if (values['objects'].length == 1) {
77+
previous['objects'].add(values['objects'].first);
78+
} else {
79+
previous['objects'].add(values['objects']);
80+
}
81+
values = previous;
82+
}
83+
if (previousAction == 'Increment') {
84+
throw 'Remove operation is invalid after Increment operation';
85+
}
86+
if (previousAction == 'Add') {
87+
throw 'Remove operation is invalid after Add operation';
88+
}
89+
if (previousAction == 'AddUnique') {
90+
throw 'Remove operation is invalid after AddUnique operation';
91+
}
92+
if (previousAction == 'AddRelation') {
93+
throw 'Remove operation is invalid after AddRelation operation';
94+
}
95+
if (previousAction == 'RemoveRelation') {
96+
throw 'Remove operation is invalid after RemoveRelation operation';
97+
}
98+
return values;
99+
}
100+
101+
// Increment operation Merge
102+
dynamic _mergeWithPreviousIncrement(
103+
String previousAction, dynamic previous, dynamic values) {
104+
if (previousAction == 'Set') {
105+
if (previous is num) {
106+
values['amount'] += previous;
107+
} else {
108+
throw 'Invalid Operation';
109+
}
110+
}
111+
if (previousAction == 'Increment') {
112+
values['amount'] += previous['amount'];
113+
}
114+
if (previousAction == 'Add') {
115+
throw 'Increment operation is invalid after Add operation';
116+
}
117+
if (previousAction == 'Remove') {
118+
throw 'Increment operation is invalid after Remove operation';
119+
}
120+
if (previousAction == 'AddUnique') {
121+
throw 'Increment operation is invalid after AddUnique operation';
122+
}
123+
if (previousAction == 'AddRelation') {
124+
throw 'Increment operation is invalid after AddRelation operation';
125+
}
126+
if (previousAction == 'RemoveRelation') {
127+
throw 'Increment operation is invalid after RemoveRelation operation';
128+
}
129+
return values;
130+
}
131+
132+
// AddUnique operation Merge
133+
dynamic _mergeWithPreviousAddUnique(
134+
String previousAction, dynamic previous, dynamic values) {
135+
if (previousAction == 'Set') {
136+
if (previous is List) {
137+
return _applyToValueAddUnique(previous, values['objects']);
138+
} else {
139+
throw 'Unable to add an item to a non-array.';
140+
}
141+
}
142+
if (previousAction == 'AddUnique') {
143+
values['objects'] =
144+
_applyToValueAddUnique(previous['objects'], values['objects']);
145+
return values;
146+
}
147+
if (previousAction == 'Add') {
148+
throw 'AddUnique operation is invalid after Add operation';
149+
}
150+
if (previousAction == 'Remove') {
151+
throw 'AddUnique operation is invalid after Reomve operation';
152+
}
153+
if (previousAction == 'Increment') {
154+
throw 'AddUnique operation is invalid after Increment operation';
155+
}
156+
if (previousAction == 'AddRelation') {
157+
throw 'AddUnique operation is invalid after AddRelation operation';
158+
}
159+
if (previousAction == 'RemoveRelation') {
160+
throw 'AddUnique operation is invalid after RemoveRelation operation';
161+
}
162+
return values;
163+
}
164+
165+
// AddRelation operation Merge
166+
dynamic _mergeWithPreviousAddRelation(
167+
String previousAction, dynamic previous, dynamic values) {
168+
if (previousAction == 'AddRelation') {
169+
if (values['objects'].length == 1) {
170+
previous['objects'].add(values['objects'].first);
171+
} else {
172+
previous['objects'].add(values['objects']);
173+
}
174+
values = previous;
175+
}
176+
if (previousAction == 'Set') {
177+
throw 'AddRelation operation is invalid after Set operation.';
178+
}
179+
if (previousAction == 'Increment') {
180+
throw 'AddRelation operation is invalid after Increment operation';
181+
}
182+
if (previousAction == 'Add') {
183+
throw 'AddRelation operation is invalid after Add operation';
184+
}
185+
if (previousAction == 'Remove') {
186+
throw 'AddRelation operation is invalid after Remove operation';
187+
}
188+
if (previousAction == 'AddUnique') {
189+
throw 'AddRelation operation is invalid after AddUnique operation';
190+
}
191+
if (previousAction == 'RemoveRelation') {
192+
throw 'AddRelation operation is invalid after RemoveRelation operation';
193+
}
194+
return values;
195+
}
196+
197+
// RemoveRelation operation Merge
198+
dynamic _mergeWithPreviousRemoveRelation(
199+
String previousAction, dynamic previous, dynamic values) {
200+
if (previousAction == 'RemoveRelation') {
201+
if (values['objects'].length == 1) {
202+
previous['objects'].add(values['objects'].first);
203+
} else {
204+
previous['objects'].add(values['objects']);
205+
}
206+
values = previous;
207+
}
208+
if (previousAction == 'Set') {
209+
throw 'RemoveRelation operation is invalid after Set operation.';
210+
}
211+
if (previousAction == 'Increment') {
212+
throw 'RemoveRelation operation is invalid after Increment operation';
213+
}
214+
if (previousAction == 'Add') {
215+
throw 'RemoveRelation operation is invalid after Add operation';
216+
}
217+
if (previousAction == 'Remove') {
218+
throw 'RemoveRelation operation is invalid after Remove operation';
219+
}
220+
if (previousAction == 'AddUnique') {
221+
throw 'RemoveRelation operation is invalid after AddUnique operation';
222+
}
223+
if (previousAction == 'AddRelation') {
224+
throw 'RemoveRelation operation is invalid after AddRelation operation';
225+
}
226+
return values;
227+
}
228+
229+
// service for AddUnique method
230+
dynamic _applyToValueAddUnique(dynamic oldValue, dynamic newValue) {
231+
for (var objectToAdd in newValue) {
232+
if (objectToAdd is ParseObject && objectToAdd.objectId != null) {
233+
var index = 0;
234+
for (var objc in oldValue) {
235+
if (objc is ParseObject && objc.objectId == objectToAdd.objectId) {
236+
oldValue[index] = objectToAdd;
237+
break;
238+
}
239+
index += 1;
240+
}
241+
if (index == oldValue.length) {
242+
oldValue.add(objectToAdd);
243+
}
244+
} else if (!oldValue.contains(objectToAdd)) {
245+
oldValue.add(objectToAdd);
246+
}
247+
}
248+
print(oldValue);
249+
return oldValue;
250+
}
251+
}

0 commit comments

Comments
 (0)