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:
+31
-91
@@ -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 ?
|
||||||
|
|||||||
Reference in New Issue
Block a user