-- 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);
