feat: query for usertitles written
This commit is contained in:
parent
ba68b5ee04
commit
32566fe7a2
8 changed files with 497 additions and 250 deletions
|
|
@ -86,7 +86,7 @@ SELECT
|
|||
si.image_path as studio_image_path
|
||||
|
||||
FROM titles as t
|
||||
LEFT JOIN images as i ON (t.image_id = i.id)
|
||||
LEFT JOIN images as i ON (t.poster_id = i.id)
|
||||
LEFT JOIN title_tags as tt ON (t.id = tt.title_id)
|
||||
LEFT JOIN tags as g ON (tt.tag_id = g.id)
|
||||
LEFT JOIN studios as s ON (t.studio_id = s.id)
|
||||
|
|
@ -109,7 +109,7 @@ SELECT
|
|||
si.image_path as studio_image_path
|
||||
|
||||
FROM titles as t
|
||||
LEFT JOIN images as i ON (t.image_id = i.id)
|
||||
LEFT JOIN images as i ON (t.poster_id = i.id)
|
||||
LEFT JOIN title_tags as tt ON (t.id = tt.title_id)
|
||||
LEFT JOIN tags as g ON (tt.tag_id = g.id)
|
||||
LEFT JOIN studios as s ON (t.studio_id = s.id)
|
||||
|
|
@ -210,37 +210,125 @@ ORDER BY
|
|||
LIMIT COALESCE(sqlc.narg('limit')::int, 100); -- 100 is default limit
|
||||
|
||||
-- name: SearchUserTitles :many
|
||||
SELECT
|
||||
*
|
||||
FROM usertitles as u
|
||||
JOIN titles as t ON (u.title_id = t.id)
|
||||
WHERE
|
||||
CASE
|
||||
WHEN sqlc.narg('word')::text IS NOT NULL THEN
|
||||
(
|
||||
SELECT bool_and(
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM jsonb_each_text(t.title_names) AS t(key, val)
|
||||
WHERE val ILIKE pattern
|
||||
)
|
||||
)
|
||||
FROM unnest(
|
||||
ARRAY(
|
||||
SELECT '%' || trim(w) || '%'
|
||||
FROM unnest(string_to_array(sqlc.narg('word')::text, ' ')) AS w
|
||||
WHERE trim(w) <> ''
|
||||
)
|
||||
) AS pattern
|
||||
)
|
||||
ELSE true
|
||||
SELECT
|
||||
t.*,
|
||||
u.user_id as user_id,
|
||||
u.status as usertitle_status,
|
||||
u.rate as user_rate,
|
||||
u.review_id as review_id,
|
||||
u.ctime as user_ctime,
|
||||
i.storage_type::text as title_storage_type,
|
||||
i.image_path as title_image_path,
|
||||
jsonb_agg_strict(g.tag_name)'[]'::jsonb as tag_names,
|
||||
s.studio_name as studio_name,
|
||||
s.illust_id as studio_illust_id,
|
||||
s.studio_desc as studio_desc,
|
||||
si.storage_type::text as studio_storage_type,
|
||||
si.image_path as studio_image_path
|
||||
|
||||
FROM usertitles as u
|
||||
LEFT JOIN titles as t ON (u.title_id = t.id)
|
||||
LEFT JOIN images as i ON (t.poster_id = i.id)
|
||||
LEFT JOIN title_tags as tt ON (t.id = tt.title_id)
|
||||
LEFT JOIN tags as g ON (tt.tag_id = g.id)
|
||||
LEFT JOIN studios as s ON (t.studio_id = s.id)
|
||||
LEFT JOIN images as si ON (s.illust_id = si.id)
|
||||
|
||||
WHERE
|
||||
CASE
|
||||
WHEN sqlc.arg('forward')::boolean THEN
|
||||
-- forward: greater than cursor (next page)
|
||||
CASE sqlc.arg('sort_by')::text
|
||||
WHEN 'year' THEN
|
||||
(sqlc.narg('cursor_year')::int IS NULL) OR
|
||||
(t.release_year > sqlc.narg('cursor_year')::int) OR
|
||||
(t.release_year = sqlc.narg('cursor_year')::int AND t.id > sqlc.narg('cursor_id')::bigint)
|
||||
|
||||
WHEN 'rating' THEN
|
||||
(sqlc.narg('cursor_rating')::float IS NULL) OR
|
||||
(t.rating > sqlc.narg('cursor_rating')::float) OR
|
||||
(t.rating = sqlc.narg('cursor_rating')::float AND t.id > sqlc.narg('cursor_id')::bigint)
|
||||
|
||||
WHEN 'id' THEN
|
||||
(sqlc.narg('cursor_id')::bigint IS NULL) OR
|
||||
(t.id > sqlc.narg('cursor_id')::bigint)
|
||||
|
||||
ELSE true -- fallback
|
||||
END
|
||||
|
||||
ELSE
|
||||
-- backward: less than cursor (prev page)
|
||||
CASE sqlc.arg('sort_by')::text
|
||||
WHEN 'year' THEN
|
||||
(sqlc.narg('cursor_year')::int IS NULL) OR
|
||||
(t.release_year < sqlc.narg('cursor_year')::int) OR
|
||||
(t.release_year = sqlc.narg('cursor_year')::int AND t.id < sqlc.narg('cursor_id')::bigint)
|
||||
|
||||
WHEN 'rating' THEN
|
||||
(sqlc.narg('cursor_rating')::float IS NULL) OR
|
||||
(t.rating < sqlc.narg('cursor_rating')::float) OR
|
||||
(t.rating = sqlc.narg('cursor_rating')::float AND t.id < sqlc.narg('cursor_id')::bigint)
|
||||
|
||||
WHEN 'id' THEN
|
||||
(sqlc.narg('cursor_id')::bigint IS NULL) OR
|
||||
(t.id < sqlc.narg('cursor_id')::bigint)
|
||||
|
||||
ELSE true
|
||||
END
|
||||
END
|
||||
|
||||
AND (sqlc.narg('status')::title_status_t IS NULL OR t.title_status = sqlc.narg('status')::title_status_t)
|
||||
AND (
|
||||
CASE
|
||||
WHEN sqlc.narg('word')::text IS NOT NULL THEN
|
||||
(
|
||||
SELECT bool_and(
|
||||
EXISTS (
|
||||
SELECT 1
|
||||
FROM jsonb_each_text(t.title_names) AS t(key, val)
|
||||
WHERE val ILIKE pattern
|
||||
)
|
||||
)
|
||||
FROM unnest(
|
||||
ARRAY(
|
||||
SELECT '%' || trim(w) || '%'
|
||||
FROM unnest(string_to_array(sqlc.narg('word')::text, ' ')) AS w
|
||||
WHERE trim(w) <> ''
|
||||
)
|
||||
) AS pattern
|
||||
)
|
||||
ELSE true
|
||||
END
|
||||
)
|
||||
|
||||
AND (u.status::text IN (sqlc.arg('ongoing')::text, sqlc.arg('planned')::text, sqlc.arg('dropped')::text, sqlc.arg('in-progress')::text))
|
||||
AND (t.title_status::text IN (sqlc.arg('ongoing')::text, sqlc.arg('finished')::text, sqlc.arg('planned')::text))
|
||||
AND (sqlc.narg('rate')::int IS NULL OR u.rate >= sqlc.narg('rate')::int)
|
||||
AND (sqlc.narg('rating')::float IS NULL OR t.rating >= sqlc.narg('rating')::float)
|
||||
AND (sqlc.narg('release_year')::int IS NULL OR t.release_year = sqlc.narg('release_year')::int)
|
||||
AND (sqlc.narg('release_season')::release_season_t IS NULL OR t.release_season = sqlc.narg('release_season')::release_season_t)
|
||||
AND (sqlc.narg('usertitle_status')::usertitle_status_t IS NULL OR u.usertitle_status = sqlc.narg('usertitle_status')::usertitle_status_t)
|
||||
|
||||
GROUP BY
|
||||
t.id, i.id, s.id, si.id
|
||||
|
||||
ORDER BY
|
||||
CASE WHEN sqlc.arg('forward')::boolean THEN
|
||||
CASE
|
||||
WHEN sqlc.arg('sort_by')::text = 'id' THEN t.id
|
||||
WHEN sqlc.arg('sort_by')::text = 'year' THEN t.release_year
|
||||
WHEN sqlc.arg('sort_by')::text = 'rating' THEN t.rating
|
||||
WHEN sqlc.arg('sort_by')::text = 'rate' THEN u.rate
|
||||
END
|
||||
END ASC,
|
||||
CASE WHEN NOT sqlc.arg('forward')::boolean THEN
|
||||
CASE
|
||||
WHEN sqlc.arg('sort_by')::text = 'id' THEN t.id
|
||||
WHEN sqlc.arg('sort_by')::text = 'year' THEN t.release_year
|
||||
WHEN sqlc.arg('sort_by')::text = 'rating' THEN t.rating
|
||||
WHEN sqlc.arg('sort_by')::text = 'rate' THEN u.rate
|
||||
END
|
||||
END DESC,
|
||||
|
||||
CASE WHEN sqlc.arg('sort_by')::text <> 'id' THEN t.id END ASC
|
||||
|
||||
LIMIT COALESCE(sqlc.narg('limit')::int, 100); -- 100 is default limit
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue