-- -- composition_rel__check_index/2 -- create or replace function composition_rel__check_index( integer, integer ) returns bool as $$ declare check_index__component_id alias for $1; check_index__container_id alias for $2; result boolean; n_rows integer; dc record; r1 record; r2 record; begin result := 't'; -- Loop through all the direct containers (DC) of COMPONENT_ID -- that are also contained by CONTAINER_ID and verify that the -- GROUP_COMPONENT_INDEX contains the (GROUP_ID, DC.REL_ID, -- CONTAINER_ID) triple. for dc in select r.rel_id, r.object_id_one as container_id from acs_rels r, composition_rels c where r.rel_id = c.rel_id and r.object_id_two = check_index__component_id LOOP if composition_rel__check_path_exists_p(dc.container_id, check_index__container_id) = 't' then select case when count(*) = 0 then 0 else 1 end into n_rows from group_component_index where group_id = check_index__container_id and component_id = check_index__component_id and rel_id = dc.rel_id; if n_rows = 0 then result := 'f'; PERFORM acs_log__error('composition_rel.check_representation', 'Row missing from group_component_index for (' || 'group_id = ' || check_index__container_id || ', ' || 'component_id = ' || check_index__component_id || ', ' || 'rel_id = ' || dc.rel_id || ')'); end if; end if; end loop; -- Loop through all the containers of CONTAINER_ID. for r1 in select r.object_id_one as container_id from acs_rels r, composition_rels c where r.rel_id = c.rel_id and r.object_id_two = check_index__container_id union select check_index__container_id as container_id from dual LOOP -- Loop through all the components of COMPONENT_ID and make a -- recursive call. for r2 in select r.object_id_two as component_id from acs_rels r, composition_rels c where r.rel_id = c.rel_id and r.object_id_one = check_index__component_id union select check_index__component_id as component_id from dual LOOP if (r1.container_id != check_index__container_id or r2.component_id != check_index__component_id) and composition_rel__check_index(r2.component_id, r1.container_id) = 'f' then result := 'f'; end if; end loop; end loop; return result; end;$$ language plpgsql;