From f0270dc48c6677a4088ea9c2162632765d697f9c Mon Sep 17 00:00:00 2001 From: deluan Date: Tue, 28 Oct 2025 18:40:34 -0400 Subject: [PATCH] WIP # Conflicts: # persistence/artist_repository.go --- persistence/artist_repository.go | 6 +++--- persistence/library_repository.go | 6 +++--- persistence/tag_repository.go | 13 +++++++------ scanner/scanner.go | 9 +++++---- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/persistence/artist_repository.go b/persistence/artist_repository.go index 760dcca62..07a4babe3 100644 --- a/persistence/artist_repository.go +++ b/persistence/artist_repository.go @@ -448,9 +448,9 @@ func (r *artistRepository) RefreshStats(allArtists bool) (int64, error) { library_artist_counters AS ( SELECT artist_id, library_id, - json_group_object( + jsonb_object_agg( role, - json_object('a', album_count, 'm', count, 's', size) + jsonb_build_object('a', album_count, 'm', count, 's', size) ) AS counters FROM combined_counters GROUP BY artist_id, library_id @@ -458,7 +458,7 @@ func (r *artistRepository) RefreshStats(allArtists bool) (int64, error) { UPDATE library_artist SET stats = coalesce((SELECT counters FROM library_artist_counters lac WHERE lac.artist_id = library_artist.artist_id - AND lac.library_id = library_artist.library_id), '{}') + AND lac.library_id = library_artist.library_id), '{}'::jsonb) WHERE library_artist.artist_id IN (ROLE_IDS_PLACEHOLDER);` // Will replace with actual placeholders var totalRowsAffected int64 = 0 diff --git a/persistence/library_repository.go b/persistence/library_repository.go index e0d841943..975b8b445 100644 --- a/persistence/library_repository.go +++ b/persistence/library_repository.go @@ -207,17 +207,17 @@ func (r *libraryRepository) RefreshStats(id int) error { }), &foldersRes) }, func() error { - return r.queryOne(Select("ifnull(sum(num_audio_files + num_playlists + json_array_length(image_files)),0) as count"). + return r.queryOne(Select("coalesce(sum(num_audio_files + num_playlists + jsonb_array_length(image_files)),0) as count"). From("folder").Where(Eq{"library_id": id, "missing": false}), &filesRes) }, func() error { return r.queryOne(Select("count(*) as count").From("media_file").Where(Eq{"library_id": id, "missing": true}), &missingRes) }, func() error { - return r.queryOne(Select("ifnull(sum(size),0) as sum").From("album").Where(Eq{"library_id": id, "missing": false}), &sizeRes) + return r.queryOne(Select("coalesce(sum(size),0) as sum").From("album").Where(Eq{"library_id": id, "missing": false}), &sizeRes) }, func() error { - return r.queryOne(Select("ifnull(sum(duration),0) as sum").From("album").Where(Eq{"library_id": id, "missing": false}), &durationRes) + return r.queryOne(Select("coalesce(sum(duration),0) as sum").From("album").Where(Eq{"library_id": id, "missing": false}), &durationRes) }, )() if err != nil { diff --git a/persistence/tag_repository.go b/persistence/tag_repository.go index f8368b033..643f03624 100644 --- a/persistence/tag_repository.go +++ b/persistence/tag_repository.go @@ -53,12 +53,13 @@ func (r *tagRepository) Add(libraryID int, tags ...model.Tag) error { func (r *tagRepository) UpdateCounts() error { template := ` INSERT INTO library_tag (tag_id, library_id, %[1]s_count) -SELECT jt.value as tag_id, %[1]s.library_id, count(distinct %[1]s.id) as %[1]s_count -FROM %[1]s -JOIN json_tree(%[1]s.tags, '$.genre') as jt ON jt.atom IS NOT NULL AND jt.key = 'id' -JOIN tag ON tag.id = jt.value -GROUP BY jt.value, %[1]s.library_id -ON CONFLICT (tag_id, library_id) +SELECT elem->>'id' as tag_id, %[1]s.library_id, count(distinct %[1]s.id) as %[1]s_count +FROM %[1]s, + LATERAL jsonb_array_elements(%[1]s.tags->'genre') AS elem +WHERE elem->>'id' IS NOT NULL + AND EXISTS (SELECT 1 FROM tag WHERE tag.id = elem->>'id') +GROUP BY elem->>'id', %[1]s.library_id +ON CONFLICT (tag_id, library_id) DO UPDATE SET %[1]s_count = excluded.%[1]s_count; ` diff --git a/scanner/scanner.go b/scanner/scanner.go index 9b94159b1..108224356 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -207,10 +207,11 @@ func (s *scannerImpl) runUpdateLibraries(ctx context.Context, state *scanState) } if state.changesDetected.Load() { log.Debug(ctx, "Scanner: Refreshing library stats", "lib", lib.Name) - if err := tx.Library(ctx).RefreshStats(lib.ID); err != nil { - log.Error(ctx, "Scanner: Error refreshing library stats", "lib", lib.Name, err) - return fmt.Errorf("refreshing library stats: %w", err) - } + // FIXME + // if err := tx.Library(ctx).RefreshStats(lib.ID); err != nil { + // log.Error(ctx, "Scanner: Error refreshing library stats", "lib", lib.Name, err) + // return fmt.Errorf("refreshing library stats: %w", err) + // } } else { log.Debug(ctx, "Scanner: No changes detected, skipping library stats refresh", "lib", lib.Name) }