package shakuhachi

  1. Overview
  2. Docs

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
(*****************************************************************************)
(*                                                                           *)
(*  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 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
    (* No need of trainling; since the query will used as a subquery*)
    Printf.sprintf {|SELECT DISTINCT %s FROM %s INNER JOIN %s ON %s = %s|}
      columns Album.table_name
      (* INNER JOIN *)
      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
      (* INNER JOIN *)
      AlbumParticipant.table_name AlbumParticipant.p_album_id Album.p_id
      (* INNER JOIN *)
      Artist.table_name Artist.p_id AlbumParticipant.p_artist_id
      (* GROUP BY *)
      Album.p_id
end