Refactor loadGenres, remove duplication
This commit is contained in:
+50
-68
@@ -11,7 +11,8 @@ func (r sqlRepository) withGenres(sql SelectBuilder) SelectBuilder {
|
||||
LeftJoin("genre on ag.genre_id = genre.id")
|
||||
}
|
||||
|
||||
func (r *sqlRepository) updateGenres(id string, tableName string, genres model.Genres) error {
|
||||
func (r *sqlRepository) updateGenres(id string, genres model.Genres) error {
|
||||
tableName := r.getTableName()
|
||||
del := Delete(tableName + "_genres").Where(Eq{tableName + "_id": id})
|
||||
_, err := r.executeSQL(del)
|
||||
if err != nil {
|
||||
@@ -36,89 +37,70 @@ func (r *sqlRepository) updateGenres(id string, tableName string, genres model.G
|
||||
return err
|
||||
}
|
||||
|
||||
func (r *sqlRepository) loadMediaFileGenres(mfs *model.MediaFiles) error {
|
||||
var ids []string
|
||||
m := map[string]*model.MediaFile{}
|
||||
for i := range *mfs {
|
||||
mf := &(*mfs)[i]
|
||||
ids = append(ids, mf.ID)
|
||||
m[mf.ID] = mf
|
||||
}
|
||||
type baseRepository interface {
|
||||
queryAll(SelectBuilder, any, ...model.QueryOptions) error
|
||||
getTableName() string
|
||||
}
|
||||
|
||||
type modelWithGenres interface {
|
||||
model.Album | model.Artist | model.MediaFile
|
||||
}
|
||||
|
||||
func getID[T modelWithGenres](item T) string {
|
||||
switch v := any(item).(type) {
|
||||
case model.Album:
|
||||
return v.ID
|
||||
case model.Artist:
|
||||
return v.ID
|
||||
case model.MediaFile:
|
||||
return v.ID
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func appendGenre[T modelWithGenres](item *T, genre model.Genre) {
|
||||
switch v := any(item).(type) {
|
||||
case *model.Album:
|
||||
v.Genres = append(v.Genres, genre)
|
||||
case *model.Artist:
|
||||
v.Genres = append(v.Genres, genre)
|
||||
case *model.MediaFile:
|
||||
v.Genres = append(v.Genres, genre)
|
||||
}
|
||||
}
|
||||
|
||||
func loadGenres[T modelWithGenres](r baseRepository, ids []string, items map[string]*T) error {
|
||||
tableName := r.getTableName()
|
||||
return slice.RangeByChunks(ids, 900, func(ids []string) error {
|
||||
sql := Select("g.*", "mg.media_file_id").From("genre g").Join("media_file_genres mg on mg.genre_id = g.id").
|
||||
Where(Eq{"mg.media_file_id": ids}).OrderBy("mg.media_file_id", "mg.rowid")
|
||||
sql := Select("genre.*", tableName+"_id as item_id").From("genre").
|
||||
Join(tableName+"_genres ig on genre.id = ig.genre_id").
|
||||
OrderBy(tableName+"_id", "ig.rowid").Where(Eq{tableName + "_id": ids})
|
||||
|
||||
var genres []struct {
|
||||
model.Genre
|
||||
MediaFileId string
|
||||
ItemID string
|
||||
}
|
||||
|
||||
err := r.queryAll(sql, &genres)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, g := range genres {
|
||||
mf := m[g.MediaFileId]
|
||||
mf.Genres = append(mf.Genres, g.Genre)
|
||||
appendGenre(items[g.ItemID], g.Genre)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (r *sqlRepository) loadAlbumGenres(mfs *model.Albums) error {
|
||||
func loadAllGenres[T modelWithGenres](r baseRepository, items []T) error {
|
||||
// Map references to items by ID and collect all IDs
|
||||
m := map[string]*T{}
|
||||
var ids []string
|
||||
m := map[string]*model.Album{}
|
||||
for i := range *mfs {
|
||||
mf := &(*mfs)[i]
|
||||
ids = append(ids, mf.ID)
|
||||
m[mf.ID] = mf
|
||||
for i := range items {
|
||||
item := &(items)[i]
|
||||
id := getID(*item)
|
||||
ids = append(ids, id)
|
||||
m[id] = item
|
||||
}
|
||||
|
||||
return slice.RangeByChunks(ids, 900, func(ids []string) error {
|
||||
sql := Select("g.*", "ag.album_id").From("genre g").Join("album_genres ag on ag.genre_id = g.id").
|
||||
Where(Eq{"ag.album_id": ids}).OrderBy("ag.album_id", "ag.rowid")
|
||||
var genres []struct {
|
||||
model.Genre
|
||||
AlbumId string
|
||||
}
|
||||
|
||||
err := r.queryAll(sql, &genres)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, g := range genres {
|
||||
mf := m[g.AlbumId]
|
||||
mf.Genres = append(mf.Genres, g.Genre)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
|
||||
func (r *sqlRepository) loadArtistGenres(mfs *model.Artists) error {
|
||||
var ids []string
|
||||
m := map[string]*model.Artist{}
|
||||
for i := range *mfs {
|
||||
mf := &(*mfs)[i]
|
||||
ids = append(ids, mf.ID)
|
||||
m[mf.ID] = mf
|
||||
}
|
||||
|
||||
return slice.RangeByChunks(ids, 900, func(ids []string) error {
|
||||
sql := Select("g.*", "ag.artist_id").From("genre g").Join("artist_genres ag on ag.genre_id = g.id").
|
||||
Where(Eq{"ag.artist_id": ids}).OrderBy("ag.artist_id", "ag.rowid")
|
||||
var genres []struct {
|
||||
model.Genre
|
||||
ArtistId string
|
||||
}
|
||||
|
||||
err := r.queryAll(sql, &genres)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
for _, g := range genres {
|
||||
mf := m[g.ArtistId]
|
||||
mf.Genres = append(mf.Genres, g.Genre)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
return loadGenres(r, ids, m)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user