3 -- Replace connectby from the tablefunc extension with CTEs
6 CREATE OR REPLACE FUNCTION permission.grp_ancestors( INT ) RETURNS SETOF permission.grp_tree AS $$
7 WITH RECURSIVE grp_ancestors_distance(id, distance) AS (
10 SELECT ou.parent, ouad.distance+1
11 FROM permission.grp_tree ou JOIN grp_ancestors_distance ouad ON (ou.id = ouad.id)
12 WHERE ou.parent IS NOT NULL
14 SELECT ou.* FROM permission.grp_tree ou JOIN grp_ancestors_distance ouad USING (id) ORDER BY ouad.distance DESC;
15 $$ LANGUAGE SQL ROWS 1;
17 -- Add a utility function to find descendant groups.
19 CREATE OR REPLACE FUNCTION permission.grp_descendants( INT ) RETURNS SETOF permission.grp_tree AS $$
20 WITH RECURSIVE descendant_depth AS (
23 FROM permission.grp_tree gr
28 FROM permission.grp_tree gr
29 JOIN descendant_depth dd ON (dd.id = gr.parent)
30 ) SELECT gr.* FROM permission.grp_tree gr JOIN descendant_depth USING (id);
31 $$ LANGUAGE SQL ROWS 1;
33 -- Add utility functions to work with permission groups as general tree-ish sets.
35 CREATE OR REPLACE FUNCTION permission.grp_tree_full_path ( INT ) RETURNS SETOF permission.grp_tree AS $$
37 FROM permission.grp_ancestors($1)
40 FROM permission.grp_descendants($1);
41 $$ LANGUAGE SQL STABLE ROWS 1;
43 CREATE OR REPLACE FUNCTION permission.grp_tree_combined_ancestors ( INT, INT ) RETURNS SETOF permission.grp_tree AS $$
45 FROM permission.grp_ancestors($1)
48 FROM permission.grp_ancestors($2);
49 $$ LANGUAGE SQL STABLE ROWS 1;
51 CREATE OR REPLACE FUNCTION permission.grp_tree_common_ancestors ( INT, INT ) RETURNS SETOF permission.grp_tree AS $$
53 FROM permission.grp_ancestors($1)
56 FROM permission.grp_ancestors($2);
57 $$ LANGUAGE SQL STABLE ROWS 1;