From 5d7b4e9a1938a2d1bd3c4fb8762d12ba39105174 Mon Sep 17 00:00:00 2001 From: Bulat Kurbanov Date: Thu, 26 Dec 2024 01:45:26 +0100 Subject: [PATCH] Fix --- src/views/authors.rs | 60 ++-- src/views/books.rs | 610 +++++++++++++++++++++------------------ src/views/sequences.rs | 70 +++-- src/views/translators.rs | 60 ++-- 4 files changed, 436 insertions(+), 364 deletions(-) diff --git a/src/views/authors.rs b/src/views/authors.rs index 165b301..2e55a7c 100644 --- a/src/views/authors.rs +++ b/src/views/authors.rs @@ -214,34 +214,40 @@ async fn get_author_books( b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM translations - JOIN authors ON authors.id = translations.author - WHERE translations.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM translations + JOIN authors ON authors.id = translations.author + WHERE translations.book = b.id + ), + ARRAY[]::author_type[] ) AS "translators!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - sequences.id, - sequences.name - )::sequence_type - ) - FROM book_sequences - JOIN sequences ON sequences.id = book_sequences.sequence - WHERE book_sequences.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + sequences.id, + sequences.name + )::sequence_type + ) + FROM book_sequences + JOIN sequences ON sequences.id = book_sequences.sequence + WHERE book_sequences.book = b.id + ), + ARRAY[]::sequence_type[] ) AS "sequences!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id diff --git a/src/views/books.rs b/src/views/books.rs index 35f504a..1414e05 100644 --- a/src/views/books.rs +++ b/src/views/books.rs @@ -60,51 +60,60 @@ pub async fn get_books( b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM book_authors - JOIN authors ON authors.id = book_authors.author - WHERE book_authors.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM book_authors + JOIN authors ON authors.id = book_authors.author + WHERE book_authors.book = b.id + ), + ARRAY[]::author_type[] ) AS "authors!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM translations - JOIN authors ON authors.id = translations.author - WHERE translations.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM translations + JOIN authors ON authors.id = translations.author + WHERE translations.book = b.id + ), + ARRAY[]::author_type[] ) AS "translators!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - sequences.id, - sequences.name - )::sequence_type - ) - FROM book_sequences - JOIN sequences ON sequences.id = book_sequences.sequence - WHERE book_sequences.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + sequences.id, + sequences.name + )::sequence_type + ) + FROM book_sequences + JOIN sequences ON sequences.id = book_sequences.sequence + WHERE book_sequences.book = b.id + ), + ARRAY[]::sequence_type[] ) AS "sequences!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id @@ -243,71 +252,83 @@ pub async fn get_random_book( b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM book_authors - JOIN authors ON authors.id = book_authors.author - WHERE book_authors.book = b.id - ) AS "authors!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM translations - JOIN authors ON authors.id = translations.author - WHERE translations.book = b.id - ) AS "translators!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - sequences.id, - sequences.name - )::sequence_type - ) - FROM book_sequences - JOIN sequences ON sequences.id = book_sequences.sequence - WHERE book_sequences.book = b.id - ) AS "sequences!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - genres.id, + COALESCE( + ( + SELECT + ARRAY_AGG( ROW( - sources.id, - sources.name - )::source_type, - genres.remote_id, - genres.code, - genres.description, - genres.meta - )::genre_type - ) - FROM book_genres - JOIN genres ON genres.id = book_genres.genre - JOIN sources ON sources.id = genres.source - WHERE book_genres.book = b.id + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM book_authors + JOIN authors ON authors.id = book_authors.author + WHERE book_authors.book = b.id + ), + ARRAY[]::author_type[] + ) AS "authors!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM translations + JOIN authors ON authors.id = translations.author + WHERE translations.book = b.id + ), + ARRAY[]::author_type[] + ) AS "translators!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + sequences.id, + sequences.name + )::sequence_type + ) + FROM book_sequences + JOIN sequences ON sequences.id = book_sequences.sequence + WHERE book_sequences.book = b.id + ), + ARRAY[]::sequence_type[] + ) AS "sequences!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + genres.id, + ROW( + sources.id, + sources.name + )::source_type, + genres.remote_id, + genres.code, + genres.description, + genres.meta + )::genre_type + ) + FROM book_genres + JOIN genres ON genres.id = book_genres.genre + JOIN sources ON sources.id = genres.source + WHERE book_genres.book = b.id + ), + ARRAY[]::genre_type[] ) AS "genres!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id @@ -352,71 +373,83 @@ pub async fn get_remote_book( b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM book_authors - JOIN authors ON authors.id = book_authors.author - WHERE book_authors.book = b.id - ) AS "authors!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM translations - JOIN authors ON authors.id = translations.author - WHERE translations.book = b.id - ) AS "translators!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - sequences.id, - sequences.name - )::sequence_type - ) - FROM book_sequences - JOIN sequences ON sequences.id = book_sequences.sequence - WHERE book_sequences.book = b.id - ) AS "sequences!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - genres.id, + COALESCE( + ( + SELECT + ARRAY_AGG( ROW( - sources.id, - sources.name - )::source_type, - remote_id, - genres.code, - genres.description, - genres.meta - )::genre_type - ) - FROM book_genres - JOIN genres ON genres.id = book_genres.genre - JOIN sources ON sources.id = genres.source - WHERE book_genres.book = b.id + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM book_authors + JOIN authors ON authors.id = book_authors.author + WHERE book_authors.book = b.id + ), + ARRAY[]::author_type[] + ) AS "authors!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM translations + JOIN authors ON authors.id = translations.author + WHERE translations.book = b.id + ), + ARRAY[]::author_type[] + ) AS "translators!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + sequences.id, + sequences.name + )::sequence_type + ) + FROM book_sequences + JOIN sequences ON sequences.id = book_sequences.sequence + WHERE book_sequences.book = b.id + ), + ARRAY[]::sequence_type[] + ) AS "sequences!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + genres.id, + ROW( + sources.id, + sources.name + )::source_type, + remote_id, + genres.code, + genres.description, + genres.meta + )::genre_type + ) + FROM book_genres + JOIN genres ON genres.id = book_genres.genre + JOIN sources ON sources.id = genres.source + WHERE book_genres.book = b.id + ), + ARRAY[]::genre_type[] ) AS "genres!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id @@ -491,51 +524,60 @@ pub async fn search_books( b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM book_authors - JOIN authors ON authors.id = book_authors.author - WHERE book_authors.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM book_authors + JOIN authors ON authors.id = book_authors.author + WHERE book_authors.book = b.id + ), + ARRAY[]::author_type[] ) AS "authors!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM translations - JOIN authors ON authors.id = translations.author - WHERE translations.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM translations + JOIN authors ON authors.id = translations.author + WHERE translations.book = b.id + ), + ARRAY[]::author_type[] ) AS "translators!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - sequences.id, - sequences.name - )::sequence_type - ) - FROM book_sequences - JOIN sequences ON sequences.id = book_sequences.sequence - WHERE book_sequences.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + sequences.id, + sequences.name + )::sequence_type + ) + FROM book_sequences + JOIN sequences ON sequences.id = book_sequences.sequence + WHERE book_sequences.book = b.id + ), + ARRAY[]::sequence_type[] ) AS "sequences!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id @@ -573,71 +615,83 @@ pub async fn get_book(db: Database, Path(book_id): Path) -> impl IntoRespon b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM book_authors - JOIN authors ON authors.id = book_authors.author - WHERE book_authors.book = b.id - ) AS "authors!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM translations - JOIN authors ON authors.id = translations.author - WHERE translations.book = b.id - ) AS "translators!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - sequences.id, - sequences.name - )::sequence_type - ) - FROM book_sequences - JOIN sequences ON sequences.id = book_sequences.sequence - WHERE book_sequences.book = b.id - ) AS "sequences!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - genres.id, + COALESCE( + ( + SELECT + ARRAY_AGG( ROW( - sources.id, - sources.name - )::source_type, - genres.remote_id, - genres.code, - genres.description, - genres.meta - )::genre_type - ) - FROM book_genres - JOIN genres ON genres.id = book_genres.genre - JOIN sources ON sources.id = genres.source - WHERE book_genres.book = b.id + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM book_authors + JOIN authors ON authors.id = book_authors.author + WHERE book_authors.book = b.id + ), + ARRAY[]::author_type[] + ) AS "authors!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM translations + JOIN authors ON authors.id = translations.author + WHERE translations.book = b.id + ), + ARRAY[]::author_type[] + ) AS "translators!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + sequences.id, + sequences.name + )::sequence_type + ) + FROM book_sequences + JOIN sequences ON sequences.id = book_sequences.sequence + WHERE book_sequences.book = b.id + ), + ARRAY[]::sequence_type[] + ) AS "sequences!: Vec", + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + genres.id, + ROW( + sources.id, + sources.name + )::source_type, + genres.remote_id, + genres.code, + genres.description, + genres.meta + )::genre_type + ) + FROM book_genres + JOIN genres ON genres.id = book_genres.genre + JOIN sources ON sources.id = genres.source + WHERE book_genres.book = b.id + ), + ARRAY[]::genre_type[] ) AS "genres!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id diff --git a/src/views/sequences.rs b/src/views/sequences.rs index fbfa35d..75b6de7 100644 --- a/src/views/sequences.rs +++ b/src/views/sequences.rs @@ -213,39 +213,45 @@ async fn get_sequence_books( b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM book_authors - JOIN authors ON authors.id = book_authors.author - WHERE book_authors.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM book_authors + JOIN authors ON authors.id = book_authors.author + WHERE book_authors.book = b.id + ), + ARRAY[]::author_type[] ) AS "authors!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM translations - JOIN authors ON authors.id = translations.author - WHERE translations.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM translations + JOIN authors ON authors.id = translations.author + WHERE translations.book = b.id + ), + ARRAY[]::author_type[] ) AS "translators!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id diff --git a/src/views/translators.rs b/src/views/translators.rs index b313305..f453e88 100644 --- a/src/views/translators.rs +++ b/src/views/translators.rs @@ -86,34 +86,40 @@ async fn get_translated_books( b.year, CASE WHEN b.file_type = 'fb2' THEN ARRAY['fb2', 'epub', 'mobi', 'fb2zip']::text[] ELSE ARRAY[b.file_type]::text[] END AS "available_types!: Vec", b.uploaded, - ( - SELECT - ARRAY_AGG( - ROW( - authors.id, - authors.first_name, - authors.last_name, - authors.middle_name, - EXISTS( - SELECT * FROM author_annotations WHERE author = authors.id - ) - )::author_type - ) - FROM book_authors - JOIN authors ON authors.id = book_authors.author - WHERE book_authors.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + authors.id, + authors.first_name, + authors.last_name, + authors.middle_name, + EXISTS( + SELECT * FROM author_annotations WHERE author = authors.id + ) + )::author_type + ) + FROM book_authors + JOIN authors ON authors.id = book_authors.author + WHERE book_authors.book = b.id + ), + ARRAY[]::author_type[] ) AS "authors!: Vec", - ( - SELECT - ARRAY_AGG( - ROW( - sequences.id, - sequences.name - )::sequence_type - ) - FROM book_sequences - JOIN sequences ON sequences.id = book_sequences.sequence - WHERE book_sequences.book = b.id + COALESCE( + ( + SELECT + ARRAY_AGG( + ROW( + sequences.id, + sequences.name + )::sequence_type + ) + FROM book_sequences + JOIN sequences ON sequences.id = book_sequences.sequence + WHERE book_sequences.book = b.id + ), + ARRAY[]::sequence_type[] ) AS "sequences!: Vec", EXISTS( SELECT * FROM book_annotations WHERE book = b.id