Source file queryArtist.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
module ArtistMusicQuery = struct
module Column = struct
let fartist field = Printf.sprintf "a%s" field
let fmusic field = Printf.sprintf "m%s" field
let artist_id = fartist Artist.Column.id
let roles = fartist "roles"
let music_id = fmusic MusicFile.Column.id
let album_id = fmusic MusicFile.Column.album_id
let duration = fmusic MusicFile.Column.duration
let play_count = fmusic MusicFile.Column.play_count
let size = fmusic MusicFile.Column.size
let music_rating = fmusic MusicFile.Column.rating
let played_at = fmusic MusicFile.Column.played_at
let artists = List.map fartist Artist.Column.all
let all = artists @ List.map fmusic MusicFile.Column.all @ [ roles ]
let source =
List.map (Printf.sprintf "%s.%s" Artist.table_name) Artist.Column.all
@ List.map
(Printf.sprintf "%s.%s" MusicFile.table_name)
MusicFile.Column.all
end
let table_name = "skhc_artists_musics"
let fp = Printf.sprintf "%s.%s" table_name
let p_artists = List.map fp Column.artists
let p_album_id = fp Column.album_id
let p_artist_id = fp Column.artist_id
let p_roles = fp Column.roles
let p_music_id = fp Column.music_id
let p_duration = fp Column.duration
let p_play_count = fp Column.play_count
let p_size = fp Column.size
let p_music_rating = fp Column.music_rating
let p_played_at = fp Column.played_at
let sql_table group =
let columns =
List.map2
(Printf.sprintf "%s as %s")
(Column.source @ [ group ])
Column.all
in
let columns = String.concat ", " columns in
let group_by = [ Artist.p_id; MusicFile.p_id ] in
let group_by = String.concat ", " group_by in
Printf.sprintf
{|SELECT DISTINCT %s FROM %s
INNER JOIN %s ON %s = %s
INNER JOIN %s ON %s = %s
GROUP BY %s|}
columns MusicFile.table_name
MusicParticipant.table_name MusicParticipant.p_music_id MusicFile.p_id
Artist.table_name Artist.p_id MusicParticipant.p_artist_id
group_by
end
module ArtistAlbumsQuery = struct
module Column = struct
let id = "artist_id"
let album_id = "album_id"
let album_name = "album_name"
let all = [ id; album_id; album_name ]
let source =
let fp = Printf.sprintf "%s.%s" in
[
fp Artist.table_name Artist.Column.id;
fp Album.table_name Album.Column.id;
fp Album.table_name Album.Column.name;
]
end
let table_name = "skhc_artists_albums"
let fp = Printf.sprintf "%s.%s" table_name
let p_artist_id = fp Column.id
let p_album_name = fp Column.album_name
let p_album_id = fp Column.album_id
let sql_table =
let columns =
List.map2 (Printf.sprintf "%s as %s") Column.source Column.all
in
let columns = String.concat ", " columns in
Printf.sprintf
{|
SELECT DISTINCT %s FROM %s
INNER JOIN %s ON %s = %s
INNER JOIN %s ON %s = %s
WHERE %s = %u
|}
columns Artist.table_name
AlbumParticipant.table_name AlbumParticipant.p_artist_id Artist.p_id
Album.table_name Album.p_id AlbumParticipant.p_album_id
AlbumParticipant.p_role
Role.(to_int AlbumArtist)
end