Skip to content

Commit 7407a41

Browse files
committed
update all the stuffs
1 parent 50bfa43 commit 7407a41

File tree

2 files changed

+101
-11
lines changed

2 files changed

+101
-11
lines changed

packages/graph/src/-private/-diff.ts

+91-11
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { deprecate } from '@ember/debug';
22

3+
import { DEBUG_RELATIONSHIP_NOTIFICATIONS } from '@warp-drive/build-config/debugging';
34
import {
45
DEPRECATE_NON_UNIQUE_PAYLOADS,
56
DEPRECATE_RELATIONSHIP_REMOTE_UPDATE_CLEARING_LOCAL_STATE,
@@ -163,17 +164,29 @@ function _compare<T>(
163164
const finalLength = finalState.length;
164165
const prevLength = prevState.length;
165166
const iterationLength = Math.max(finalLength, prevLength);
166-
const equalLength = finalLength === prevLength;
167+
const equalLength = priorLocalState ? finalLength === priorLocalState.length : finalLength === prevLength;
167168
let remoteOrderChanged = finalSet.size !== prevSet.size;
168169
let changed: boolean = priorLocalState ? finalSet.size !== priorLocalState.length : remoteOrderChanged;
169170
const added = new Set<T>();
170171
const removed = new Set<T>();
171172
const priorLocalLength = priorLocalState?.length ?? 0;
172173

173-
changed &&
174-
console.log(
175-
`changed because ${priorLocalState ? 'finalSet.size !== priorLocalState.length' : 'finalSet.size !== prevSet.size'}`
176-
);
174+
if (DEBUG_RELATIONSHIP_NOTIFICATIONS) {
175+
if (changed) {
176+
// console.log({
177+
// priorState: priorLocalState?.slice(),
178+
// finalState: finalState.slice(),
179+
// prevState: prevState.slice(),
180+
// });
181+
}
182+
183+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
184+
changed &&
185+
// eslint-disable-next-line no-console
186+
console.log(
187+
`changed because ${priorLocalState ? 'finalSet.size !== priorLocalState.length' : 'finalSet.size !== prevSet.size'}`
188+
);
189+
}
177190

178191
for (let i = 0; i < iterationLength; i++) {
179192
let member: T | undefined;
@@ -186,7 +199,21 @@ function _compare<T>(
186199
if (i < priorLocalLength) {
187200
const priorLocalMember = priorLocalState![i];
188201
if (priorLocalMember !== member) {
189-
!changed && console.log(`changed because priorLocalMember !== member && !prevSet.has(member)`);
202+
if (DEBUG_RELATIONSHIP_NOTIFICATIONS) {
203+
if (!changed) {
204+
// console.log({
205+
// priorLocalMember,
206+
// member,
207+
// i,
208+
// priorState: priorLocalState?.slice(),
209+
// finalState: finalState.slice(),
210+
// prevState: prevState.slice(),
211+
// });
212+
}
213+
214+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions, no-console
215+
!changed && console.log(`changed because priorLocalMember !== member && !prevSet.has(member)`);
216+
}
190217
changed = true;
191218
}
192219
}
@@ -220,11 +247,19 @@ function _compare<T>(
220247
if (i < priorLocalLength) {
221248
const priorLocalMember = priorLocalState![i];
222249
if (priorLocalMember !== member) {
223-
!changed && console.log(`changed because priorLocalMember !== member && member !== prevMember`);
250+
if (DEBUG_RELATIONSHIP_NOTIFICATIONS) {
251+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions, no-console
252+
!changed && console.log(`changed because priorLocalMember !== member && member !== prevMember`);
253+
}
224254
changed = true;
225255
}
226-
} else {
227-
!changed && console.log(`changed because priorLocalMember !== member && index >= priorLocalLength`);
256+
} else if (i < finalLength) {
257+
// if we have exceeded the length of priorLocalState and we are within the range
258+
// of the finalState then we must have changed
259+
if (DEBUG_RELATIONSHIP_NOTIFICATIONS) {
260+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions, no-console
261+
!changed && console.log(`changed because priorMember !== member && index >= priorLocalLength`);
262+
}
228263
changed = true;
229264
}
230265
}
@@ -244,8 +279,53 @@ function _compare<T>(
244279
}
245280

246281
if (!finalSet.has(prevMember)) {
247-
!changed && console.log(`changed because !finalSet.has(prevMember)`);
248-
changed = true;
282+
// if we are within finalLength, we can only be "changed" if we've already exceeded
283+
// the index range of priorLocalState, as otherwise the previous member may still
284+
// be removed.
285+
//
286+
// prior local: [1, 2, 3, 4]
287+
// final state: [1, 2, 3]
288+
// prev remote state: [1, 2, 5, 3, 4]
289+
// i === 2
290+
// prevMember === 5
291+
// !finalSet.has(prevMember) === true
292+
//
293+
// because we will become changed at i===3,
294+
// we do not need to worry about becoming changed at i===2
295+
// as the arrays until now are still the same
296+
//
297+
// prior local: [1, 2, 3]
298+
// final state: [1, 2, 3, 4]
299+
// prev remote state: [1, 2, 5, 3, 4]
300+
// i === 2
301+
// prevMember === 5
302+
// !finalSet.has(prevMember) === true
303+
//
304+
// because we will become changed at i===3
305+
// we do not need to worry about becoming changed at i===2
306+
//
307+
// prior local: [1, 2, 3]
308+
// final state: [1, 2, 3]
309+
// prev remote state: [1, 2, 5, 3, 4]
310+
// i === 2
311+
// prevMember === 5
312+
// !finalSet.has(prevMember) === true
313+
//
314+
// because we have same length and same membership order
315+
// we do not need to worry about becoming changed at i===2
316+
//
317+
// if you do not have a priorLocalState you can't be changed
318+
// ergo, we never need to set changed in this branch.
319+
// this log can still be useful for debugging.
320+
if (DEBUG_RELATIONSHIP_NOTIFICATIONS) {
321+
// eslint-disable-next-line @typescript-eslint/no-unused-expressions
322+
!changed &&
323+
// eslint-disable-next-line no-console
324+
console.log(`changed because i >= priorLocalLength && i < finalLength && !finalSet.has(prevMember)`);
325+
}
326+
//
327+
// we do still set remoteOrderChanged as it has
328+
remoteOrderChanged = true;
249329
removed.add(prevMember);
250330
onDel(prevMember);
251331
}

packages/graph/src/-private/operations/replace-related-records.ts

+10
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,11 @@ function replaceRelatedRecordsRemote(graph: Graph, op: ReplaceRelatedRecordsOper
218218
if (relationship.additions?.has(identifier)) {
219219
relationship.additions.delete(identifier);
220220
} else {
221+
if (!relationship.isDirty) {
222+
console.log(
223+
`setting relationship to dirty because the remote addition was not in our previous list of local additions`
224+
);
225+
}
221226
relationship.isDirty = true;
222227
}
223228
addToInverse(graph, identifier, definition.inverseKey, op.record, isRemote);
@@ -229,6 +234,11 @@ function replaceRelatedRecordsRemote(graph: Graph, op: ReplaceRelatedRecordsOper
229234
if (relationship.removals?.has(identifier)) {
230235
relationship.removals.delete(identifier);
231236
} else {
237+
if (!relationship.isDirty) {
238+
console.log(
239+
`setting relationship to dirty because the remote removal was not in our previous list of local removals`
240+
);
241+
}
232242
relationship.isDirty = true;
233243
}
234244
removeFromInverse(graph, identifier, definition.inverseKey, op.record, isRemote);

0 commit comments

Comments
 (0)