From a0a7192fdecb1e440d01bfad464742d6251d52da Mon Sep 17 00:00:00 2001 From: Kacper Kula Date: Sat, 1 Feb 2025 13:33:23 +0000 Subject: [PATCH] feat: adding indexes for vault tables --- CHANGELOG.md | 3 +++ manifest.json | 2 +- package.json | 2 +- src/database/database.ts | 4 ++++ src/database/worker/database.ts | 15 +++++++++++++++ src/vaultSync/tables/filesTable.ts | 6 ++++++ src/vaultSync/tables/linksTable.ts | 7 +++++++ src/vaultSync/tables/tagsTable.ts | 5 +++++ src/vaultSync/tables/tasksTable.ts | 6 ++++++ versions.json | 3 ++- 10 files changed, 50 insertions(+), 3 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 526c83d..f2b1bd5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,6 @@ +# 0.22.1 (2025-02-01) +- Added indexes to the `files`, `tags`, `links` and `tasks` tables. This should speed up a lot of common queries performed agains these tables. + # 0.22.0 (2025-01-31) Breaking change: `created_at` and `modified_at` has been changed from JS unix epoch to ISO 8601 dates (human readable). Thanks to that many of date operations are now easier to perform. Example, extracting year from the creation date: diff --git a/manifest.json b/manifest.json index 6c4c3f7..786cfe7 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "id": "sqlseal", "name": "SQLSeal", - "version": "0.22.0", + "version": "0.22.1", "minAppVersion": "0.15.0", "description": "Use SQL in your notes to query your vault files and CSV content.", "author": "hypersphere", diff --git a/package.json b/package.json index 5e4df48..eff639c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "sqlseal", - "version": "0.22.0", + "version": "0.22.1", "description": "A plugin for Obsidian that allows you to run SQL queries on your notes.", "main": "main.js", "scripts": { diff --git a/src/database/database.ts b/src/database/database.ts index a3eef84..c80220c 100644 --- a/src/database/database.ts +++ b/src/database/database.ts @@ -80,6 +80,10 @@ export class SqlSealDatabase { await this.db.createTableNoTypes(name, columns, noDrop) } + async createIndex(indexName: string, tableName: string, columns: string[]) { + await this.db.createIndex(indexName, tableName, columns) + } + async getColumns(tableName: string) { return this.db.getColumns(tableName) } diff --git a/src/database/worker/database.ts b/src/database/worker/database.ts index 608e317..cb6191b 100644 --- a/src/database/worker/database.ts +++ b/src/database/worker/database.ts @@ -216,9 +216,24 @@ export class WorkerDatabase { } } + async explainQuery(query: string, params: Record) { + const stmt = this.db.prepare(`EXPLAIN QUERY PLAN ${query}`, recordToBindParams(params)) + const plan = [] + while (stmt.step()) { + plan.push(stmt.getAsObject()) + } + stmt.free() + return plan + } + async disconnect() { // FIXME: implement. } + + async createIndex(indexName: string, tableName: string, columns: string[]) { + const query = `CREATE INDEX IF NOT EXISTS ${indexName} ON ${tableName} (${columns.join(', ')})` + this.db.run(query) + } } Comlink.expose(WorkerDatabase); \ No newline at end of file diff --git a/src/vaultSync/tables/filesTable.ts b/src/vaultSync/tables/filesTable.ts index d62ab07..58a57c0 100644 --- a/src/vaultSync/tables/filesTable.ts +++ b/src/vaultSync/tables/filesTable.ts @@ -82,5 +82,11 @@ export class FilesFileSyncTable extends AFileSyncTable { async onInit(): Promise { this.db.createTableNoTypes(FILES_TABLE_NAME, ['id', 'name', 'path', 'created_at', 'modified_at', 'file_size']) this.columns = await this.db.getColumns(FILES_TABLE_NAME) + + // Indexes + const toIndex = ['id', 'name', 'path'] + await Promise.all(toIndex.map(column => + this.db.createIndex(`files_${column}_idx`, FILES_TABLE_NAME, [column]) + )) } } \ No newline at end of file diff --git a/src/vaultSync/tables/linksTable.ts b/src/vaultSync/tables/linksTable.ts index a806f2c..a08ca47 100644 --- a/src/vaultSync/tables/linksTable.ts +++ b/src/vaultSync/tables/linksTable.ts @@ -51,5 +51,12 @@ export class LinksFileSyncTable extends AFileSyncTable { async onInit(): Promise { await this.db.createTableNoTypes(this.tableName, ['path', 'target', 'position', 'display_text', 'target_exists']) + + + // Indexes + const toIndex = ['path', 'target'] + await Promise.all(toIndex.map(column => + this.db.createIndex(`links_${column}_idx`, this.tableName, [column]) + )) } } \ No newline at end of file diff --git a/src/vaultSync/tables/tagsTable.ts b/src/vaultSync/tables/tagsTable.ts index 8073a99..a3784a1 100644 --- a/src/vaultSync/tables/tagsTable.ts +++ b/src/vaultSync/tables/tagsTable.ts @@ -36,5 +36,10 @@ export class TagsFileSyncTable extends AFileSyncTable { async onInit(): Promise { await this.db.createTableNoTypes('tags', ['tag', 'fileId']) + // Indexes + const toIndex = ['fileId'] + await Promise.all(toIndex.map(column => + this.db.createIndex(`tags_${column}_idx`, this.tableName, [column]) + )) } } \ No newline at end of file diff --git a/src/vaultSync/tables/tasksTable.ts b/src/vaultSync/tables/tasksTable.ts index 1d2cd12..1492baa 100644 --- a/src/vaultSync/tables/tasksTable.ts +++ b/src/vaultSync/tables/tasksTable.ts @@ -49,5 +49,11 @@ export class TasksFileSyncTable extends AFileSyncTable { async onInit(): Promise { await this.db.createTableNoTypes('tasks', ['task', 'completed', 'filePath']) + + // Indexes + const toIndex = ['filePath'] + await Promise.all(toIndex.map(column => + this.db.createIndex(`tasks_${column}_idx`, this.tableName, [column]) + )) } } \ No newline at end of file diff --git a/versions.json b/versions.json index 6cd031d..1a57d68 100644 --- a/versions.json +++ b/versions.json @@ -36,5 +36,6 @@ "0.21.1": "0.15.0", "0.21.2": "0.15.0", "0.21.3": "0.15.0", - "0.22.0": "0.15.0" + "0.22.0": "0.15.0", + "0.22.1": "0.15.0" } \ No newline at end of file