package shakuhachi

  1. Overview
  2. Docs

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
(*****************************************************************************)
(*                                                                           *)
(*  Copyright (C) 2026 Yves Ndiaye                                           *)
(*                                                                           *)
(* This Source Code Form is subject to the terms of the Mozilla Public       *)
(* License, v. 2.0. If a copy of the MPL was not distributed with this       *)
(* file, You can obtain one at https://mozilla.org/MPL/2.0/.                 *)
(*                                                                           *)
(*****************************************************************************)

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
      (* INNER JOIN *)
      MusicParticipant.table_name MusicParticipant.p_music_id MusicFile.p_id
      (* INNER JOIN *)
      Artist.table_name Artist.p_id MusicParticipant.p_artist_id
      (* GROUP BY *)
      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
      (* INNER JOIN *)
      AlbumParticipant.table_name AlbumParticipant.p_artist_id Artist.p_id
      (* INNER JOIN *)
      Album.table_name Album.p_id AlbumParticipant.p_album_id
      (* WHERE *)
      AlbumParticipant.p_role
      Role.(to_int AlbumArtist)
end