From b677af43f09fbd3670d59a3234fbd03af74e8bf1 Mon Sep 17 00:00:00 2001 From: sentriz Date: Fri, 21 Feb 2020 00:00:43 +0000 Subject: [PATCH] return more child counts and format sql --- db/db.go | 4 +- db/migrations.go | 4 +- scanner/scanner.go | 20 +-- server/ctrladmin/handlers.go | 2 +- server/ctrladmin/playlist.go | 7 +- server/ctrlsubsonic/handlers_by_folder.go | 48 +++--- server/ctrlsubsonic/handlers_by_tags.go | 50 +++--- server/ctrlsubsonic/handlers_common.go | 16 +- server/ctrlsubsonic/testdata/db | Bin 122880 -> 143360 bytes .../testdata/test_get_album_list_alpha_artist | 79 +++++---- .../testdata/test_get_album_list_alpha_name | 79 +++++---- .../testdata/test_get_album_list_newest | 79 +++++---- .../testdata/test_get_album_list_random | 163 ++++++++++-------- .../test_get_album_list_two_alpha_artist | 78 +++++---- .../test_get_album_list_two_alpha_name | 78 +++++---- .../testdata/test_get_album_list_two_newest | 78 +++++---- .../testdata/test_get_album_list_two_random | 122 +++++++------ .../testdata/test_get_album_with_cover | 58 ++++--- .../testdata/test_get_album_without_cover | 4 +- .../testdata/test_get_artist_id_one | 11 +- .../testdata/test_get_artist_id_three | 19 +- .../testdata/test_get_artist_id_two | 17 +- .../testdata/test_get_artists_no_args | 14 +- .../testdata/test_get_indexes_no_args | 14 +- .../test_get_music_directory_with_tracks | 34 ++-- .../test_get_music_directory_without_tracks | 9 +- .../testdata/test_search_three_q_13 | 13 +- .../testdata/test_search_three_q_ani | 13 +- .../testdata/test_search_three_q_cert | 5 +- .../testdata/test_search_two_q_13 | 45 +++-- .../testdata/test_search_two_q_ani | 9 +- .../testdata/test_search_two_q_cert | 3 +- 32 files changed, 671 insertions(+), 504 deletions(-) diff --git a/db/db.go b/db/db.go index 14b6769..8cc0be4 100644 --- a/db/db.go +++ b/db/db.go @@ -54,7 +54,7 @@ func NewMock() (*DB, error) { func (db *DB) GetSetting(key string) string { setting := &Setting{} db. - Where("key = ?", key). + Where("key=?", key). First(setting) return setting.Value } @@ -69,7 +69,7 @@ func (db *DB) SetSetting(key, value string) { func (db *DB) GetUserFromName(name string) *User { user := &User{} err := db. - Where("name = ?", name). + Where("name=?", name). First(user). Error if gorm.IsRecordNotFoundError(err) { diff --git a/db/migrations.go b/db/migrations.go index 47b1311..3f8eb9f 100644 --- a/db/migrations.go +++ b/db/migrations.go @@ -33,7 +33,7 @@ var migrationCreateInitUser = gormigrate.Migration{ initPassword = "admin" ) err := tx. - Where("name = ?", initUsername). + Where("name=?", initUsername). First(&User{}). Error if !gorm.IsRecordNotFoundError(err) { @@ -56,7 +56,7 @@ var migrationMergePlaylist = gormigrate.Migration{ } return tx.Exec(` UPDATE playlists - SET items = ( SELECT group_concat(track_id) FROM ( + SET items=( SELECT group_concat(track_id) FROM ( SELECT track_id FROM playlist_items WHERE playlist_items.playlist_id=playlists.id diff --git a/scanner/scanner.go b/scanner/scanner.go index 54a0c96..3bacbbf 100644 --- a/scanner/scanner.go +++ b/scanner/scanner.go @@ -132,17 +132,17 @@ func (s *Scanner) Start() error { }) // delete albums without tracks s.db.Exec(` - DELETE FROM albums - WHERE tag_artist_id NOT NULL - AND NOT EXISTS (SELECT 1 FROM tracks - WHERE tracks.album_id = albums.id) - `) + DELETE FROM albums + WHERE tag_artist_id NOT NULL + AND NOT EXISTS ( SELECT 1 FROM tracks + WHERE tracks.album_id=albums.id + )`) // delete artists without albums s.db.Exec(` - DELETE FROM artists - WHERE NOT EXISTS (SELECT 1 from albums - WHERE albums.tag_artist_id = artists.id) - `) + DELETE FROM artists + WHERE NOT EXISTS ( SELECT 1 from albums + WHERE albums.tag_artist_id=artists.id + )`) // finish up strNow := strconv.FormatInt(time.Now().Unix(), 10) s.db.SetSetting("last_scan_time", strNow) @@ -352,7 +352,7 @@ func (s *Scanner) handleTrack(it *item) error { artist := &db.Artist{} err = s.trTx. Select("id"). - Where("name = ?", artistName). + Where("name=?", artistName). First(artist). Error if gorm.IsRecordNotFoundError(err) { diff --git a/server/ctrladmin/handlers.go b/server/ctrladmin/handlers.go index 0d29e84..3e0474d 100644 --- a/server/ctrladmin/handlers.go +++ b/server/ctrladmin/handlers.go @@ -56,7 +56,7 @@ func (c *Controller) ServeHome(r *http.Request) *Response { // ** begin playlists box user := r.Context().Value(CtxUser).(*db.User) c.DB. - Where("user_id = ?", user.ID). + Where("user_id=?", user.ID). Limit(20). Find(&data.Playlists) // diff --git a/server/ctrladmin/playlist.go b/server/ctrladmin/playlist.go index 4832c57..90c0ff4 100644 --- a/server/ctrladmin/playlist.go +++ b/server/ctrladmin/playlist.go @@ -8,6 +8,7 @@ import ( "github.com/jinzhu/gorm" "github.com/pkg/errors" + "senan.xyz/g/gonic/db" ) @@ -18,9 +19,9 @@ func playlistParseLine(c *Controller, path string) (int, error) { var track db.Track query := c.DB.Raw(` SELECT tracks.id FROM TRACKS - JOIN albums ON tracks.album_id = albums.id - WHERE (? || '/' || albums.left_path || albums.right_path || '/' || tracks.filename) = ? - `, c.MusicPath, path) + JOIN albums ON tracks.album_id=albums.id + WHERE (? || '/' || albums.left_path || albums.right_path || '/' || tracks.filename)=?`, + c.MusicPath, path) err := query.First(&track).Error switch { case gorm.IsRecordNotFoundError(err): diff --git a/server/ctrlsubsonic/handlers_by_folder.go b/server/ctrlsubsonic/handlers_by_folder.go index f298a9e..0f52bac 100644 --- a/server/ctrlsubsonic/handlers_by_folder.go +++ b/server/ctrlsubsonic/handlers_by_folder.go @@ -22,12 +22,9 @@ import ( func (c *Controller) ServeGetIndexes(r *http.Request) *spec.Response { var folders []*db.Album c.DB. - Select("*, count(sub.id) as child_count"). - Joins(` - LEFT JOIN albums sub - ON albums.id = sub.parent_id - `). - Where("albums.parent_id = 1"). + Select("*, count(sub.id) child_count"). + Joins("JOIN albums sub ON albums.id=sub.parent_id"). + Where("albums.parent_id=1"). Group("albums.id"). Find(&folders) // [a-z#] -> 27 @@ -71,7 +68,7 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response { // start looking for child childFolders in the current dir var childFolders []*db.Album c.DB. - Where("parent_id = ?", id). + Where("parent_id=?", id). Find(&childFolders) for _, c := range childFolders { childrenObj = append(childrenObj, spec.NewTCAlbumByFolder(c)) @@ -80,7 +77,7 @@ func (c *Controller) ServeGetMusicDirectory(r *http.Request) *spec.Response { // start looking for child childTracks in the current dir var childTracks []*db.Track c.DB. - Where("album_id = ?", id). + Where("album_id=?", id). Preload("Album"). Order("filename"). Find(&childTracks) @@ -112,8 +109,8 @@ func (c *Controller) ServeGetAlbumList(r *http.Request) *spec.Response { switch listType { case "alphabeticalByArtist": q = q.Joins(` - JOIN albums AS parent_albums - ON albums.parent_id = parent_albums.id`) + JOIN albums parent_albums + ON albums.parent_id=parent_albums.id`) q = q.Order("parent_albums.right_path") case "alphabeticalByName": q = q.Order("right_path") @@ -121,7 +118,7 @@ func (c *Controller) ServeGetAlbumList(r *http.Request) *spec.Response { user := r.Context().Value(CtxUser).(*db.User) q = q.Joins(` JOIN plays - ON albums.id = plays.album_id AND plays.user_id = ?`, + ON albums.id=plays.album_id AND plays.user_id=?`, user.ID) q = q.Order("plays.count DESC") case "newest": @@ -132,14 +129,19 @@ func (c *Controller) ServeGetAlbumList(r *http.Request) *spec.Response { user := r.Context().Value(CtxUser).(*db.User) q = q.Joins(` JOIN plays - ON albums.id = plays.album_id AND plays.user_id = ?`, + ON albums.id=plays.album_id AND plays.user_id=?`, user.ID) q = q.Order("plays.time DESC") default: return spec.NewError(10, "unknown value `%s` for parameter 'type'", listType) } var folders []*db.Album + // TODO: think about removing this extra join to count number + // of children. it might make sense to store that in the db q. + Select("albums.*, count(tracks.id) child_count"). + Joins("JOIN tracks ON tracks.album_id=albums.id"). + Group("albums.id"). Where("albums.tag_artist_id IS NOT NULL"). Offset(params.GetIntOr("offset", 0)). Limit(params.GetIntOr("size", 10)). @@ -168,10 +170,10 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response { var artists []*db.Album c.DB. Where(` - parent_id = 1 - AND (right_path LIKE ? OR - right_path_u_dec LIKE ?) - `, query, query). + parent_id=1 + AND ( right_path LIKE ? OR + right_path_u_dec LIKE ? )`, + query, query). Offset(params.GetIntOr("artistOffset", 0)). Limit(params.GetIntOr("artistCount", 20)). Find(&artists) @@ -184,10 +186,10 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response { var albums []*db.Album c.DB. Where(` - tag_artist_id IS NOT NULL - AND (right_path LIKE ? OR - right_path_u_dec LIKE ?) - `, query, query). + tag_artist_id IS NOT NULL + AND ( right_path LIKE ? OR + right_path_u_dec LIKE ? )`, + query, query). Offset(params.GetIntOr("albumOffset", 0)). Limit(params.GetIntOr("albumCount", 20)). Find(&albums) @@ -199,10 +201,8 @@ func (c *Controller) ServeSearchTwo(r *http.Request) *spec.Response { var tracks []*db.Track c.DB. Preload("Album"). - Where(` - filename LIKE ? OR - filename_u_dec LIKE ? - `, query, query). + Where("filename LIKE ? OR filename_u_dec LIKE ?", + query, query). Offset(params.GetIntOr("songOffset", 0)). Limit(params.GetIntOr("songCount", 20)). Find(&tracks) diff --git a/server/ctrlsubsonic/handlers_by_tags.go b/server/ctrlsubsonic/handlers_by_tags.go index 4c3d80b..548ccf9 100644 --- a/server/ctrlsubsonic/handlers_by_tags.go +++ b/server/ctrlsubsonic/handlers_by_tags.go @@ -17,11 +17,8 @@ import ( func (c *Controller) ServeGetArtists(r *http.Request) *spec.Response { var artists []*db.Artist c.DB. - Select("*, count(sub.id) as album_count"). - Joins(` - LEFT JOIN albums sub - ON artists.id = sub.tag_artist_id - `). + Select("*, count(sub.id) album_count"). + Joins("JOIN albums sub ON artists.id=sub.tag_artist_id"). Group("artists.id"). Find(&artists) // [a-z#] -> 27 @@ -108,9 +105,7 @@ func (c *Controller) ServeGetAlbumListTwo(r *http.Request) *spec.Response { q := c.DB.DB switch listType { case "alphabeticalByArtist": - q = q.Joins(` - JOIN artists - ON albums.tag_artist_id = artists.id`) + q = q.Joins("JOIN artists ON albums.tag_artist_id=artists.id") q = q.Order("artists.name") case "alphabeticalByName": q = q.Order("tag_title") @@ -122,9 +117,7 @@ func (c *Controller) ServeGetAlbumListTwo(r *http.Request) *spec.Response { q = q.Order("tag_year") case "frequent": user := r.Context().Value(CtxUser).(*db.User) - q = q.Joins(` - JOIN plays - ON albums.id = plays.album_id AND plays.user_id = ?`, + q = q.Joins("JOIN plays ON albums.id=plays.album_id AND plays.user_id=?", user.ID) q = q.Order("plays.count DESC") case "newest": @@ -133,16 +126,19 @@ func (c *Controller) ServeGetAlbumListTwo(r *http.Request) *spec.Response { q = q.Order(gorm.Expr("random()")) case "recent": user := r.Context().Value(CtxUser).(*db.User) - q = q.Joins(` - JOIN plays - ON albums.id = plays.album_id AND plays.user_id = ?`, + q = q.Joins("JOIN plays ON albums.id=plays.album_id AND plays.user_id=?", user.ID) q = q.Order("plays.time DESC") default: return spec.NewError(10, "unknown value `%s` for parameter 'type'", listType) } var albums []*db.Album + // TODO: think about removing this extra join to count number + // of children. it might make sense to store that in the db q. + Select("albums.*, count(tracks.id) child_count"). + Joins("JOIN tracks ON tracks.album_id=albums.id"). + Group("albums.id"). Where("albums.tag_artist_id IS NOT NULL"). Offset(params.GetIntOr("offset", 0)). Limit(params.GetIntOr("size", 10)). @@ -171,10 +167,8 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { // search "artists" var artists []*db.Artist c.DB. - Where(` - name LIKE ? OR - name_u_dec LIKE ? - `, query, query). + Where("name LIKE ? OR name_u_dec LIKE ?", + query, query). Offset(params.GetIntOr("artistOffset", 0)). Limit(params.GetIntOr("artistCount", 20)). Find(&artists) @@ -187,10 +181,8 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { var albums []*db.Album c.DB. Preload("TagArtist"). - Where(` - tag_title LIKE ? OR - tag_title_u_dec LIKE ? - `, query, query). + Where("tag_title LIKE ? OR tag_title_u_dec LIKE ?", + query, query). Offset(params.GetIntOr("albumOffset", 0)). Limit(params.GetIntOr("albumCount", 20)). Find(&albums) @@ -203,10 +195,8 @@ func (c *Controller) ServeSearchThree(r *http.Request) *spec.Response { var tracks []*db.Track c.DB. Preload("Album"). - Where(` - tag_title LIKE ? OR - tag_title_u_dec LIKE ? - `, query, query). + Where("tag_title LIKE ? OR tag_title_u_dec LIKE ?", + query, query). Offset(params.GetIntOr("songOffset", 0)). Limit(params.GetIntOr("songCount", 20)). Find(&tracks) @@ -231,7 +221,7 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { } artist := &db.Artist{} err = c.DB. - Where("id = ?", id). + Where("id=?", id). Find(artist). Error if gorm.IsRecordNotFoundError(err) { @@ -265,9 +255,9 @@ func (c *Controller) ServeGetArtistInfoTwo(r *http.Request) *spec.Response { } artist = &db.Artist{} err = c.DB. - Select("*, count(albums.id) as album_count"). - Where("name = ?", similarInfo.Name). - Joins(`LEFT JOIN albums ON artists.id = albums.tag_artist_id`). + Select("artists.*, count(albums.id) album_count"). + Where("name=?", similarInfo.Name). + Joins("JOIN albums ON artists.id=albums.tag_artist_id"). Group("artists.id"). Find(artist). Error diff --git a/server/ctrlsubsonic/handlers_common.go b/server/ctrlsubsonic/handlers_common.go index 2f33214..d929f58 100644 --- a/server/ctrlsubsonic/handlers_common.go +++ b/server/ctrlsubsonic/handlers_common.go @@ -125,7 +125,7 @@ func (c *Controller) ServeNotFound(r *http.Request) *spec.Response { func (c *Controller) ServeGetPlaylists(r *http.Request) *spec.Response { user := r.Context().Value(CtxUser).(*db.User) var playlists []*db.Playlist - c.DB.Where("user_id = ?", user.ID).Find(&playlists) + c.DB.Where("user_id=?", user.ID).Find(&playlists) sub := spec.NewResponse() sub.Playlists = &spec.Playlists{ List: make([]*spec.Playlist, len(playlists)), @@ -146,7 +146,7 @@ func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { } playlist := db.Playlist{} err = c.DB. - Where("id = ?", playlistID). + Where("id=?", playlistID). Find(&playlist). Error if gorm.IsRecordNotFoundError(err) { @@ -162,7 +162,7 @@ func (c *Controller) ServeGetPlaylist(r *http.Request) *spec.Response { for i, id := range trackIDs { track := db.Track{} c.DB. - Where("id = ?", id). + Where("id=?", id). Preload("Album"). Find(&track) sub.Playlist.List[i] = spec.NewTCTrackByFolder(&track, track.Album) @@ -181,7 +181,7 @@ func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response { // as intended var playlist db.Playlist c.DB. - Where("id = ?", playlistID). + Where("id=?", playlistID). FirstOrCreate(&playlist) // ** begin update meta info playlist.UserID = user.ID @@ -212,7 +212,7 @@ func (c *Controller) ServeUpdatePlaylist(r *http.Request) *spec.Response { func (c *Controller) ServeDeletePlaylist(r *http.Request) *spec.Response { params := r.Context().Value(CtxParams).(params.Params) c.DB. - Where("id = ?", params.GetIntOr("id", 0)). + Where("id=?", params.GetIntOr("id", 0)). Delete(&db.Playlist{}) return spec.NewResponse() } @@ -221,7 +221,7 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response { user := r.Context().Value(CtxUser).(*db.User) queue := db.PlayQueue{} err := c.DB. - Where("user_id = ?", user.ID). + Where("user_id=?", user.ID). Find(&queue). Error if gorm.IsRecordNotFoundError(err) { @@ -239,7 +239,7 @@ func (c *Controller) ServeGetPlayQueue(r *http.Request) *spec.Response { for i, id := range trackIDs { track := db.Track{} c.DB. - Where("id = ?", id). + Where("id=?", id). Preload("Album"). Find(&track) sub.PlayQueue.List[i] = spec.NewTCTrackByFolder(&track, track.Album) @@ -272,7 +272,7 @@ func (c *Controller) ServeGetSong(r *http.Request) *spec.Response { } track := &db.Track{} err = c.DB. - Where("id = ?", id). + Where("id=?", id). Preload("Album"). First(track). Error diff --git a/server/ctrlsubsonic/testdata/db b/server/ctrlsubsonic/testdata/db index c4d26aa1063b3871429c7eb13fb40ec2a64acf55..e01c4901077b9eca37cd1d11f8e638572a99fd21 100644 GIT binary patch delta 1131 zcmcIjUr1A76#u^6f7|Z7-=y4~TI}ww(Pmq03n5>mHHJk+Ynb9H=A4(g(mC(8N=O`2 zsHajc^cDocAcDX~*`o>dU?4(&9ui7=kmzOoB}$^cYvMM_$Ij(YX2nfak)LXKsV!>LTvTd~bE^Os01&Q<|R zC#Z*Hsb2q{QeSFi6~ED@gpAv(fGCZcsichNCPvL#SF~!uO+}Zcji=B(f%QP4WC(pi zoUKW{2GL8bfu&^V{aL=RgWu5gDM;!Gv;@!xw1Spqxn4Mr+BrgF_j!CCkI&oY!@_B* ze2=${gH^uQ4KA}d%cbEQYBLgcSY3pu3E(OkMA&tk8Muu4ZCGZRJp3Mg z&A2>~<(l;aK$T~n>>x-c z4Nohp#4G2cN(=P`$2LYK%%nvnjC%{h;P5}XQF!91GDUiox5QoL5ji$9 O-=$Fom`E`XjlTg@)ihlI delta 255 zcmZp8z|nAkeS)-XF#`jG91z2R5RkzF<%mtRP&X}R(9_7`Wwm1vVK~IVAIs0px0?Gs zcP&>2mmsG#=M4@?_CxF$42M__GCyLOz+B2K!Is4uIC-Oh-u3`lrZA?>+RSQ9!d#pT z!s3#Wj2)UKiAg!Bi8)E7n