You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
50 lines
1.6 KiB
JavaScript
50 lines
1.6 KiB
JavaScript
// Testcase from ThePendulum
|
|
|
|
// Building must contain any of the specified people
|
|
select("buildings", [
|
|
define("tenants", has("tenants.building_id")),
|
|
where({ tenants: { name: anyOf([ "james", "luke", "stanley" ]) } })
|
|
])
|
|
|
|
|
|
// Building must contain *all* of the specified people, and optionally others
|
|
select("buildings", [
|
|
define("tenants", has("tenants.building_id")),
|
|
where({ tenants: { name: allOf([ "james", "luke", "stanley" ]) } })
|
|
])
|
|
|
|
// Additional testcase: Building must contain *only* the specified people
|
|
|
|
|
|
// Related code:
|
|
/* GraphQL/Postgraphile 'every' applies to the data, will only include scenes for which every assigned tag is selected,
|
|
instead of what we want; scenes with every selected tag, but possibly also some others */
|
|
CREATE FUNCTION actors_scenes(actor actors, selected_tags text[], mode text DEFAULT 'all') RETURNS SETOF releases AS $$
|
|
SELECT releases.*
|
|
FROM releases
|
|
LEFT JOIN
|
|
releases_actors ON releases_actors.release_id = releases.id
|
|
LEFT JOIN
|
|
releases_tags ON releases_tags.release_id = releases.id
|
|
LEFT JOIN
|
|
tags ON tags.id = releases_tags.tag_id
|
|
WHERE releases_actors.actor_id = actor.id
|
|
AND CASE
|
|
/* match at least one of the selected tags */
|
|
WHEN mode = 'any' AND array_length(selected_tags, 1) > 0
|
|
THEN tags.slug = ANY(selected_tags)
|
|
ELSE true
|
|
END
|
|
GROUP BY releases.id
|
|
HAVING CASE
|
|
/* match all of the selected tags */
|
|
WHEN mode = 'all' AND array_length(selected_tags, 1) > 0
|
|
THEN COUNT(
|
|
CASE WHEN tags.slug = ANY(selected_tags)
|
|
THEN true
|
|
END
|
|
) = array_length(selected_tags, 1)
|
|
ELSE true
|
|
END;
|
|
$$ LANGUAGE SQL STABLE;
|