31 lines
1.2 KiB
SQL
31 lines
1.2 KiB
SQL
-- Redesign ratings table for single JSON timeseries entry with soft deletes
|
|
DROP TABLE IF EXISTS rating_new;
|
|
CREATE TABLE rating_new (
|
|
id TEXT PRIMARY KEY,
|
|
participant_id TEXT NOT NULL REFERENCES participant(id),
|
|
audio_file_id TEXT NOT NULL REFERENCES audio_file(id),
|
|
final_value REAL NOT NULL,
|
|
timeseries_data TEXT NOT NULL,
|
|
created_at INTEGER NOT NULL,
|
|
deleted_at INTEGER DEFAULT NULL
|
|
);
|
|
|
|
-- Copy existing data if any (transform to new format)
|
|
INSERT INTO rating_new (id, participant_id, audio_file_id, final_value, timeseries_data, created_at, deleted_at)
|
|
SELECT
|
|
id,
|
|
participant_id,
|
|
audio_file_id,
|
|
value as final_value,
|
|
'[{"timestamp":' || timestamp || ',"value":' || value || ',"time":' || (created_at * 1000) || '}]' as timeseries_data,
|
|
created_at,
|
|
CASE WHEN is_completed = 1 THEN NULL ELSE strftime('%s', 'now') * 1000 END as deleted_at
|
|
FROM rating
|
|
WHERE is_completed = 1; -- Only keep completed ratings, mark others as deleted
|
|
|
|
-- Drop old table and rename
|
|
DROP TABLE rating;
|
|
ALTER TABLE rating_new RENAME TO rating;
|
|
|
|
-- Create unique index for active ratings only
|
|
CREATE UNIQUE INDEX participant_audio_active ON rating (participant_id, audio_file_id) WHERE deleted_at IS NULL; |