feat: added first class citizen tags

This commit is contained in:
didier committed 2026-09-16 07:14:31 -04:00
1 parent 57bcd549d1
commit 4dc42d91c2
4 files changed
+469 -38

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
-- +goose Up
CREATE TABLE IF NOT EXISTS tag (
id INTEGER PRIMARY KEY,
name TEXT NOT NULL UNIQUE,
description TEXT NOT NULL DEFAULT ''
);
CREATE TABLE IF NOT EXISTS flashcard_tag (
flashcard_id INTEGER NOT NULL REFERENCES flashcard(_id) ON DELETE CASCADE,
tag_id INTEGER NOT NULL REFERENCES tag(id),
PRIMARY KEY (flashcard_id, tag_id)
);
CREATE INDEX IF NOT EXISTS idx_flashcard_tag_tag_id ON flashcard_tag(tag_id);
INSERT OR IGNORE INTO tag(name)
SELECT DISTINCT j.value
FROM flashcard f, json_each(f.tags) j
WHERE f.tags IS NOT NULL AND j.value != '';
INSERT OR IGNORE INTO flashcard_tag(flashcard_id, tag_id)
SELECT f._id, t.id
FROM flashcard f, json_each(f.tags) j
JOIN tag t ON t.name = j.value
WHERE f.tags IS NOT NULL AND j.value != '';
ALTER TABLE flashcard DROP COLUMN tags;
-- +goose Down
ALTER TABLE flashcard ADD COLUMN tags TEXT;
UPDATE flashcard SET tags = (
SELECT json_group_array(t.name)
FROM flashcard_tag ft JOIN tag t ON t.id = ft.tag_id
WHERE ft.flashcard_id = flashcard._id
);
DROP INDEX IF EXISTS idx_flashcard_tag_tag_id;
DROP TABLE IF EXISTS flashcard_tag;
DROP TABLE IF EXISTS tag;