|
|
@@ -3,202 +3,118 @@ package repository
|
|
|
import (
|
|
|
"database/sql"
|
|
|
|
|
|
+ "github.com/felamaslen/gmus-backend/pkg/read"
|
|
|
"github.com/jmoiron/sqlx"
|
|
|
)
|
|
|
|
|
|
-func getSongIdOrZero(db *sqlx.DB, query string, songId int64) (assocSongId int64, err error) {
|
|
|
- err = db.QueryRowx(query, songId).Scan(&assocSongId)
|
|
|
- if err != nil && err == sql.ErrNoRows {
|
|
|
- err = nil
|
|
|
- assocSongId = 0
|
|
|
- }
|
|
|
- return
|
|
|
-}
|
|
|
-
|
|
|
-func GetNextSongId(db *sqlx.DB, prevSongId int64) (nextSongId int64, err error) {
|
|
|
- nextSongId, err = getSongIdOrZero(
|
|
|
- db,
|
|
|
+func GetNextSong(db *sqlx.DB, prevSongId int) (nextSong *read.Song, err error) {
|
|
|
+ nextSong = &read.Song{}
|
|
|
+ err = db.QueryRowx(
|
|
|
`
|
|
|
- select coalesce(id_next, 0) as id from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_artist.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_album.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_title.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_track_number.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,next_no_info.id as id_next
|
|
|
-
|
|
|
- from (
|
|
|
- select track_number, title, artist, album from songs
|
|
|
- where id = $1
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_no_info on 1=1
|
|
|
- and prev.artist = ''
|
|
|
- and prev.album = ''
|
|
|
- and next_no_info.id > $1
|
|
|
-
|
|
|
- order by
|
|
|
- next_no_info.artist
|
|
|
- ,next_no_info.album
|
|
|
- ,next_no_info.track_number
|
|
|
- ,next_no_info.title
|
|
|
- ,next_no_info.id
|
|
|
-
|
|
|
- limit 1
|
|
|
-
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_track_number on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_track_number.artist = prev.artist
|
|
|
- and next_track_number.album = prev.album
|
|
|
- and (
|
|
|
- (prev.track_number > 0 and next_track_number.track_number > prev.track_number)
|
|
|
- or (prev.track_number = 0 and next_track_number.id > $1)
|
|
|
- )
|
|
|
-
|
|
|
- order by next_track_number.track_number, next_track_number.id
|
|
|
- limit 1
|
|
|
-
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_title on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_title.artist = prev.artist
|
|
|
- and next_title.album = prev.album
|
|
|
- and next_title.track_number is null
|
|
|
- and next_title.title > prev.title
|
|
|
-
|
|
|
- order by next_title.title
|
|
|
- limit 1
|
|
|
-
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_album on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_album.artist = prev.artist
|
|
|
- and next_album.album > prev.album
|
|
|
-
|
|
|
- order by next_album.album, next_album.track_number, next_album.title
|
|
|
- limit 1
|
|
|
- ) prev
|
|
|
+select
|
|
|
+ s1.id
|
|
|
+ ,s1.track_number
|
|
|
+ ,s1.title
|
|
|
+ ,s1.artist
|
|
|
+ ,s1.album
|
|
|
+ ,s1.duration
|
|
|
+
|
|
|
+from (
|
|
|
+ select * from songs where id = $1
|
|
|
+) s0
|
|
|
+
|
|
|
+left join songs s1 on (
|
|
|
+ s1.artist > s0.artist
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album > s0.album
|
|
|
+ )
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album = s0.album
|
|
|
+ and s1.track_number > s0.track_number
|
|
|
+ )
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album = s0.album
|
|
|
+ and s1.track_number = s0.track_number
|
|
|
+ and s1.title > s0.title
|
|
|
+ )
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album = s0.album
|
|
|
+ and s1.track_number = s0.track_number
|
|
|
+ and s1.title = s0.title
|
|
|
+ and s1.id > s0.id
|
|
|
+ )
|
|
|
+)
|
|
|
|
|
|
- left join songs next_artist on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_artist.artist > prev.artist
|
|
|
+order by
|
|
|
+ s1.artist
|
|
|
+ ,s1.album
|
|
|
+ ,s1.track_number
|
|
|
+ ,s1.title
|
|
|
+ ,s1.id
|
|
|
|
|
|
- order by next_artist.artist, next_artist.album, next_artist.track_number, next_artist.title
|
|
|
- limit 1
|
|
|
- ) result
|
|
|
+limit 1
|
|
|
`,
|
|
|
prevSongId,
|
|
|
- )
|
|
|
+ ).StructScan(nextSong)
|
|
|
+ if err != nil && err == sql.ErrNoRows {
|
|
|
+ err = nil
|
|
|
+ nextSong = &read.Song{Id: 0}
|
|
|
+ }
|
|
|
return
|
|
|
}
|
|
|
|
|
|
-func GetPrevSongId(db *sqlx.DB, nextSongId int64) (prevSongId int64, err error) {
|
|
|
- prevSongId, err = getSongIdOrZero(
|
|
|
- db,
|
|
|
+func GetPrevSong(db *sqlx.DB, nextSongId int) (prevSong *read.Song, err error) {
|
|
|
+ prevSong = &read.Song{}
|
|
|
+ err = db.QueryRowx(
|
|
|
`
|
|
|
- select coalesce(id_next, 0) as id from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_no_info.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_artist.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_album.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,coalesce(prev.id_next, next_title.id) as id_next
|
|
|
- from (
|
|
|
- select
|
|
|
- prev.track_number, prev.title, prev.artist, prev.album
|
|
|
- ,next_track_number.id as id_next
|
|
|
- from (
|
|
|
- select track_number, title, artist, album from songs
|
|
|
- where id = $1
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_track_number on 1=1
|
|
|
- and next_track_number.artist = prev.artist
|
|
|
- and next_track_number.album = prev.album
|
|
|
- and next_track_number.track_number < prev.track_number
|
|
|
-
|
|
|
- order by next_track_number.track_number desc
|
|
|
- limit 1
|
|
|
-
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_title on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_title.artist = prev.artist
|
|
|
- and next_title.album = prev.album
|
|
|
- and next_title.track_number is null
|
|
|
- and next_title.title < prev.title
|
|
|
-
|
|
|
- order by next_title.title desc
|
|
|
- limit 1
|
|
|
-
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_album on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_album.artist = prev.artist
|
|
|
- and next_album.album < prev.album
|
|
|
-
|
|
|
- order by
|
|
|
- next_album.album desc
|
|
|
- ,next_album.track_number desc
|
|
|
- ,next_album.title desc
|
|
|
- limit 1
|
|
|
- ) prev
|
|
|
-
|
|
|
- left join songs next_artist on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_artist.artist < prev.artist
|
|
|
-
|
|
|
- order by
|
|
|
- next_artist.artist desc
|
|
|
- ,next_artist.album desc
|
|
|
- ,next_artist.track_number desc
|
|
|
- ,next_artist.title desc
|
|
|
- limit 1
|
|
|
- ) prev
|
|
|
-
|
|
|
- inner join songs from_song on from_song.id = $1
|
|
|
-
|
|
|
- left join songs next_no_info on 1=1
|
|
|
- and prev.id_next is null
|
|
|
- and next_no_info.artist = ''
|
|
|
- and next_no_info.album = ''
|
|
|
- and next_no_info.id != $1
|
|
|
- and (from_song.artist != '' or from_song.album != '' or next_no_info.id < $1)
|
|
|
+select
|
|
|
+ s1.id
|
|
|
+ ,s1.track_number
|
|
|
+ ,s1.title
|
|
|
+ ,s1.artist
|
|
|
+ ,s1.album
|
|
|
+ ,s1.duration
|
|
|
+
|
|
|
+from (
|
|
|
+ select * from songs where id = $1
|
|
|
+) s0
|
|
|
+
|
|
|
+left join songs s1 on (
|
|
|
+ s1.artist < s0.artist
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album < s0.album
|
|
|
+ )
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album = s0.album
|
|
|
+ and s1.track_number < s0.track_number
|
|
|
+ )
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album = s0.album
|
|
|
+ and s1.track_number = s0.track_number
|
|
|
+ and s1.title < s0.title
|
|
|
+ )
|
|
|
+ or (s1.artist = s0.artist
|
|
|
+ and s1.album = s0.album
|
|
|
+ and s1.track_number = s0.track_number
|
|
|
+ and s1.title = s0.title
|
|
|
+ and s1.id < s0.id
|
|
|
+ )
|
|
|
+)
|
|
|
|
|
|
- order by next_no_info.id desc
|
|
|
- limit 1
|
|
|
+order by
|
|
|
+ s1.artist desc
|
|
|
+ ,s1.album desc
|
|
|
+ ,s1.track_number desc
|
|
|
+ ,s1.title desc
|
|
|
+ ,s1.id desc
|
|
|
|
|
|
- ) result
|
|
|
+limit 1
|
|
|
`,
|
|
|
nextSongId,
|
|
|
- )
|
|
|
+ ).StructScan(prevSong)
|
|
|
+ if err != nil && err == sql.ErrNoRows {
|
|
|
+ err = nil
|
|
|
+ prevSong = &read.Song{Id: 0}
|
|
|
+ }
|
|
|
return
|
|
|
}
|