Introduce separate search index

Uses a fts5 virtual table, kept up to date via triggers on the records
table.
This commit is contained in:
Claudio Ortolina
2024-11-22 10:01:48 +00:00
parent be36c29f76
commit 2e2000fe01
6 changed files with 215 additions and 27 deletions
@@ -0,0 +1,151 @@
defmodule MusicLibrary.Repo.Migrations.CreateRecordsSearchIndex do
use Ecto.Migration
def up do
execute """
CREATE VIRTUAL TABLE records_search_index USING fts5(
id UNINDEXED,
type,
format,
title,
artists,
genres,
musicbrainz_id,
release_ids UNINDEXED,
included_release_group_ids UNINDEXED,
cover_hash UNINDEXED,
purchased_at UNINDEXED,
release
);
"""
flush()
execute """
CREATE TRIGGER records_search_index_before_update
BEFORE UPDATE ON records
BEGIN
DELETE FROM records_search_index WHERE id=OLD.id;
END;
"""
execute """
CREATE TRIGGER records_search_index_before_delete
BEFORE DELETE ON records
BEGIN
DELETE FROM records_search_index WHERE id=OLD.id;
END;
"""
execute """
CREATE TRIGGER records_after_insert
AFTER INSERT ON records
BEGIN
INSERT INTO records_search_index(
id,
type,
format,
title,
artists,
genres,
musicbrainz_id,
release_ids,
included_release_group_ids,
cover_hash,
purchased_at,
release
) SELECT
id,
type,
format,
title,
artists,
genres,
musicbrainz_id,
release_ids,
included_release_group_ids,
cover_hash,
purchased_at,
release
FROM records
WHERE NEW.id = records.id;
END;
"""
execute """
CREATE TRIGGER records_after_update
AFTER UPDATE ON records
BEGIN
INSERT INTO records_search_index(
id,
type,
format,
title,
artists,
genres,
musicbrainz_id,
release_ids,
included_release_group_ids,
cover_hash,
purchased_at,
release
) SELECT
id,
type,
format,
title,
artists,
genres,
musicbrainz_id,
release_ids,
included_release_group_ids,
cover_hash,
purchased_at,
release
FROM records
WHERE NEW.id = records.id;
END;
"""
flush()
execute """
INSERT INTO records_search_index(
id,
type,
format,
title,
artists,
genres,
musicbrainz_id,
release_ids,
included_release_group_ids,
cover_hash,
purchased_at,
release
) SELECT
id,
type,
format,
title,
artists,
genres,
musicbrainz_id,
release_ids,
included_release_group_ids,
cover_hash,
purchased_at,
release
FROM records;
"""
flush()
end
def down do
execute "DROP TRIGGER IF EXISTS records_search_index_before_update"
execute "DROP TRIGGER IF EXISTS records_search_index_before_delete"
execute "DROP TRIGGER IF EXISTS records_after_update"
execute "DROP TABLE records_search_index"
end
end