mirror of
https://github.com/toeverything/AFFiNE.git
synced 2026-09-07 01:09:54 +08:00
feat: refresh index if version changed (#14150)
This commit is contained in:
@@ -143,4 +143,8 @@ export class CloudIndexerStorage extends IndexerStorageBase {
|
||||
override async refreshIfNeed(): Promise<void> {
|
||||
return Promise.resolve();
|
||||
}
|
||||
|
||||
override async indexVersion(): Promise<number> {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -218,4 +218,10 @@ export class IndexedDBIndexerStorage extends IndexerStorageBase {
|
||||
this.tableUpdate$.next(table);
|
||||
this.channel.postMessage({ type: 'indexer-updated', table });
|
||||
}
|
||||
|
||||
// Get the current indexer version
|
||||
// increase this number to re-index all docs
|
||||
async indexVersion(): Promise<number> {
|
||||
return Promise.resolve(1);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -112,6 +112,7 @@ export interface NativeDBApis {
|
||||
query: string
|
||||
) => Promise<{ start: number; end: number }[]>;
|
||||
ftsFlushIndex: (id: string) => Promise<void>;
|
||||
ftsIndexVersion: () => Promise<number>;
|
||||
}
|
||||
|
||||
type NativeDBApisWrapper = NativeDBApis extends infer APIs
|
||||
@@ -119,7 +120,7 @@ type NativeDBApisWrapper = NativeDBApis extends infer APIs
|
||||
[K in keyof APIs]: APIs[K] extends (...args: any[]) => any
|
||||
? Parameters<APIs[K]> extends [string, ...infer Rest]
|
||||
? (...args: Rest) => ReturnType<APIs[K]>
|
||||
: never
|
||||
: (...args: Parameters<APIs[K]>) => ReturnType<APIs[K]>
|
||||
: never;
|
||||
}
|
||||
: never;
|
||||
|
||||
@@ -241,4 +241,8 @@ export class SqliteIndexerStorage extends IndexerStorageBase {
|
||||
async refreshIfNeed(): Promise<void> {
|
||||
await this.connection.apis.ftsFlushIndex();
|
||||
}
|
||||
|
||||
async indexVersion(): Promise<number> {
|
||||
return this.connection.apis.ftsIndexVersion();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,4 +88,7 @@ export class DummyIndexerStorage extends IndexerStorageBase {
|
||||
override async refreshIfNeed(): Promise<void> {
|
||||
return Promise.resolve();
|
||||
}
|
||||
override async indexVersion(): Promise<number> {
|
||||
return Promise.resolve(0);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -64,6 +64,7 @@ export interface IndexerStorage extends Storage {
|
||||
|
||||
refresh<T extends keyof IndexerSchema>(table: T): Promise<void>;
|
||||
refreshIfNeed(): Promise<void>;
|
||||
indexVersion(): Promise<number>;
|
||||
}
|
||||
|
||||
type ResultPagination = {
|
||||
@@ -178,4 +179,6 @@ export abstract class IndexerStorageBase implements IndexerStorage {
|
||||
abstract refresh<T extends keyof IndexerSchema>(table: T): Promise<void>;
|
||||
|
||||
abstract refreshIfNeed(): Promise<void>;
|
||||
|
||||
abstract indexVersion(): Promise<number>;
|
||||
}
|
||||
|
||||
@@ -106,10 +106,6 @@ export interface IndexerSync {
|
||||
}
|
||||
|
||||
export class IndexerSyncImpl implements IndexerSync {
|
||||
/**
|
||||
* increase this number to re-index all docs
|
||||
*/
|
||||
readonly INDEXER_VERSION = 2;
|
||||
private abort: AbortController | null = null;
|
||||
private readonly rootDocId = this.doc.spaceId;
|
||||
private readonly status = new IndexerSyncStatus(this.rootDocId);
|
||||
@@ -266,7 +262,8 @@ export class IndexerSyncImpl implements IndexerSync {
|
||||
this.status.errorMessage = null;
|
||||
this.status.statusUpdatedSubject$.next(true);
|
||||
|
||||
console.log('indexer sync start');
|
||||
const indexVersion = await this.indexer.indexVersion();
|
||||
console.log('indexer sync start, version: ', indexVersion);
|
||||
|
||||
const unsubscribe = this.doc.subscribeDocUpdate(update => {
|
||||
if (!this.status.rootDocReady) {
|
||||
@@ -402,7 +399,7 @@ export class IndexerSyncImpl implements IndexerSync {
|
||||
docIndexedClock &&
|
||||
docIndexedClock.timestamp.getTime() ===
|
||||
docClock.timestamp.getTime() &&
|
||||
docIndexedClock.indexerVersion === this.INDEXER_VERSION
|
||||
docIndexedClock.indexerVersion === indexVersion
|
||||
) {
|
||||
// doc is already indexed, just skip
|
||||
continue;
|
||||
@@ -468,7 +465,7 @@ export class IndexerSyncImpl implements IndexerSync {
|
||||
await this.indexerSync.setDocIndexedClock({
|
||||
docId,
|
||||
timestamp: docClock.timestamp,
|
||||
indexerVersion: this.INDEXER_VERSION,
|
||||
indexerVersion: indexVersion,
|
||||
});
|
||||
// #endregion
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user