Source file queryAlbum.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
module AlbumMusicQuery = struct
module Column = struct
let falbum field = Printf.sprintf "a%s" field
let fmusic field = Printf.sprintf "m%s" field
let albums = List.map falbum Album.Column.all
let all = albums @ List.map fmusic MusicFile.Column.all
let source =
List.map (Printf.sprintf "%s.%s" Album.table_name) Album.Column.all
@ List.map
(Printf.sprintf "%s.%s" MusicFile.table_name)
MusicFile.Column.all
let music_id = fmusic MusicFile.Column.id
let size = fmusic MusicFile.Column.size
let play_count = fmusic MusicFile.Column.play_count
let rating = fmusic MusicFile.Column.rating
let duration = fmusic MusicFile.Column.duration
let played_at = fmusic MusicFile.Column.played_at
end
let table_name = "skhc_album_musics"
let fp = Printf.sprintf "%s.%s" table_name
let p_albums = List.map fp Column.albums
let p_all = List.map fp Column.all
let p_album_id = fp (List.hd Column.albums)
let p_music_id = fp Column.music_id
let p_size = fp Column.size
let p_play_count = fp Column.play_count
let p_rating = fp Column.rating
let p_duration = fp Column.duration
let p_played_at = fp Column.played_at
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|}
columns Album.table_name
MusicFile.table_name MusicFile.p_album_id Album.p_id
end
module AlbumParticipantQuery = struct
module Column = struct
let id = Album.Column.id
let roles = "roles"
let all = [ id; roles ]
let source = Album.p_id
end
let table_name = "skhc_album_participants"
let p_album_id = Printf.sprintf "%s.%s" table_name Column.id
let p_roles = Printf.sprintf "%s.%s" table_name Column.roles
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
Printf.sprintf
{|SELECT %s FROM %s
INNER JOIN %s ON %s = %s
INNER JOIN %s ON %s = %s
GROUP BY %s|}
columns Album.table_name
AlbumParticipant.table_name AlbumParticipant.p_album_id Album.p_id
Artist.table_name Artist.p_id AlbumParticipant.p_artist_id
Album.p_id
end