refactor(06-01): consolidate search queries to use track_metadata VIEW

- SearchFTS uses JOIN track_metadata instead of 5-table inline JOIN
- SearchFTSByFilename uses JOIN track_metadata instead of 5-table inline JOIN
- SearchFTSTracks uses JOIN track_metadata instead of 6-table inline JOIN
- RebuildSearchIndex selects from track_metadata instead of inline JOIN
- All 15 database tests pass with -race
This commit is contained in:
2026-03-04 19:23:11 -05:00
parent 3e9edd05e8
commit 9159b409dc
+31 -91
View File
@@ -33,25 +33,13 @@ func (d *DB) SearchFTS(
rows, err := d.db.QueryContext(d.Ctx, ` rows, err := d.db.QueryContext(d.Ctx, `
SELECT SELECT
af.file_path, tm.file_path,
af.length_milliseconds, tm.length_milliseconds,
COALESCE(r.name, ''), tm.title,
COALESCE(ac.text, ''), tm.artist_name,
COALESCE(rg.name, '') tm.album
FROM search_index si FROM search_index si
JOIN audio_files af ON af.id = si.rowid JOIN track_metadata tm ON tm.id = si.rowid
LEFT JOIN recordings r
ON af.recording_id = r.id
LEFT JOIN artist_credit ac
ON r.artist_credit_id = ac.id
LEFT JOIN (
SELECT recording_id,
MIN(release_group_id) AS release_group_id
FROM release_group_recordings
GROUP BY recording_id
) rgr ON r.id = rgr.recording_id
LEFT JOIN release_groups rg
ON rgr.release_group_id = rg.id
WHERE search_index MATCH ? WHERE search_index MATCH ?
ORDER BY rank ORDER BY rank
LIMIT ? LIMIT ?
@@ -91,25 +79,13 @@ func (d *DB) SearchFTSByFilename(
rows, err := d.db.QueryContext(d.Ctx, ` rows, err := d.db.QueryContext(d.Ctx, `
SELECT SELECT
af.file_path, tm.file_path,
af.length_milliseconds, tm.length_milliseconds,
COALESCE(r.name, ''), tm.title,
COALESCE(ac.text, ''), tm.artist_name,
COALESCE(rg.name, '') tm.album
FROM search_index si FROM search_index si
JOIN audio_files af ON af.id = si.rowid JOIN track_metadata tm ON tm.id = si.rowid
LEFT JOIN recordings r
ON af.recording_id = r.id
LEFT JOIN artist_credit ac
ON r.artist_credit_id = ac.id
LEFT JOIN (
SELECT recording_id,
MIN(release_group_id) AS release_group_id
FROM release_group_recordings
GROUP BY recording_id
) rgr ON r.id = rgr.recording_id
LEFT JOIN release_groups rg
ON rgr.release_group_id = rg.id
WHERE search_index MATCH ? WHERE search_index MATCH ?
ORDER BY rank ORDER BY rank
LIMIT ? LIMIT ?
@@ -167,24 +143,8 @@ func (d *DB) RebuildSearchIndex() error {
_, err := d.db.ExecContext(d.Ctx, ` _, err := d.db.ExecContext(d.Ctx, `
INSERT INTO search_index(rowid, file_path, title, artist, album) INSERT INTO search_index(rowid, file_path, title, artist, album)
SELECT SELECT id, file_path, title, artist_name, album
af.id, FROM track_metadata
af.file_path,
COALESCE(r.name, ''),
COALESCE(ac.text, ''),
COALESCE(rg.name, '')
FROM audio_files af
LEFT JOIN recordings r ON af.recording_id = r.id
LEFT JOIN artist_credit ac
ON r.artist_credit_id = ac.id
LEFT JOIN (
SELECT recording_id,
MIN(release_group_id) AS release_group_id
FROM release_group_recordings
GROUP BY recording_id
) rgr ON r.id = rgr.recording_id
LEFT JOIN release_groups rg
ON rgr.release_group_id = rg.id
`) `)
if err != nil { if err != nil {
return fmt.Errorf( return fmt.Errorf(
@@ -231,44 +191,24 @@ func (d *DB) SearchFTSTracks(
rows, err := d.db.QueryContext(d.Ctx, ` rows, err := d.db.QueryContext(d.Ctx, `
SELECT SELECT
af.file_path, tm.file_path,
af.length_milliseconds, tm.length_milliseconds,
COALESCE(r.name, '') AS title, tm.title,
COALESCE(ac.text, '') AS artist_name, tm.artist_name,
r.track_number, tm.track_number,
r.disc_number, tm.disc_number,
COALESCE(rg.name, '') AS album, tm.album,
CAST(COALESCE( tm.genre,
(SELECT GROUP_CONCAT(g.name, '||') tm.year,
FROM recording_genres rg_sub tm.composer,
JOIN genres g ON rg_sub.genre_id = g.id tm.file_type,
WHERE rg_sub.recording_id = r.id), tm.sample_rate,
'' tm.bit_depth,
) AS TEXT) AS genre, tm.channels,
COALESCE(r.year, 0) AS year, tm.bitrate,
COALESCE(r.composer, '') AS composer, tm.file_size
COALESCE(ft.extension, '') AS file_type,
af.sample_rate,
af.bit_depth,
af.channels,
af.bitrate,
af.file_size
FROM search_index si FROM search_index si
JOIN audio_files af ON af.id = si.rowid JOIN track_metadata tm ON tm.id = si.rowid
LEFT JOIN recordings r
ON af.recording_id = r.id
LEFT JOIN artist_credit ac
ON r.artist_credit_id = ac.id
LEFT JOIN (
SELECT recording_id,
MIN(release_group_id) AS release_group_id
FROM release_group_recordings
GROUP BY recording_id
) rgr ON r.id = rgr.recording_id
LEFT JOIN release_groups rg
ON rgr.release_group_id = rg.id
LEFT JOIN file_types ft
ON af.file_type_id = ft.id
WHERE search_index MATCH ? WHERE search_index MATCH ?
ORDER BY rank ORDER BY rank
LIMIT ? LIMIT ?