64 lines
1.9 KiB
SQL
64 lines
1.9 KiB
SQL
-- 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);
|