-- Materialized View: public.v_categorytree DO $$ BEGIN DROP MATERIALIZED VIEW IF EXISTS public.v_categorytree; EXCEPTION WHEN others THEN RAISE NOTICE 'Materialized view does not exist'; END; $$; DO $$ BEGIN DROP VIEW IF EXISTS public.v_categorytree; EXCEPTION WHEN others THEN RAISE NOTICE 'View does not exist'; END; $$; CREATE MATERIALIZED VIEW public.v_categorytree AS SELECT c.id, c.name, ( SELECT array_to_string(array_agg(main.parent_name), '/'::text) AS path FROM ( SELECT node.id, parent.name AS parent_name FROM categories node, categories parent WHERE node.lft >= parent.lft AND node.lft <= parent.rgt AND node.id = c.id ORDER BY parent.lft) main GROUP BY main.id) AS path, ( SELECT array_to_string(array_agg(main.parent_id), '/'::text) AS path FROM ( SELECT node.id, parent.id AS parent_id FROM categories node, categories parent WHERE node.lft >= parent.lft AND node.lft <= parent.rgt AND node.id = c.id ORDER BY parent.lft) main GROUP BY main.id) AS path_numeric, CASE c.rgt - c.lft WHEN 1 THEN 1 ELSE 0 END AS is_leaf, ( SELECT count(*) - 1 FROM categories node, categories parent WHERE node.lft >= parent.lft AND node.lft <= parent.rgt AND node.id = c.id) AS depth, ( SELECT count(*) - 1 FROM categories c1 WHERE c1.lft >= c.lft AND c1.lft <= c.rgt) AS child_count, c.lft, c.rgt FROM categories c ORDER BY c.lft WITH DATA; GRANT ALL ON TABLE v_categorytree TO photowall; -- Index: public.v_categorytree_key -- DROP INDEX public.v_categorytree_key; CREATE UNIQUE INDEX v_categorytree_key ON public.v_categorytree USING btree (id);