Skip to content

Commit 4d42377

Browse files
committed
feat: index persistance
1 parent 117cef6 commit 4d42377

File tree

11 files changed

+98
-10
lines changed

11 files changed

+98
-10
lines changed

src/command/IndexWorkspaceCommand.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,6 @@ export default class IndexWorkspaceCommand extends Command {
77
}
88

99
public async execute(...args: any[]): Promise<void> {
10-
await IndexRunner.indexWorkspace();
10+
await IndexRunner.indexWorkspace(true);
1111
}
1212
}

src/indexer/IndexDataSerializer.ts

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
import { SavedIndex } from 'types/indexer';
2+
3+
export class IndexDataSerializer {
4+
public serialize(data: SavedIndex): string {
5+
return JSON.stringify(data, this.replacer);
6+
}
7+
8+
public deserialize(data: string): SavedIndex {
9+
return JSON.parse(data, this.reviver);
10+
}
11+
12+
private replacer(key: string, value: any) {
13+
if (value instanceof Map) {
14+
return { __type: 'Map', value: Array.from(value.entries()) };
15+
}
16+
return value;
17+
}
18+
19+
private reviver(key: string, value: any) {
20+
if (value && typeof value === 'object' && value.__type === 'Map') {
21+
return new Map(value.value);
22+
}
23+
return value;
24+
}
25+
}

src/indexer/IndexManager.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,10 @@ class IndexManager {
5656
Logger.logWithTime('Indexing workspace', workspaceFolder.name);
5757

5858
for (const indexer of this.indexers) {
59-
if (!force && !this.shouldIndex(indexer)) {
59+
this.indexStorage.loadIndex(workspaceFolder, indexer.getId(), indexer.getVersion());
60+
61+
if (!force && !this.shouldIndex(workspaceFolder, indexer)) {
62+
Logger.logWithTime('Loaded index from storage', workspaceFolder.name, indexer.getId());
6063
continue;
6164
}
6265
progress.report({ message: `Indexing - ${indexer.getName()}`, increment: 0 });
@@ -88,6 +91,7 @@ class IndexManager {
8891
);
8992

9093
this.indexStorage.set(workspaceFolder, indexer.getId(), indexData);
94+
this.indexStorage.saveIndex(workspaceFolder, indexer.getId(), indexer.getVersion());
9195

9296
clear([indexer.getId()]);
9397

@@ -183,8 +187,8 @@ class IndexManager {
183187
clear([indexer.getId()]);
184188
}
185189

186-
protected shouldIndex(index: IndexerInstance): boolean {
187-
return true;
190+
protected shouldIndex(workspaceFolder: WorkspaceFolder, index: IndexerInstance): boolean {
191+
return !this.indexStorage.hasIndex(workspaceFolder, index.getId());
188192
}
189193
}
190194

src/indexer/IndexRunner.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class IndexRunner {
1414
title: '[Magento Toolbox]',
1515
},
1616
async progress => {
17-
await IndexManager.indexWorkspace(workspaceFolder, progress);
17+
await IndexManager.indexWorkspace(workspaceFolder, progress, force);
1818
}
1919
);
2020
}

src/indexer/IndexStorage.ts

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import { WorkspaceFolder } from 'vscode';
2-
import { IndexerKey, IndexerStorage, IndexedFilePath } from 'types/indexer';
2+
import { IndexerKey, IndexerStorage, IndexedFilePath, SavedIndex } from 'types/indexer';
3+
import { IndexDataSerializer } from './IndexDataSerializer';
4+
import Context from 'common/Context';
5+
import ExtensionState from 'common/ExtensionState';
36

47
export default class IndexStorage {
58
private _indexStorage: IndexerStorage = {};
9+
private serializer = new IndexDataSerializer();
610

711
public set(workspaceFolder: WorkspaceFolder, key: IndexerKey, value: Map<IndexedFilePath, any>) {
812
if (!this._indexStorage[workspaceFolder.uri.fsPath]) {
@@ -23,11 +27,44 @@ export default class IndexStorage {
2327
this._indexStorage = {};
2428
}
2529

26-
public async load() {
27-
// TODO: Implement
30+
public hasIndex(workspaceFolder: WorkspaceFolder, key: IndexerKey) {
31+
return !!this._indexStorage[workspaceFolder.uri.fsPath]?.[key];
2832
}
2933

30-
public async save() {
31-
// TODO: Implement
34+
public saveIndex(workspaceFolder: WorkspaceFolder, key: IndexerKey, version: number) {
35+
const indexData = this._indexStorage[workspaceFolder.uri.fsPath][key];
36+
37+
const savedIndex: SavedIndex = {
38+
version,
39+
data: indexData,
40+
};
41+
const serialized = this.serializer.serialize(savedIndex);
42+
43+
ExtensionState.context.globalState.update(
44+
`index-storage-${workspaceFolder.uri.fsPath}-${key}`,
45+
serialized
46+
);
47+
}
48+
49+
public loadIndex(workspaceFolder: WorkspaceFolder, key: IndexerKey, version: number) {
50+
const serialized = ExtensionState.context.globalState.get<string>(
51+
`index-storage-${workspaceFolder.uri.fsPath}-${key}`
52+
);
53+
54+
if (!serialized) {
55+
return undefined;
56+
}
57+
58+
const savedIndex = this.serializer.deserialize(serialized);
59+
60+
if (savedIndex.version !== version) {
61+
return undefined;
62+
}
63+
64+
if (!this._indexStorage[workspaceFolder.uri.fsPath]) {
65+
this._indexStorage[workspaceFolder.uri.fsPath] = {};
66+
}
67+
68+
this._indexStorage[workspaceFolder.uri.fsPath][key] = savedIndex.data;
3269
}
3370
}

src/indexer/Indexer.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@ export abstract class Indexer<D = any> {
66
public abstract getName(): string;
77
public abstract getPattern(uri: Uri): GlobPattern;
88
public abstract indexFile(uri: Uri): Promise<D | undefined>;
9+
public abstract getVersion(): number;
910
}

src/indexer/autoload-namespace/AutoloadNamespaceIndexer.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ import { IndexerKey } from 'types/indexer';
77
export default class AutoloadNamespaceIndexer extends Indexer<Namespace[]> {
88
public static readonly KEY = 'autoloadNamespace';
99

10+
public getVersion(): number {
11+
return 1;
12+
}
13+
1014
public getId(): IndexerKey {
1115
return AutoloadNamespaceIndexer.KEY;
1216
}

src/indexer/di/DiIndexer.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ export default class DiIndexer extends Indexer<DiData> {
3030
});
3131
}
3232

33+
public getVersion(): number {
34+
return 1;
35+
}
36+
3337
public getId(): IndexerKey {
3438
return DiIndexer.KEY;
3539
}

src/indexer/events/EventsIndexer.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,10 @@ export default class EventsIndexer extends Indexer<Event[]> {
2222
});
2323
}
2424

25+
public getVersion(): number {
26+
return 1;
27+
}
28+
2529
public getId(): IndexerKey {
2630
return EventsIndexer.KEY;
2731
}

src/indexer/module/ModuleIndexer.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,10 @@ export default class ModuleIndexer extends Indexer<Module> {
2323
});
2424
}
2525

26+
public getVersion(): number {
27+
return 1;
28+
}
29+
2630
public getId(): IndexerKey {
2731
return ModuleIndexer.KEY;
2832
}

0 commit comments

Comments
 (0)