release / govulncheck (push) Successful in 17s
release / web (push) Successful in 1m33s
release / go (push) Successful in 1m49s
release / integration (push) Successful in 5m42s
release / android (push) Successful in 5m59s
release / Build signed APK (releases and dev) (push) Successful in 6m9s
release / Attach APK to the Release (tag releases only) (push) Skipped
release / Build + push container image (push) Successful in 16s
release / Verify release artifacts (tag releases only) (push) Skipped
Applies rule 32's migration exception: each header still says what the schema was, what changes and what it prevents, but task, milestone, decision and rule ids are replaced by the practice they stood for, the operator quotes by the decision, single-install counts are dropped, and pointers to a deleted package and an external design doc are gone. golang-migrate keeps no checksum, so editing applied migrations' comments is safe. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
34 lines
1.6 KiB
SQL
34 lines
1.6 KiB
SQL
-- ListenBrainz similarity ingest. Two symmetric tables — tracks and
|
|
-- artists — both keyed by (a_id, b_id, source) so the schema reserves room
|
|
-- for additional similarity sources (musicbrainz_tag, user_cooccurrence)
|
|
-- alongside listenbrainz. M4b only writes 'listenbrainz' rows.
|
|
--
|
|
-- The (a_id, score DESC) index satisfies M4c's hot path: "for seed S, give
|
|
-- me top-N similar tracks/artists descending by score."
|
|
|
|
CREATE TABLE track_similarity (
|
|
track_a_id uuid NOT NULL REFERENCES tracks(id) ON DELETE CASCADE,
|
|
track_b_id uuid NOT NULL REFERENCES tracks(id) ON DELETE CASCADE,
|
|
score DOUBLE PRECISION NOT NULL,
|
|
source TEXT NOT NULL CHECK (source IN ('listenbrainz', 'musicbrainz_tag', 'user_cooccurrence')),
|
|
fetched_at timestamptz NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (track_a_id, track_b_id, source),
|
|
CHECK (track_a_id <> track_b_id)
|
|
);
|
|
|
|
CREATE INDEX track_similarity_a_score_idx
|
|
ON track_similarity (track_a_id, score DESC);
|
|
|
|
CREATE TABLE artist_similarity (
|
|
artist_a_id uuid NOT NULL REFERENCES artists(id) ON DELETE CASCADE,
|
|
artist_b_id uuid NOT NULL REFERENCES artists(id) ON DELETE CASCADE,
|
|
score DOUBLE PRECISION NOT NULL,
|
|
source TEXT NOT NULL CHECK (source IN ('listenbrainz', 'musicbrainz_tag', 'user_cooccurrence')),
|
|
fetched_at timestamptz NOT NULL DEFAULT now(),
|
|
PRIMARY KEY (artist_a_id, artist_b_id, source),
|
|
CHECK (artist_a_id <> artist_b_id)
|
|
);
|
|
|
|
CREATE INDEX artist_similarity_a_score_idx
|
|
ON artist_similarity (artist_a_id, score DESC);
|