musicus_mobile/lib/database.moor
Elias Projahn 4b178752b9 Redo how works are stored
Before works where stored using a complicated tree structure where each
part references its parent. Now it's a flat structure that keeps track
of the relations using a new field named part_level. The corresponding
query was simplified accordingly. Also, the updateWork function was
rewritten.
2020-03-21 14:34:45 +01:00

52 lines
1.4 KiB
Text

CREATE TABLE persons (
id INTEGER NOT NULL PRIMARY KEY,
first_name TEXT NOT NULL,
last_name TEXT NOT NULL
);
CREATE TABLE instruments (
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL
);
CREATE TABLE works (
id INTEGER NOT NULL PRIMARY KEY,
composer INTEGER REFERENCES persons(id),
title TEXT NOT NULL,
part_of INTEGER REFERENCES works(id) ON DELETE CASCADE,
part_index INTEGER,
part_level INTEGER
);
CREATE TABLE instrumentations (
work INTEGER NOT NULL REFERENCES works(id) ON DELETE CASCADE,
instrument INTEGER NOT NULL REFERENCES instruments(id) ON DELETE CASCADE
);
allPersons:
SELECT * FROM persons ORDER BY last_name;
personById:
SELECT * FROM persons WHERE id = :id LIMIT 1;
allInstruments:
SELECT * FROM instruments ORDER BY name;
instrumentById:
SELECT * FROM instruments WHERE id = :id LIMIT 1;
workById:
SELECT * FROM works WHERE id = :id LIMIT 1;
workParts:
SELECT * FROM works WHERE part_of = :id ORDER BY part_index;
-- TODO: Uncomment this once https://github.com/simolus3/moor/issues/453 is fixed.
-- worksByComposer(:id AS INTEGER):
-- SELECT DISTINCT A.* FROM works A, works B ON A.id = B.part_of
-- WHERE A.composer = :id OR B.composer = :id;
instrumentsByWork:
SELECT instruments.* FROM instrumentations
JOIN instruments ON instrumentations.instrument=instruments.id
WHERE instrumentations.work = :workId;