Use queries.zig in scrobbles view
This commit is contained in:
parent
f59eec79a8
commit
3ff973e193
2 changed files with 23 additions and 64 deletions
|
|
@ -1,56 +1,12 @@
|
||||||
const std = @import("std");
|
const std = @import("std");
|
||||||
const jetzig = @import("jetzig");
|
const jetzig = @import("jetzig");
|
||||||
const zeit = @import("zeit");
|
const queries = @import("../../queries.zig");
|
||||||
const TableRow = @import("../../types.zig").TableRow;
|
|
||||||
const HyperlinkData = @import("../../types.zig").HyperlinkData;
|
|
||||||
const Utils = @import("../../date_fmt.zig");
|
|
||||||
|
|
||||||
pub fn index(request: *jetzig.Request) !jetzig.View {
|
pub fn index(request: *jetzig.Request) !jetzig.View {
|
||||||
var root = try request.data(.object);
|
var root = try request.data(.object);
|
||||||
var scrobbles_view = try root.put("scrobbles", .array);
|
|
||||||
|
|
||||||
const query =
|
const scrobbles = try queries.entityQueryResult(request, queries.generateQuery(.scrobble, .entities), .{}, .array);
|
||||||
\\SELECT songs.name, songs.id, albums.name, albums.id, artists.name, artists.id, scrobbles.id, scrobbles.datetime
|
try root.put("scrobbles", scrobbles);
|
||||||
\\FROM albumsongs
|
|
||||||
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
|
||||||
\\INNER JOIN albums ON albums.id = albumsongs.album_id
|
|
||||||
\\INNER JOIN scrobbles ON scrobbles.albumsong = albumsongs.id
|
|
||||||
\\INNER JOIN albumsongsartists ON albumsongsartists.albumsong_id = albumsongs.id
|
|
||||||
\\INNER JOIN artists ON artists.id = albumsongsartists.artist_id
|
|
||||||
\\ORDER BY scrobbles.datetime ASC
|
|
||||||
;
|
|
||||||
|
|
||||||
var scrobbles_jq_result = try request.repo.executeSql(query, .{});
|
|
||||||
defer scrobbles_jq_result.deinit();
|
|
||||||
|
|
||||||
const Scrobble = struct { song_name: []const u8, song_id: i32, album_name: []const u8, album_id: i32, artist_name: []const u8, artist_id: i32, s_id: i32, date: i64 };
|
|
||||||
|
|
||||||
var prev_s_id: ?i32 = null;
|
|
||||||
|
|
||||||
var row: ?TableRow = null;
|
|
||||||
var artistlist = std.ArrayList(HyperlinkData).init(request.allocator);
|
|
||||||
|
|
||||||
blk: while (try scrobbles_jq_result.postgresql.result.next()) |scrobble_row| {
|
|
||||||
const scrobble = try scrobble_row.to(Scrobble, .{ .dupe = true, .allocator = request.allocator });
|
|
||||||
if (scrobble.s_id == prev_s_id) {
|
|
||||||
try artistlist.append(.{ .name = scrobble.artist_name, .id = scrobble.artist_id });
|
|
||||||
continue :blk;
|
|
||||||
} else {
|
|
||||||
const date = try Utils.dateFmt(request.allocator, scrobble.date);
|
|
||||||
|
|
||||||
try artistlist.append(.{ .name = scrobble.artist_name, .id = scrobble.artist_id });
|
|
||||||
|
|
||||||
row = TableRow{
|
|
||||||
.song = .{ .name = scrobble.song_name, .id = scrobble.song_id },
|
|
||||||
.album = .{ .name = scrobble.album_name, .id = scrobble.album_id },
|
|
||||||
.artistlist = try artistlist.toOwnedSlice(),
|
|
||||||
.date = date,
|
|
||||||
};
|
|
||||||
|
|
||||||
try scrobbles_view.append(row);
|
|
||||||
}
|
|
||||||
prev_s_id = scrobble.s_id;
|
|
||||||
}
|
|
||||||
|
|
||||||
return request.render(.ok);
|
return request.render(.ok);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,23 +25,19 @@ pub fn entityQueryResult(request: *jetzig.Request, query: GeneratedQuery, args:
|
||||||
const item: ?TableRow = switch (query.ResultType) {
|
const item: ?TableRow = switch (query.ResultType) {
|
||||||
EntitiesScrobbleResult, EntitiesSongResult, EntitiesAlbumResult, EntitiesArtistResult => switch (query.entity) {
|
EntitiesScrobbleResult, EntitiesSongResult, EntitiesAlbumResult, EntitiesArtistResult => switch (query.entity) {
|
||||||
.artist => TableRow{ .artist = .{ .name = entity.name, .id = entity.id }, .scrobbles = entity.scrobbles },
|
.artist => TableRow{ .artist = .{ .name = entity.name, .id = entity.id }, .scrobbles = entity.scrobbles },
|
||||||
.album => album_entities: {
|
.scrobble, .song, .album => album_entities: {
|
||||||
const last_artist = artist_list.getLastOrNull();
|
const last_artist = artist_list.getLastOrNull();
|
||||||
try artist_list.append(.{ .name = entity.artist_name, .id = entity.artist_id });
|
try artist_list.append(.{ .name = entity.artist_name, .id = entity.artist_id });
|
||||||
if (last_artist) |la| {
|
if (last_artist) |la| {
|
||||||
if (la.id == entity.artist_id) continue :blk;
|
if (la.id == entity.artist_id) continue :blk;
|
||||||
}
|
}
|
||||||
break :album_entities TableRow{ .album = .{ .name = entity.name, .id = entity.id }, .artistlist = try artist_list.toOwnedSlice(), .scrobbles = entity.scrobbles };
|
break :album_entities switch (query.entity) {
|
||||||
},
|
.scrobble => TableRow{ .song = .{ .name = entity.song_name, .id = entity.song_id }, .album = .{ .name = entity.album_name, .id = entity.album_id }, .artistlist = try artist_list.toOwnedSlice(), .date = entity.date },
|
||||||
.song => song_entities: {
|
.song => TableRow{ .song = .{ .name = entity.name, .id = entity.id }, .artistlist = try artist_list.toOwnedSlice(), .scrobbles = entity.scrobbles },
|
||||||
const last_artist = artist_list.getLastOrNull();
|
.album => TableRow{ .album = .{ .name = entity.name, .id = entity.id }, .artistlist = try artist_list.toOwnedSlice(), .scrobbles = entity.scrobbles },
|
||||||
try artist_list.append(.{ .name = entity.artist_name, .id = entity.artist_id });
|
|
||||||
if (last_artist) |la| {
|
|
||||||
if (la.id == entity.artist_id) continue :blk;
|
|
||||||
}
|
|
||||||
break :song_entities TableRow{ .song = .{ .name = entity.name, .id = entity.id }, .artistlist = try artist_list.toOwnedSlice(), .scrobbles = entity.scrobbles };
|
|
||||||
},
|
|
||||||
else => unreachable,
|
else => unreachable,
|
||||||
|
};
|
||||||
|
},
|
||||||
},
|
},
|
||||||
EntityItemsResult => switch (query.entity) {
|
EntityItemsResult => switch (query.entity) {
|
||||||
.artist => TableRow{ .album = .{ .name = entity.name, .id = entity.id }, .scrobbles = entity.scrobbles },
|
.artist => TableRow{ .album = .{ .name = entity.name, .id = entity.id }, .scrobbles = entity.scrobbles },
|
||||||
|
|
@ -92,7 +88,7 @@ const TimescaleResult = struct { year: []const u8, scrobbles: i64 };
|
||||||
const EntitiesArtistResult = struct { name: []const u8, id: i32, scrobbles: i64 };
|
const EntitiesArtistResult = struct { name: []const u8, id: i32, scrobbles: i64 };
|
||||||
const EntitiesAlbumResult = struct { name: []const u8, id: i32, artist_name: []const u8, artist_id: i32, scrobbles: i64 };
|
const EntitiesAlbumResult = struct { name: []const u8, id: i32, artist_name: []const u8, artist_id: i32, scrobbles: i64 };
|
||||||
const EntitiesSongResult = struct { name: []const u8, id: i32, artist_name: []const u8, artist_id: i32, scrobbles: i64 };
|
const EntitiesSongResult = struct { name: []const u8, id: i32, artist_name: []const u8, artist_id: i32, scrobbles: i64 };
|
||||||
const EntitiesScrobbleResult = struct { song_name: []const u8, song_id: i32, album_name: []const u8, album_id: i32, artist_name: []const u8, artist_id: i32, s_id: i32, date: i64 };
|
const EntitiesScrobbleResult = struct { song_name: []const u8, song_id: i32, album_name: []const u8, album_id: i32, artist_name: []const u8, artist_id: i32, date: []const u8 };
|
||||||
const EntityItemsResult = struct { name: []const u8, id: i32, scrobbles: i64 };
|
const EntityItemsResult = struct { name: []const u8, id: i32, scrobbles: i64 };
|
||||||
const AppearsResult = struct { name: []const u8, id: i32, scrobbles: i64 };
|
const AppearsResult = struct { name: []const u8, id: i32, scrobbles: i64 };
|
||||||
const EntityInfoResult = struct { name: []const u8, id: i32, scrobbles: i64, rank: []const u8 };
|
const EntityInfoResult = struct { name: []const u8, id: i32, scrobbles: i64, rank: []const u8 };
|
||||||
|
|
@ -142,7 +138,7 @@ pub fn generateQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQue
|
||||||
,
|
,
|
||||||
|
|
||||||
.album =>
|
.album =>
|
||||||
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MM:SS') AS date
|
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MI:SS') AS date
|
||||||
\\FROM albumsongs
|
\\FROM albumsongs
|
||||||
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
||||||
|
|
@ -153,7 +149,7 @@ pub fn generateQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQue
|
||||||
\\
|
\\
|
||||||
\\UNION ALL
|
\\UNION ALL
|
||||||
\\
|
\\
|
||||||
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MM:SS') AS date
|
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MI:SS') AS date
|
||||||
\\FROM albumsongs
|
\\FROM albumsongs
|
||||||
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
||||||
|
|
@ -164,7 +160,7 @@ pub fn generateQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQue
|
||||||
,
|
,
|
||||||
|
|
||||||
.artist =>
|
.artist =>
|
||||||
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MM:SS') AS date
|
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MI:SS') AS date
|
||||||
\\FROM albumsongs
|
\\FROM albumsongs
|
||||||
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
||||||
|
|
@ -175,7 +171,7 @@ pub fn generateQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQue
|
||||||
\\
|
\\
|
||||||
\\UNION ALL
|
\\UNION ALL
|
||||||
\\
|
\\
|
||||||
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MM:SS') AS date
|
\\(SELECT songs.name AS name, songs.id AS id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MI:SS') AS date
|
||||||
\\FROM albumsongs
|
\\FROM albumsongs
|
||||||
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
\\INNER JOIN scrobbles ON albumsongs.id = scrobbles.albumsong
|
||||||
|
|
@ -227,7 +223,14 @@ pub fn generateQuery(entity: EntityType, query_type: QueryTypeEnum) GeneratedQue
|
||||||
//.ResultType = EntitiesResult,
|
//.ResultType = EntitiesResult,
|
||||||
switch (entity) {
|
switch (entity) {
|
||||||
.scrobble =>
|
.scrobble =>
|
||||||
\\none
|
\\SELECT songs.name AS song_name, songs.id AS song_id, albums.name AS album_name, albums.id AS album_id, artists.name AS artist_name, artists.id AS artist_id, TO_CHAR(scrobbles.datetime, 'YYYY-MM-DD HH24:MI:SS') AS date
|
||||||
|
\\FROM albumsongs
|
||||||
|
\\INNER JOIN songs ON songs.id = albumsongs.song_id
|
||||||
|
\\INNER JOIN albums ON albums.id = albumsongs.album_id
|
||||||
|
\\INNER JOIN scrobbles ON scrobbles.albumsong = albumsongs.id
|
||||||
|
\\INNER JOIN albumsongsartists ON albumsongsartists.albumsong_id = albumsongs.id
|
||||||
|
\\INNER JOIN artists ON artists.id = albumsongsartists.artist_id
|
||||||
|
\\ORDER BY scrobbles.datetime ASC
|
||||||
,
|
,
|
||||||
.song =>
|
.song =>
|
||||||
\\SELECT songs.name, songs.id, artists.name, artists.id, COUNT(scrobbles) AS scrobbles
|
\\SELECT songs.name, songs.id, artists.name, artists.id, COUNT(scrobbles) AS scrobbles
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue