Update queries
Adds datestreak query, provides the number of songs/albums when relevant, and provides timescale with all years, regardless of the number of plays (defaults to 0)
This commit is contained in:
parent
d81681e698
commit
c57bf18627
1 changed files with 54 additions and 21 deletions
|
|
@ -17,13 +17,18 @@ pub fn entityQueryResult(request: *jetzig.Request, query: GeneratedQuery, args:
|
||||||
|
|
||||||
if (query.query_type == .entity_info) {
|
if (query.query_type == .entity_info) {
|
||||||
var out: *jetzig.Data.Value = try Data.object();
|
var out: *jetzig.Data.Value = try Data.object();
|
||||||
const entity = try (try result.next()).?.to(struct { name: []const u8, id: i32, scrobbles: i64, rank: []const u8 }, .{ .dupe = true, .allocator = request.allocator });
|
const entity = try (try result.next()).?.to(struct { name: []const u8, id: i32, scrobbles: i64, album_num: ?i64 = null, song_num: ?i64 = null, rank: []const u8 }, .{ .dupe = true, .allocator = request.allocator, .map = .name });
|
||||||
const entity_struct = .{ .name = entity.name, .id = entity.id, .scrobbles = entity.scrobbles, .rank = entity.rank };
|
try out.put("entity_info", entity);
|
||||||
try out.put("entity_info", entity_struct);
|
|
||||||
try result.drain();
|
try result.drain();
|
||||||
return out.get("entity_info").?;
|
return out.get("entity_info").?;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if (query.query_type == .datestreak) {
|
||||||
|
// var out: *jetzig.Data.Value = try Data.object();
|
||||||
|
// const entity = try (try result.next()).?.to(struct { name: []const u8, id: i32, scrobbles: i64, rank: []const u8 }, .{ .dupe = true, .allocator = request.allocator });
|
||||||
|
//
|
||||||
|
//}
|
||||||
|
|
||||||
var out: *jetzig.Data.Value = try Data.array();
|
var out: *jetzig.Data.Value = try Data.array();
|
||||||
var mapper = result.mapper(UnifiedResult, .{ .dupe = true, .allocator = request.allocator });
|
var mapper = result.mapper(UnifiedResult, .{ .dupe = true, .allocator = request.allocator });
|
||||||
|
|
||||||
|
|
@ -168,14 +173,17 @@ pub fn loadQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQuery {
|
||||||
,
|
,
|
||||||
|
|
||||||
.artist =>
|
.artist =>
|
||||||
\\SELECT TO_CHAR(date_trunc('year', datetime), 'YYYY') AS date, COUNT(*) as scrobbles
|
\\SELECT y.year AS date, COALESCE(DT.scrobbles, 0) AS scrobbles
|
||||||
|
\\FROM (SELECT GENERATE_SERIES(2016,date_part('year',now())::int)::text) AS y(year)
|
||||||
|
\\LEFT JOIN (SELECT TO_CHAR(date_trunc('year', datetime), 'YYYY') AS date, COUNT(*) as scrobbles
|
||||||
\\FROM scrobbles
|
\\FROM scrobbles
|
||||||
\\INNER JOIN albumsongs ON albumsongs.id = scrobbles.albumsong
|
\\INNER JOIN albumsongs ON albumsongs.id = scrobbles.albumsong
|
||||||
\\INNER JOIN albumsongsartists ON albumsongsartists.albumsong_id = albumsongs.id
|
\\INNER JOIN albumsongsartists ON albumsongsartists.albumsong_id = albumsongs.id
|
||||||
\\INNER JOIN artists ON artists.id = albumsongsartists.artist_id
|
\\INNER JOIN artists ON artists.id = albumsongsartists.artist_id
|
||||||
\\WHERE artists.id = $1
|
\\WHERE artists.id = $1
|
||||||
\\GROUP BY date
|
\\GROUP BY date
|
||||||
\\ORDER BY date ASC;
|
\\ORDER BY date ASC) AS DT
|
||||||
|
\\ON DT.date = y.year;
|
||||||
,
|
,
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|
@ -303,21 +311,24 @@ pub fn loadQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQuery {
|
||||||
.album =>
|
.album =>
|
||||||
\\SELECT * FROM
|
\\SELECT * FROM
|
||||||
\\(SELECT *, TO_CHAR(ROW_NUMBER() OVER (ORDER BY scrobbles DESC),'FM9999th') AS rank FROM
|
\\(SELECT *, TO_CHAR(ROW_NUMBER() OVER (ORDER BY scrobbles DESC),'FM9999th') AS rank FROM
|
||||||
\\(SELECT albums.name AS name, albums.id AS id, COUNT(scrobbles) AS scrobbles
|
\\(SELECT albums.name AS name, albums.id AS id, COUNT(DISTINCT songs.id) AS song_num, COUNT(scrobbles) AS scrobbles
|
||||||
\\FROM albumsongs
|
\\FROM albumsongs
|
||||||
\\INNER JOIN albums ON albumsongs.album_id = albums.id
|
\\INNER JOIN albums ON albumsongs.album_id = albums.id
|
||||||
\\INNER JOIN scrobbles ON scrobbles.albumsong = albumsongs.id
|
\\INNER JOIN scrobbles ON scrobbles.albumsong = albumsongs.id
|
||||||
|
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
\\GROUP BY albums.id))
|
\\GROUP BY albums.id))
|
||||||
\\WHERE id = $1
|
\\WHERE id = $1;
|
||||||
,
|
,
|
||||||
.artist =>
|
.artist =>
|
||||||
\\SELECT * FROM
|
\\SELECT * FROM
|
||||||
\\(SELECT *, TO_CHAR(ROW_NUMBER() OVER (ORDER BY scrobbles DESC),'FM9999th') AS rank FROM
|
\\(SELECT *, TO_CHAR(ROW_NUMBER() OVER (ORDER BY scrobbles DESC),'FM9999th') AS rank FROM
|
||||||
\\(SELECT artists.name AS name, artists.id AS id, COUNT(scrobbles) AS scrobbles
|
\\(SELECT artists.name AS name, artists.id AS id, COUNT(scrobbles) AS scrobbles, COUNT(DISTINCT albums.id) AS album_num, COUNT(DISTINCT songs.id) AS song_num
|
||||||
\\FROM albumsongsartists
|
\\FROM albumsongsartists
|
||||||
\\INNER JOIN artists ON albumsongsartists.artist_id = artists.id
|
\\INNER JOIN artists ON albumsongsartists.artist_id = artists.id
|
||||||
\\INNER JOIN albumsongs ON albumsongsartists.albumsong_id = albumsongs.id
|
\\INNER JOIN albumsongs ON albumsongsartists.albumsong_id = albumsongs.id
|
||||||
\\INNER JOIN scrobbles ON scrobbles.albumsong = albumsongs.id
|
\\INNER JOIN scrobbles ON scrobbles.albumsong = albumsongs.id
|
||||||
|
\\INNER JOIN albums ON albums.id = albumsongs.album_id
|
||||||
|
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
\\GROUP BY artists.id))
|
\\GROUP BY artists.id))
|
||||||
\\WHERE id = $1
|
\\WHERE id = $1
|
||||||
,
|
,
|
||||||
|
|
@ -325,22 +336,44 @@ pub fn loadQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQuery {
|
||||||
|
|
||||||
.datestreak => switch (entity) {
|
.datestreak => switch (entity) {
|
||||||
.song =>
|
.song =>
|
||||||
\\SELECT songs.name AS song_name, albums.name AS album_name, streak.maxseq AS intval, FORMAT('%s - %s, streak.ds, streak.de) AS date FROM (SELECT albumsong, MAX(numdays) AS maxseq, ds, de
|
\\SELECT maxseq AS streak, FORMAT('%s - %s', ds, de) AS date FROM (SELECT MAX(numdays) AS maxseq, ds, de
|
||||||
\\FROM (SELECT albumsong, grp, MIN(datetime::date) AS ds, MAX(datetime::date) AS de,
|
\\FROM (SELECT grp, MIN(datetime::date) AS ds, MAX(datetime::date) AS de,
|
||||||
\\COUNT(DISTINCT datetime::date) AS numdays
|
\\COUNT(DISTINCT datetime::date) AS numdays
|
||||||
\\FROM (SELECT scrobbles.*,
|
\\FROM (SELECT scrobbles.datetime,
|
||||||
\\((datetime::date - '1970-01-01'::date) - DENSE_RANK() OVER (PARTITION BY albumsong ORDER BY datetime::date)) AS grp
|
\\((datetime::date - '1970-01-01'::date) - DENSE_RANK() OVER (PARTITION BY songs.id ORDER BY datetime::date)) AS grp
|
||||||
\\FROM scrobbles
|
\\FROM scrobbles INNER JOIN albumsongs ON albumsongs.id = albumsong INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
|
\\WHERE songs.id = $1) scrobbles
|
||||||
|
\\GROUP BY grp
|
||||||
\\) scrobbles
|
\\) scrobbles
|
||||||
\\GROUP BY albumsong, grp
|
\\GROUP BY ds, de)
|
||||||
\\) scrobbles
|
\\ORDER BY maxseq DESC;
|
||||||
\\GROUP BY albumsong, ds, de) AS streak
|
|
||||||
\\INNER JOIN albumsongs ON albumsongs.id = streak.albumsong
|
|
||||||
\\INNER JOIN albums ON albums.id = albumsongs.album_id
|
|
||||||
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
|
||||||
\\ORDER BY streak.maxseq DESC;
|
|
||||||
,
|
,
|
||||||
else => unreachable,
|
.artist =>
|
||||||
|
\\SELECT maxseq AS streak, FORMAT('%s - %s' ,ds,de) AS date FROM (SELECT MAX(numdays) AS maxseq, ds, de
|
||||||
|
\\FROM (SELECT grp, MIN(datetime::date) AS ds, MAX(datetime::date) AS de,
|
||||||
|
\\COUNT(DISTINCT datetime::date) AS numdays
|
||||||
|
\\FROM (SELECT scrobbles.datetime,
|
||||||
|
\\((scrobbles.datetime::date - '1970-01-01'::date) - DENSE_RANK() OVER (PARTITION BY artists.id ORDER BY scrobbles.datetime::date)) AS grp
|
||||||
|
\\FROM scrobbles INNER JOIN albumsongsartists ON albumsongsartists.albumsong_id = scrobbles.albumsong INNER JOIN artists ON artists.id = albumsongsartists.artist_id
|
||||||
|
\\WHERE artists.id = $1) scrobbles
|
||||||
|
\\GROUP BY grp
|
||||||
|
\\) scrobbles
|
||||||
|
\\GROUP BY ds, de)
|
||||||
|
\\ORDER BY maxseq DESC;
|
||||||
|
,
|
||||||
|
.album =>
|
||||||
|
\\SELECT maxseq AS streak, FORMAT('%s - %s', ds, de) AS date FROM (SELECT MAX(numdays) AS maxseq, ds, de
|
||||||
|
\\FROM (SELECT grp, MIN(datetime::date) AS ds, MAX(datetime::date) AS de,
|
||||||
|
\\COUNT(DISTINCT datetime::date) AS numdays
|
||||||
|
\\FROM (SELECT scrobbles.datetime,
|
||||||
|
\\((datetime::date - '1970-01-01'::date) - DENSE_RANK() OVER (PARTITION BY albums.id ORDER BY datetime::date)) AS grp FROM scrobbles INNER JOIN albumsongs ON albumsongs.id = albumsong INNER JOIN albums ON albums.id = albumsongs.album_id
|
||||||
|
\\WHERE albums.id = $1) scrobbles
|
||||||
|
\\GROUP BY grp
|
||||||
|
\\) scrobbles
|
||||||
|
\\GROUP BY ds, de)
|
||||||
|
\\ORDER BY maxseq DESC;
|
||||||
|
,
|
||||||
|
.scrobble => unreachable,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue