Skip to content

Instantly share code, notes, and snippets.

@coorasse
Created July 7, 2018 13:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save coorasse/6324cbf8773260ea46195febbe45ab50 to your computer and use it in GitHub Desktop.
Save coorasse/6324cbf8773260ea46195febbe45ab50 to your computer and use it in GitHub Desktop.
cancancan with union
-- execution time: 74ms
SELECT DISTINCT proposals.*
FROM (SELECT "proposals".*
FROM "proposals"
WHERE "proposals"."private" = 'f'
UNION SELECT "proposals".*
FROM "proposals"
WHERE "proposals"."visible_outside" = 't'
UNION SELECT "proposals".*
FROM "proposals"
INNER JOIN "group_proposals" ON "group_proposals"."proposal_id" = "proposals"."id"
INNER JOIN "groups" ON "groups"."id" = "group_proposals"."group_id"
INNER JOIN "group_participations" ON "group_participations"."group_id" = "groups"."id"
INNER JOIN "participation_roles"
ON "participation_roles"."id" = "group_participations"."participation_role_id"
WHERE "group_participations"."user_id" = 55 AND "participation_roles"."view_proposals" = 't'
UNION SELECT "proposals".*
FROM "proposals"
INNER JOIN "area_proposals" ON "area_proposals"."proposal_id" = "proposals"."id"
INNER JOIN "group_areas" ON "group_areas"."id" = "area_proposals"."group_area_id"
INNER JOIN "area_participations" ON "area_participations"."group_area_id" = "group_areas"."id"
INNER JOIN "area_roles" ON "area_roles"."id" = "area_participations"."area_role_id"
WHERE "area_participations"."user_id" = 55 AND "area_roles"."view_proposals" = 't'
UNION SELECT "proposals".*
FROM "proposals"
INNER JOIN "group_proposals" ON "group_proposals"."proposal_id" = "proposals"."id"
INNER JOIN "groups" ON "groups"."id" = "group_proposals"."group_id"
INNER JOIN "group_participations" ON "group_participations"."group_id" = "groups"."id"
WHERE "group_participations"."user_id" = 55 AND "group_participations"."participation_role_id" = 2
UNION SELECT "proposals".*
FROM "proposals" EXCEPT SELECT "proposals".*
FROM "proposals"
WHERE "proposals"."private" = 't' AND "proposals"."visible_outside" = 'f' AND
"proposals"."area_private" = 't') AS proposals;
-- execution time: ~1 minute
SELECT DISTINCT proposals.*
FROM "proposals"
LEFT OUTER JOIN "group_proposals" ON "group_proposals"."proposal_id" = "proposals"."id"
LEFT OUTER JOIN "groups" ON "group_proposals"."group_id" = "groups"."id"
LEFT OUTER JOIN "group_participations" ON "group_participations"."group_id" = "groups"."id"
LEFT OUTER JOIN "area_proposals" ON "area_proposals"."proposal_id" = "proposals"."id"
LEFT OUTER JOIN "group_areas" ON "area_proposals"."group_area_id" = "group_areas"."id"
LEFT OUTER JOIN "area_participations" ON "area_participations"."group_area_id" = "group_areas"."id"
LEFT OUTER JOIN "area_roles" ON "area_participations"."area_role_id" = "area_roles"."id"
LEFT OUTER JOIN "participation_roles" ON "group_participations"."participation_role_id" = "participation_roles"."id"
WHERE
(("group_participations"."user_id" = 676 AND "group_participations"."participation_role_id" = 2) OR
(("area_participations"."user_id" = 676 AND "area_roles"."view_proposals" = 't') OR
(NOT ("proposals"."private" = 't' AND "proposals"."visible_outside" = 'f' AND "proposals"."area_private" = 't')
AND (("group_participations"."user_id" = 676 AND "participation_roles"."view_proposals" = 't') OR
(("proposals"."visible_outside" = 't') OR ("proposals"."private" = 'f'))))));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment