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, `
SELECT
af.file_path,
af.length_milliseconds,
COALESCE(r.name, ''),
COALESCE(ac.text, ''),
COALESCE(rg.name, '')
tm.file_path,
tm.length_milliseconds,
tm.title,
tm.artist_name,
tm.album
FROM search_index si
JOIN audio_files af ON af.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
JOIN track_metadata tm ON tm.id = si.rowid
WHERE search_index MATCH ?
ORDER BY rank
LIMIT ?
@@ -91,25 +79,13 @@ func (d *DB) SearchFTSByFilename(
rows, err := d.db.QueryContext(d.Ctx, `
SELECT
af.file_path,
af.length_milliseconds,
COALESCE(r.name, ''),
COALESCE(ac.text, ''),
COALESCE(rg.name, '')
tm.file_path,
tm.length_milliseconds,
tm.title,
tm.artist_name,
tm.album
FROM search_index si
JOIN audio_files af ON af.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
JOIN track_metadata tm ON tm.id = si.rowid
WHERE search_index MATCH ?
ORDER BY rank
LIMIT ?
@@ -167,24 +143,8 @@ func (d *DB) RebuildSearchIndex() error {
_, err := d.db.ExecContext(d.Ctx, `
INSERT INTO search_index(rowid, file_path, title, artist, album)
SELECT
af.id,
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
SELECT id, file_path, title, artist_name, album
FROM track_metadata
`)
if err != nil {
return fmt.Errorf(
@@ -231,44 +191,24 @@ func (d *DB) SearchFTSTracks(
rows, err := d.db.QueryContext(d.Ctx, `
SELECT
af.file_path,
af.length_milliseconds,
COALESCE(r.name, '') AS title,
COALESCE(ac.text, '') AS artist_name,
r.track_number,
r.disc_number,
COALESCE(rg.name, '') AS album,
CAST(COALESCE(
(SELECT GROUP_CONCAT(g.name, '||')
FROM recording_genres rg_sub
JOIN genres g ON rg_sub.genre_id = g.id
WHERE rg_sub.recording_id = r.id),
''
) AS TEXT) AS genre,
COALESCE(r.year, 0) AS year,
COALESCE(r.composer, '') AS composer,
COALESCE(ft.extension, '') AS file_type,
af.sample_rate,
af.bit_depth,
af.channels,
af.bitrate,
af.file_size
tm.file_path,
tm.length_milliseconds,
tm.title,
tm.artist_name,
tm.track_number,
tm.disc_number,
tm.album,
tm.genre,
tm.year,
tm.composer,
tm.file_type,
tm.sample_rate,
tm.bit_depth,
tm.channels,
tm.bitrate,
tm.file_size
FROM search_index si
JOIN audio_files af ON af.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
JOIN track_metadata tm ON tm.id = si.rowid
WHERE search_index MATCH ?
ORDER BY rank
LIMIT ?