-- -- content_item__is_valid_child/2 -- create or replace function content_item__is_valid_child( is_valid_child__item_id integer, is_valid_child__content_type character varying ) returns bool as $$ -- -- variant without relation_tag -- DECLARE v_is_valid_child boolean; v_max_children cr_type_children.max_n%TYPE; v_n_children integer; BEGIN v_is_valid_child := 'f'; -- first check if content_type is a registered child_type select sum(max_n) into v_max_children from cr_type_children where parent_type = content_item__get_content_type(is_valid_child__item_id) and child_type = is_valid_child__content_type; if NOT FOUND then return 'f'; end if; -- if the max is null then infinite number is allowed if v_max_children is null then return 't'; end if; -- next check if there are already max_n children of that content type select count(item_id) into v_n_children from cr_items where parent_id = is_valid_child__item_id and content_item__get_content_type(child_id) = is_valid_child__content_type; if NOT FOUND then return 'f'; end if; if v_n_children < v_max_children then v_is_valid_child := 't'; end if; return v_is_valid_child; END; $$ language plpgsql; -- -- content_item__is_valid_child/3 -- create or replace function content_item__is_valid_child( is_valid_child__item_id integer, is_valid_child__content_type character varying, is_valid_child__relation_tag character varying ) returns bool as $$ DECLARE v_is_valid_child boolean; v_max_children cr_type_children.max_n%TYPE; v_n_children integer; v_null_exists boolean; BEGIN v_is_valid_child := 'f'; -- first check if content_type is a registered child_type select sum(max_n) into v_max_children from cr_type_children where parent_type = content_item__get_content_type(is_valid_child__item_id) and child_type = is_valid_child__content_type and (is_valid_child__relation_tag is null or is_valid_child__relation_tag = relation_tag); if NOT FOUND then return 'f'; end if; -- if the max is null then infinite number is allowed if v_max_children is null then return 't'; end if; -- -- Next check if there are already max_n children of that content type. -- Use cr_child_rels only, when a non-null relation_tag is provided. -- if is_valid_child__relation_tag is null then select count(item_id) into v_n_children from cr_items where parent_id = is_valid_child__item_id and content_item__get_content_type(child_id) = is_valid_child__content_type; else select count(rel_id) into v_n_children from cr_child_rels where parent_id = is_valid_child__item_id and content_item__get_content_type(child_id) = is_valid_child__content_type and is_valid_child__relation_tag = relation_tag; end if; if NOT FOUND then return 'f'; end if; if v_n_children < v_max_children then v_is_valid_child := 't'; end if; return v_is_valid_child; END; $$ language plpgsql;