allow adding fragments to comparer, instead of reloading from db.
This is a suboptimal implementation now, but is the API we want to end up with. Readers and Writers in persistence add fragments to the comparer when they become aware of, create, or link up fragments.
This commit is contained in:
parent
fa4efe0132
commit
447b0aa03c
4 changed files with 12 additions and 17 deletions
|
@ -108,6 +108,7 @@ index for fast lookup of how two fragments can be sorted
|
||||||
*/
|
*/
|
||||||
export default class FragmentIdComparer {
|
export default class FragmentIdComparer {
|
||||||
constructor(fragments) {
|
constructor(fragments) {
|
||||||
|
this._fragmentsById = fragments.reduce((map, f) => {map.set(f.id, f); return map;}, new Map());
|
||||||
this.rebuild(fragments);
|
this.rebuild(fragments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -157,6 +158,10 @@ export default class FragmentIdComparer {
|
||||||
// linkFragments(txn, firstFragmentId, secondFragmentId) {
|
// linkFragments(txn, firstFragmentId, secondFragmentId) {
|
||||||
|
|
||||||
// }
|
// }
|
||||||
|
add(fragment) {
|
||||||
|
this._fragmentsById[fragment.id] = fragment;
|
||||||
|
this.rebuild(this._fragmentsById.values());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//#ifdef TESTS
|
//#ifdef TESTS
|
||||||
|
|
|
@ -64,8 +64,9 @@ export default class GapWriter {
|
||||||
txn.timelineFragments.set(neighbourFragmentEntry.fragment);
|
txn.timelineFragments.set(neighbourFragmentEntry.fragment);
|
||||||
directionalAppend(entries, neighbourFragmentEntry, direction);
|
directionalAppend(entries, neighbourFragmentEntry, direction);
|
||||||
|
|
||||||
// update fragmentIdComparer here after linking up fragments?
|
// update fragmentIdComparer here after linking up fragments
|
||||||
this._fragmentIdComparer.rebuild(await txn.timelineFragments.all());
|
this._fragmentIdComparer.add(fragmentEntry.fragment);
|
||||||
|
this._fragmentIdComparer.add(neighbourFragmentEntry.fragment);
|
||||||
}
|
}
|
||||||
fragmentEntry.token = end;
|
fragmentEntry.token = end;
|
||||||
txn.timelineFragments.set(fragmentEntry.fragment);
|
txn.timelineFragments.set(fragmentEntry.fragment);
|
||||||
|
|
|
@ -40,6 +40,7 @@ export default class SyncWriter {
|
||||||
nextToken: null
|
nextToken: null
|
||||||
};
|
};
|
||||||
txn.timelineFragments.add(fragment);
|
txn.timelineFragments.add(fragment);
|
||||||
|
this._fragmentIdComparer.add(fragment);
|
||||||
return fragment;
|
return fragment;
|
||||||
} else {
|
} else {
|
||||||
return liveFragment;
|
return liveFragment;
|
||||||
|
@ -62,6 +63,7 @@ export default class SyncWriter {
|
||||||
nextToken: null
|
nextToken: null
|
||||||
};
|
};
|
||||||
txn.timelineFragments.add(newFragment);
|
txn.timelineFragments.add(newFragment);
|
||||||
|
this._fragmentIdComparer.add(newFragment);
|
||||||
return {oldFragment, newFragment};
|
return {oldFragment, newFragment};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -117,11 +119,6 @@ export default class SyncWriter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (timeline.limited) {
|
|
||||||
const fragments = await txn.timelineFragments.all(this._roomId);
|
|
||||||
this._fragmentIdComparer.rebuild(fragments);
|
|
||||||
}
|
|
||||||
|
|
||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,7 +16,6 @@ export default class TimelineReader {
|
||||||
this._storage.storeNames.timelineFragments,
|
this._storage.storeNames.timelineFragments,
|
||||||
]);
|
]);
|
||||||
let entries = [];
|
let entries = [];
|
||||||
let loadedFragment = false;
|
|
||||||
|
|
||||||
const timelineStore = txn.timelineEvents;
|
const timelineStore = txn.timelineEvents;
|
||||||
const fragmentStore = txn.timelineFragments;
|
const fragmentStore = txn.timelineFragments;
|
||||||
|
@ -36,28 +35,21 @@ export default class TimelineReader {
|
||||||
const fragment = await fragmentStore.get(this._roomId, eventKey.fragmentId);
|
const fragment = await fragmentStore.get(this._roomId, eventKey.fragmentId);
|
||||||
// this._fragmentIdComparer.addFragment(fragment);
|
// this._fragmentIdComparer.addFragment(fragment);
|
||||||
let fragmentEntry = new FragmentBoundaryEntry(fragment, direction.isBackward, this._fragmentIdComparer);
|
let fragmentEntry = new FragmentBoundaryEntry(fragment, direction.isBackward, this._fragmentIdComparer);
|
||||||
// append or prepend fragmentEntry, reuse func from GapPersister?
|
// append or prepend fragmentEntry, reuse func from GapWriter?
|
||||||
directionalAppend(entries, fragmentEntry, direction);
|
directionalAppend(entries, fragmentEntry, direction);
|
||||||
// don't count it in amount perhaps? or do?
|
// don't count it in amount perhaps? or do?
|
||||||
if (fragmentEntry.linkedFragmentId) {
|
if (fragmentEntry.linkedFragmentId) {
|
||||||
const nextFragment = await fragmentStore.get(this._roomId, fragmentEntry.linkedFragmentId);
|
const nextFragment = await fragmentStore.get(this._roomId, fragmentEntry.linkedFragmentId);
|
||||||
// this._fragmentIdComparer.addFragment(nextFragment);
|
this._fragmentIdComparer.add(nextFragment);
|
||||||
const nextFragmentEntry = new FragmentBoundaryEntry(nextFragment, direction.isForward, this._fragmentIdComparer);
|
const nextFragmentEntry = new FragmentBoundaryEntry(nextFragment, direction.isForward, this._fragmentIdComparer);
|
||||||
directionalAppend(entries, nextFragmentEntry, direction);
|
directionalAppend(entries, nextFragmentEntry, direction);
|
||||||
eventKey = new EventKey(nextFragmentEntry.fragmentId, nextFragmentEntry.eventIndex);
|
eventKey = new EventKey(nextFragmentEntry.fragmentId, nextFragmentEntry.eventIndex);
|
||||||
loadedFragment = true;
|
|
||||||
} else {
|
} else {
|
||||||
eventKey = null;
|
eventKey = null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// reload fragments
|
|
||||||
if (loadedFragment) {
|
|
||||||
const fragments = await fragmentStore.all(this._roomId);
|
|
||||||
this._fragmentIdComparer.rebuild(fragments);
|
|
||||||
}
|
|
||||||
|
|
||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Reference in a new issue