Skip to content

Commit

Permalink
use edgedb python codegen
Browse files Browse the repository at this point in the history
  • Loading branch information
AdrienPensart committed Nov 11, 2023
1 parent 49b6bd7 commit ddad3f4
Show file tree
Hide file tree
Showing 41 changed files with 1,536 additions and 657 deletions.
39 changes: 8 additions & 31 deletions README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,6 @@ musicbot local
playlist Generate a new playlist
remove (delete) Remove one or more music
scan Load musics
search (find) Search musics by full-text search
sync Copy selected musics with filters to destination folder
watch (watcher) Watch files changes in folders
Expand Down Expand Up @@ -450,8 +449,8 @@ musicbot local bests
Filter options:
--prefilter [bests-4.0|bests-4.5|bests-5.0|no-album|no-artist|no-genre|no-keyword|no-rating|no-title|to-fix]
Music pre filters (repeatable)
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,min_size,max_size
,min_length,max_length,min_rating,max_rating,limit
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,pattern,min_size,
max_size,min_length,max_length,min_rating,max_rating,limit
MusicDB options:
--dsn TEXT DSN to MusicBot EdgeDB
--graphql TEXT DSN to MusicBot GrapQL
Expand Down Expand Up @@ -520,8 +519,8 @@ musicbot local player
Filter options:
--prefilter [bests-4.0|bests-4.5|bests-5.0|no-album|no-artist|no-genre|no-keyword|no-rating|no-title|to-fix]
Music pre filters (repeatable)
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,min_size,max_size
,min_length,max_length,min_rating,max_rating,limit
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,pattern,min_size,
max_size,min_length,max_length,min_rating,max_rating,limit
Links options:
--kind, --kinds [all|local|local-http|local-ssh|remote|remote-http|remote-ssh]
Generate musics paths of types [default: local]
Expand Down Expand Up @@ -557,8 +556,8 @@ musicbot local playlist
Filter options:
--prefilter [bests-4.0|bests-4.5|bests-5.0|no-album|no-artist|no-genre|no-keyword|no-rating|no-title|to-fix]
Music pre filters (repeatable)
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,min_size,max_size
,min_length,max_length,min_rating,max_rating,limit
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,pattern,min_size,
max_size,min_length,max_length,min_rating,max_rating,limit
Links options:
--kind, --kinds [all|local|local-http|local-ssh|remote|remote-http|remote-ssh]
Generate musics paths of types [default: local]
Expand Down Expand Up @@ -604,28 +603,6 @@ musicbot local scan
--coroutines INTEGER Limit number of coroutines [default: 64]
-h, --help Show this message and exit.
musicbot local search
*********************
.. code-block::
Usage: musicbot local search [OPTIONS] PATTERN
Search musics by full-text search
Options:
MusicDB options:
--dsn TEXT DSN to MusicBot EdgeDB
--graphql TEXT DSN to MusicBot GrapQL
--output [json|table|m3u] Output format [default: table]
Links options:
--kind, --kinds [all|local|local-http|local-ssh|remote|remote-http|remote-ssh]
Generate musics paths of types [default: local]
--relative / --no-relative Generate relative links [default: no-relative]
Ordering options: [mutually_exclusive]
--shuffle / --no-shuffle Randomize selection [default: no-shuffle]
--interleave / --no-interleave Interleave tracks by artist [default: no-interleave]
-h, --help Show this message and exit.
musicbot local sync
*******************
.. code-block::
Expand All @@ -652,8 +629,8 @@ musicbot local sync
Filter options:
--prefilter [bests-4.0|bests-4.5|bests-5.0|no-album|no-artist|no-genre|no-keyword|no-rating|no-title|to-fix]
Music pre filters (repeatable)
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,min_size,max_size
,min_length,max_length,min_rating,max_rating,limit
--filter TEXT Music filters (repeatable), fields: genre,keyword,artist,title,album,pattern,min_size,
max_size,min_length,max_length,min_rating,max_rating,limit
--flat Do not create subfolders
--delete Delete files on destination if not present in library
-h, --help Show this message and exit.
Expand Down
46 changes: 45 additions & 1 deletion dbschema/default.esdl
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,14 @@ module default {
# required identity: ext::auth::Identity;
# }

function bytes_to_human(size: int64, k: int64 = 1000, decimals: int64 = 2, units: array<str> = [' B', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB']) -> str {
# alias MATCH_ALL := "(.*?)";

function bytes_to_human(
size: int64,
k: int64 = 1000,
decimals: int64 = 2,
units: array<str> = [' B', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB'],
) -> str {
using (
select '0' ++ units[0] if size = 0
else (
Expand Down Expand Up @@ -307,6 +314,43 @@ module default {
)
);
}

function gen_playlist(
named only min_length: Length = 0,
named only max_length: Length = 2147483647,
named only min_size: Size = 0,
named only max_size: Size = 2147483647,
named only min_rating: Rating = 0.0,
named only max_rating: Rating = 5.0,
named only artist: str = "(.*?)",
named only album: str = "(.*?)",
named only genre: str = "(.*?)",
named only title: str = "(.*?)",
named only keyword: str = "(.*?)",
named only `limit`: `Limit` = 2147483647,
named only pattern: str = "",
) -> set of Music {
using (
select Music
filter
.length >= min_length and .length <= max_length
and .size >= min_size and .size <= max_size
and .rating >= min_rating and .rating <= max_rating
and re_test(artist, .artist.name)
and re_test(album, .album.name)
and re_test(genre, .genre.name)
and re_test(title, .name)
and re_test(keyword, array_join(array_agg((select .keywords.name)), " "))
and (pattern = "" or ext::pg_trgm::word_similar(pattern, .title))
order by
.artist.name then
.album.name then
.track then
.name
limit `limit`
);
annotation title := "Generate a playlist from parameters";
};
}

using extension graphql;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
CREATE MIGRATION m1ev2cbx4eudivaafci4i6ywgmpzzxntdgyxq22dbpkffcufhmqosa
ONTO m1tklogxiitcxuoe6oapcrpljmwhpboqjgzujhj5ffrwkx5px6bxva
{
};
65 changes: 34 additions & 31 deletions dbschema/migrations/00001.edgeql
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
CREATE MIGRATION m1oy3zaoi4vykcutcfrianlcvpose52w7fdmesc6vcv3l73mlb5p4a
ONTO initial
{
CREATE EXTENSION pgcrypto VERSION '1.3';
CREATE EXTENSION auth VERSION '1.0';
CREATE EXTENSION edgeql_http VERSION '1.0';
CREATE EXTENSION graphql VERSION '1.0';
CREATE EXTENSION pg_trgm VERSION '1.6';
CREATE FUNCTION default::bytes_to_human(size: std::int64, k: std::int64 = 1000, decimals: std::int64 = 2, units: array<std::str> = [' B', ' KB', ' MB', ' GB', ' TB', ' PB', ' EB', ' ZB', ' YB']) -> std::str {
CREATE ANNOTATION std::title := 'Convert a byte size to human readable string';
USING (SELECT
Expand All @@ -16,12 +15,7 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
))
)
;};
CREATE TYPE default::User {
CREATE REQUIRED LINK identity: ext::auth::Identity;
CREATE REQUIRED PROPERTY name: std::str;
};
CREATE TYPE default::Album {
CREATE REQUIRED LINK user: default::User;
CREATE REQUIRED PROPERTY name: std::str;
CREATE INDEX fts::index ON (fts::with_options(.name, language := fts::Language.eng));
CREATE REQUIRED PROPERTY created_at: std::datetime {
Expand Down Expand Up @@ -59,9 +53,9 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
CREATE PROPERTY human_size := (SELECT
default::bytes_to_human(.size)
);
CREATE REQUIRED LINK user: default::User;
CREATE REQUIRED PROPERTY name: std::str;
CREATE CONSTRAINT std::exclusive ON ((.name, .user, .album));
CREATE PROPERTY track: default::Track;
CREATE CONSTRAINT std::exclusive ON ((.name, .album));
CREATE INDEX fts::index ON (fts::with_options(.name, language := fts::Language.eng));
CREATE REQUIRED PROPERTY created_at: std::datetime {
SET default := (std::datetime_current());
Expand All @@ -73,7 +67,6 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
CREATE PROPERTY human_duration := (SELECT
std::to_str(.duration, 'HH24:MI:SS')
);
CREATE PROPERTY track: default::Track;
CREATE REQUIRED PROPERTY updated_at: std::datetime {
CREATE REWRITE
INSERT
Expand All @@ -94,8 +87,7 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
};
CREATE TYPE default::Artist {
CREATE REQUIRED PROPERTY name: std::str;
CREATE REQUIRED LINK user: default::User;
CREATE CONSTRAINT std::exclusive ON ((.name, .user));
CREATE CONSTRAINT std::exclusive ON (.name);
CREATE INDEX fts::index ON (fts::with_options(.name, language := fts::Language.eng));
CREATE REQUIRED PROPERTY created_at: std::datetime {
SET default := (std::datetime_current());
Expand All @@ -114,7 +106,10 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
CREATE REQUIRED LINK artist: default::Artist {
ON TARGET DELETE DELETE SOURCE;
};
CREATE CONSTRAINT std::exclusive ON ((.name, .user, .artist));
CREATE PROPERTY title := (SELECT
((.artist.name ++ ' - ') ++ .name)
);
CREATE CONSTRAINT std::exclusive ON ((.name, .artist));
};
ALTER TYPE default::Artist {
CREATE MULTI LINK albums := (.<artist[IS default::Album]);
Expand All @@ -134,11 +129,10 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
);
};
CREATE TYPE default::Folder {
CREATE REQUIRED LINK user: default::User;
CREATE REQUIRED PROPERTY ipv4: std::str;
CREATE REQUIRED PROPERTY name: std::str;
CREATE REQUIRED PROPERTY username: std::str;
CREATE CONSTRAINT std::exclusive ON ((.name, .user, .username, .ipv4));
CREATE CONSTRAINT std::exclusive ON ((.name, .username, .ipv4));
CREATE INDEX fts::index ON (fts::with_options(.name, language := fts::Language.eng));
CREATE REQUIRED PROPERTY created_at: std::datetime {
SET default := (std::datetime_current());
Expand Down Expand Up @@ -175,8 +169,7 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
};
CREATE TYPE default::Genre {
CREATE REQUIRED PROPERTY name: std::str;
CREATE REQUIRED LINK user: default::User;
CREATE CONSTRAINT std::exclusive ON ((.name, .user));
CREATE CONSTRAINT std::exclusive ON (.name);
CREATE INDEX fts::index ON (fts::with_options(.name, language := fts::Language.eng));
CREATE REQUIRED PROPERTY created_at: std::datetime {
SET default := (std::datetime_current());
Expand Down Expand Up @@ -222,8 +215,7 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
};
CREATE TYPE default::Keyword {
CREATE REQUIRED PROPERTY name: std::str;
CREATE REQUIRED LINK user: default::User;
CREATE CONSTRAINT std::exclusive ON ((.name, .user));
CREATE CONSTRAINT std::exclusive ON (.name);
CREATE INDEX fts::index ON (fts::with_options(.name, language := fts::Language.eng));
CREATE REQUIRED PROPERTY created_at: std::datetime {
SET default := (std::datetime_current());
Expand All @@ -240,6 +232,9 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
};
ALTER TYPE default::Music {
CREATE MULTI LINK keywords: default::Keyword;
CREATE PROPERTY title := (SELECT
((.album.title ++ ' - ') ++ .name)
);
CREATE PROPERTY paths := (SELECT
.folders@path
);
Expand Down Expand Up @@ -283,14 +278,25 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
<std::float64>std::round(<std::decimal>math::mean((.musics.rating ?? {0.0})), 2)
);
};
CREATE GLOBAL default::current_user := (std::assert_single((SELECT
default::User {
id,
name
}
FILTER
(.identity = GLOBAL ext::auth::ClientTokenIdentity)
)));
CREATE SCALAR TYPE default::`Limit` EXTENDING std::int64 {
CREATE CONSTRAINT std::min_value(0);
};
CREATE FUNCTION default::gen_playlist(NAMED ONLY min_length: default::Length = 0, NAMED ONLY max_length: default::Length = 2147483647, NAMED ONLY min_size: default::Size = 0, NAMED ONLY max_size: default::Size = 2147483647, NAMED ONLY min_rating: default::Rating = 0.0, NAMED ONLY max_rating: default::Rating = 5.0, NAMED ONLY artist: std::str = '(.*?)', NAMED ONLY album: std::str = '(.*?)', NAMED ONLY genre: std::str = '(.*?)', NAMED ONLY title: std::str = '(.*?)', NAMED ONLY keyword: std::str = '(.*?)', NAMED ONLY `limit`: default::`Limit` = 2147483647, NAMED ONLY pattern: std::str = '') -> SET OF default::Music {
CREATE ANNOTATION std::title := 'Generate a playlist from parameters';
USING (SELECT
default::Music FILTER
((((((((((((.length >= min_length) AND (.length <= max_length)) AND (.size >= min_size)) AND (.size <= max_size)) AND (.rating >= min_rating)) AND (.rating <= max_rating)) AND std::re_test(artist, .artist.name)) AND std::re_test(album, .album.name)) AND std::re_test(genre, .genre.name)) AND std::re_test(title, .name)) AND std::re_test(keyword, std::array_join(std::array_agg((SELECT
.keywords.name
)), ' '))) AND ((pattern = '') OR ext::pg_trgm::word_similar(pattern, .title)))
ORDER BY
.artist.name ASC THEN
.album.name ASC THEN
.track ASC THEN
.name ASC
LIMIT
`limit`
)
;};
ALTER TYPE default::Artist {
CREATE LINK genres := (SELECT
.musics.genre
Expand Down Expand Up @@ -431,7 +437,4 @@ CREATE MIGRATION m1n46zkg4ec75ff6drbbztljf3svo4hvnmby2h5u2akmqnmhtpzjiq
<std::float64>std::round(<std::decimal>math::mean((.musics.rating ?? {0.0})), 2)
);
};
CREATE SCALAR TYPE default::`Limit` EXTENDING std::int64 {
CREATE CONSTRAINT std::min_value(0);
};
};
50 changes: 0 additions & 50 deletions dbschema/migrations/00002.edgeql

This file was deleted.

5 changes: 0 additions & 5 deletions dbschema/migrations/00003.edgeql

This file was deleted.

9 changes: 0 additions & 9 deletions dbschema/migrations/00004.edgeql

This file was deleted.

16 changes: 0 additions & 16 deletions dbschema/migrations/00005.edgeql

This file was deleted.

6 changes: 3 additions & 3 deletions doc/coverage.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading

0 comments on commit ddad3f4

Please sign in to comment.