refactor(server): replace RangeByChunks with Go 1.23 iterators (#3292)
* refactor(server): replace RangeByChunks with Go 1.23 iterators * chore: fix comments re: SQLITE_MAX_VARIABLE_NUMBER * test: improve playqueue test * refactor(server): don't create a new iterator when it is not required
This commit is contained in:
+17
-18
@@ -1,9 +1,10 @@
|
||||
package persistence
|
||||
|
||||
import (
|
||||
"slices"
|
||||
|
||||
. "github.com/Masterminds/squirrel"
|
||||
"github.com/navidrome/navidrome/model"
|
||||
"github.com/navidrome/navidrome/utils/slice"
|
||||
)
|
||||
|
||||
func (r sqlRepository) withGenres(sql SelectBuilder) SelectBuilder {
|
||||
@@ -22,19 +23,17 @@ func (r *sqlRepository) updateGenres(id string, genres model.Genres) error {
|
||||
if len(genres) == 0 {
|
||||
return nil
|
||||
}
|
||||
var genreIds []string
|
||||
for _, g := range genres {
|
||||
genreIds = append(genreIds, g.ID)
|
||||
}
|
||||
err = slice.RangeByChunks(genreIds, 100, func(ids []string) error {
|
||||
|
||||
for chunk := range slices.Chunk(genres, 100) {
|
||||
ins := Insert(tableName+"_genres").Columns("genre_id", tableName+"_id")
|
||||
for _, gid := range ids {
|
||||
ins = ins.Values(gid, id)
|
||||
for _, genre := range chunk {
|
||||
ins = ins.Values(genre.ID, id)
|
||||
}
|
||||
_, err = r.executeSQL(ins)
|
||||
return err
|
||||
})
|
||||
return err
|
||||
if _, err = r.executeSQL(ins); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type baseRepository interface {
|
||||
@@ -71,24 +70,24 @@ func appendGenre[T modelWithGenres](item *T, genre model.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 {
|
||||
|
||||
for chunk := range slices.Chunk(ids, 900) {
|
||||
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})
|
||||
OrderBy(tableName+"_id", "ig.rowid").Where(Eq{tableName + "_id": chunk})
|
||||
|
||||
var genres []struct {
|
||||
model.Genre
|
||||
ItemID string
|
||||
}
|
||||
err := r.queryAll(sql, &genres)
|
||||
if err != nil {
|
||||
if err := r.queryAll(sql, &genres); err != nil {
|
||||
return err
|
||||
}
|
||||
for _, g := range genres {
|
||||
appendGenre(items[g.ItemID], g.Genre)
|
||||
}
|
||||
return nil
|
||||
})
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func loadAllGenres[T modelWithGenres](r baseRepository, items []T) error {
|
||||
|
||||
Reference in New Issue
Block a user