-- -- packages/acs-kernel/sql/test/rel-constraints-test.sql -- -- @author oumi@arsdigita.com -- @creation-date 2000-12-02 -- @cvs-id rel-constraints-test.sql,v 1.1.4.1 2001/01/12 23:06:33 oumi Exp -- -- set serveroutput on create table groups_test_groups ( group_id integer, sorder integer, gname varchar(100) ); create table groups_test_users ( user_id integer, sorder integer, uname varchar(100) ); create table groups_test_segs ( seg_id integer, sorder integer, sname varchar(100) ); -- -- procedure rel_constraint_dump_views/0 -- CREATE OR REPLACE FUNCTION rel_constraint_dump_views( ) RETURNS integer AS $$ DECLARE r record; str varchar; BEGIN raise NOTICE 'Contents of view rel_constraints_violated_one:'; str := rpad('constraint_id', 20) || rpad('rel_id', 20) || rpad('name(container_id)',20) || rpad('name(party_id)',20); raise NOTICE '%', str; for r in select * from rel_constraints_violated_one LOOP str := rpad(r.constraint_id, 20) || rpad(r.rel_id, 20) || rpad(acs_object__name(r.container_id), 20) || rpad(acs_object__name(r.party_id), 20); raise NOTICE '%', str; end LOOP; raise NOTICE 'Contents of view rel_constraints_violated_two:'; for r in select * from rel_constraints_violated_two LOOP str := rpad(r.constraint_id, 20) || rpad(r.rel_id, 20) || rpad(acs_object__name(r.container_id), 20) || rpad(acs_object__name(r.party_id), 20); raise NOTICE '%', str; end loop; return null; END; $$ LANGUAGE plpgsql; -- added select define_function_args('rel_constraint_test_check','v_rel_id,expect_violation_p'); -- -- procedure rel_constraint_test_check/2 -- CREATE OR REPLACE FUNCTION rel_constraint_test_check( v_rel_id integer, expect_violation_p char ) RETURNS integer AS $$ DECLARE v_violation_msg varchar(4000); v_violation_p char; v_object_id_one integer; v_object_id_two integer; v_rel_type acs_rels.rel_type%TYPE; str varchar; BEGIN v_violation_p := 'f'; v_violation_msg := rel_constraint__violation(v_rel_id); if v_violation_msg is not null then v_violation_p := 't'; end if; if v_violation_p::char != expect_violation_p::char then select object_id_one, object_id_two, rel_type into v_object_id_one, v_object_id_two, v_rel_type from acs_rels where rel_id = v_rel_id; str := 'Relation ' || acs_object__name(v_rel_id) || ' (' || v_rel_id || ')' || ' failed (violation_p = ' || v_violation_p::varchar || '). ' || 'Rel info: type = ' || v_rel_type || ', object one = ' || acs_object__name(v_object_id_one) || ' (' || v_object_id_one || ')' || ', object two = ' || acs_object__name(v_object_id_two) || ' (' || v_object_id_two || ').'; PERFORM acs_log__error('rel_constraint_test_check', str); raise NOTICE '%', str; raise NOTICE 'Violation Message:'; raise NOTICE '%', v_violation_msg; else raise NOTICE 'passed %', v_rel_id; end if; return null; END; $$ LANGUAGE plpgsql; -- creates blah_member_rel and yippie_member_rel relationships \i rel-segments-test-types-create.sql -- -- procedure test_rel_constraints/0 -- CREATE OR REPLACE FUNCTION test_rel_constraints( ) RETURNS integer AS $$ DECLARE A integer; B integer; C integer; D integer; E integer; F integer; G integer; joe integer; jane integer; bob integer; betty integer; jack integer; jill integer; sven integer; stacy integer; reg_users integer; rel_a integer; rel_b integer; rel_c integer; rel_d integer; rel_e integer; rel_f integer; rel_g integer; rel_id integer; side_one_constraint integer; side_two_constraint integer; v_count integer; r record; BEGIN -- Create the test groups. A := acs_group__new('A'); B := acs_group__new('B'); C := acs_group__new('C'); D := acs_group__new('D'); E := acs_group__new('E'); F := acs_group__new('F'); G := acs_group__new('G'); insert into groups_test_groups values (A,1,'A'); insert into groups_test_groups values (B,2,'B'); insert into groups_test_groups values (C,3,'C'); insert into groups_test_groups values (D,4,'D'); insert into groups_test_groups values (E,5,'E'); insert into groups_test_groups values (F,6,'F'); insert into groups_test_groups values (G,7,'G'); -- Create the test members. joe := acs_user__new('joe@asdf.com','Joe', 'Smith','assword','p'); jane := acs_user__new('jane@asdf.com','Jane', 'Smith','assword','p'); bob := acs_user__new('bob@asdf.com','Bob', 'Smith','assword','p'); betty := acs_user__new('betty@asdf.com','Betty', 'Smith','assword','p'); jack := acs_user__new('jack@asdf.com','Jack', 'Smith','assword','p'); jill := acs_user__new('jill@asdf.com','Jill', 'Smith','assword','p'); sven := acs_user__new('sven@asdf.com','Sven', 'Smith','assword','p'); stacy := acs_user__new('stacy@asdf.com','Stacy', 'Smith','assword','p'); reg_users := acs__magic_object_id('registered_users'); insert into groups_test_users values (joe,1,'joe'); insert into groups_test_users values (jane,2,'jane'); insert into groups_test_users values (bob,3,'bob'); insert into groups_test_users values (betty,4,'betty'); insert into groups_test_users values (jack,5,'jack'); insert into groups_test_users values (jill,6,'jill'); insert into groups_test_users values (sven,7,'sven'); insert into groups_test_users values (stacy,8,'stacy'); insert into groups_test_users values (reg_users,9,'reg_users'); -- Make a couple of compositions. rel_id := composition_rel__new(A, B); rel_id := composition_rel__new(A, C); rel_id := composition_rel__new(A, D); rel_id := composition_rel__new(E, A); rel_id := composition_rel__new(E, F); rel_id := composition_rel__new(reg_users, E); rel_id := composition_rel__new(reg_users, G); -- define a few segments. -- define a few relational constraints. side_two_constraint := rel_constraint__new( null, 'rel_constraint', 'Yippie: side 2 must be a blah of A', rel_segment__get_or_new(reg_users, 'yippie_member_rel', null), 'two', rel_segment__get_or_new(A, 'blah_member_rel', null), null, null, null ); side_one_constraint := rel_constraint__new( null, 'rel_constraint', 'Yippie: side 1 must be a component of E', rel_segment__get_or_new(reg_users, 'yippie_member_rel', null), 'one', rel_segment__get_or_new(E, 'composition_rel', null), null, null, null ); insert into groups_test_segs values (side_two_constraint,1,'side_two_constraint'); insert into groups_test_segs values (side_one_constraint,2,'side_one_constraint'); /* side_two_constraint := rel_constraint__new( null, 'rel_constraint', 'A: side 2 must be a blah of C', rel_segment__get_or_new(A, 'blah_member_rel', null), 'two', rel_segment__get_or_new(C, 'blah_member_rel', null), null, null, null ); side_one_constraint := rel_constraint__new( null, 'rel_constraint', 'E: side 1 must be a component of B', rel_segment__get_or_new(E, 'composition_rel', null), 'one', rel_segment__get_or_new(B, 'composition_rel', null), null, null, null ); insert into groups_test_segs values (side_two_constraint,3,'side_two_constraint 1'); insert into groups_test_segs values (side_one_constraint,4,'side_one_constraint 1'); */ delete from acs_logs; -- Make a couple of memberships. -- LEGAL MEMBERSHIPS: -- textbook case: -- joe is a blah of A, and F is component of E, so its legal to make joe -- a yippie of F. rel_a := blah_member_rel__new(null, 'blah_member_rel', A, joe); rel_b := yippie_member_rel__new(null, 'yippie_member_rel', F, joe); -- do constraints respect group hierarchy? If so, this will be legal: rel_c := blah_member_rel__new(null, 'blah_member_rel', B, jane); rel_d := yippie_member_rel__new(null, 'yippie_member_rel', F, jane); -- ILLEGAL MEMBERSHIPS: -- G is not a component of F, therefore no one can be a yippie of G -- This should violated 2 constraints (object one and object two are both -- invalid). rel_e := yippie_member_rel__new(null, 'yippie_member_rel', G, bob); -- betty is not a blah of A, therefore she cannot be a yippie of F. rel_f := yippie_member_rel__new(null, 'yippie_member_rel', F, betty); -- make sven be a regular member of A. Sven cannot be a yippie of F. rel_id := membership_rel__new(A, sven); rel_g := yippie_member_rel__new(null, 'yippie_member_rel', F, sven); insert into groups_test_segs values (rel_a,3,'a'); insert into groups_test_segs values (rel_b,4,'b'); insert into groups_test_segs values (rel_c,5,'c'); insert into groups_test_segs values (rel_d,6,'d'); insert into groups_test_segs values (rel_e,7,'e'); insert into groups_test_segs values (rel_f,8,'f'); insert into groups_test_segs values (rel_g,9,'g'); return null; END; $$ LANGUAGE plpgsql; -- -- procedure check_rel_constraints/0 -- CREATE OR REPLACE FUNCTION check_rel_constraints( ) RETURNS integer AS $$ DECLARE A integer; B integer; C integer; D integer; E integer; F integer; G integer; joe integer; jane integer; bob integer; betty integer; jack integer; jill integer; sven integer; stacy integer; reg_users integer; rel_a integer; rel_b integer; rel_c integer; rel_d integer; rel_e integer; rel_f integer; rel_g integer; rel_id integer; side_one_constraint integer; side_two_constraint integer; v_count integer; r record; BEGIN select group_id into A from groups_test_groups where gname = 'A'; select group_id into B from groups_test_groups where gname = 'B'; select group_id into C from groups_test_groups where gname = 'C'; select group_id into D from groups_test_groups where gname = 'D'; select group_id into E from groups_test_groups where gname = 'E'; select group_id into F from groups_test_groups where gname = 'F'; select group_id into G from groups_test_groups where gname = 'G'; select user_id into joe from groups_test_users where uname = 'joe'; select user_id into jane from groups_test_users where uname = 'jane'; select user_id into bob from groups_test_users where uname = 'bob'; select user_id into betty from groups_test_users where uname = 'betty'; select user_id into jack from groups_test_users where uname = 'jack'; select user_id into jill from groups_test_users where uname = 'jill'; select user_id into sven from groups_test_users where uname = 'sven'; select user_id into stacy from groups_test_users where uname = 'stacy'; select user_id into reg_users from groups_test_users where uname = 'reg_users'; select seg_id into side_one_constraint from groups_test_segs where sname = 'side_one_constraint'; select seg_id into side_two_constraint from groups_test_segs where sname = 'side_two_constraint'; select seg_id into rel_a from groups_test_segs where sname = 'a'; select seg_id into rel_b from groups_test_segs where sname = 'b'; select seg_id into rel_c from groups_test_segs where sname = 'c'; select seg_id into rel_d from groups_test_segs where sname = 'd'; select seg_id into rel_e from groups_test_segs where sname = 'e'; select seg_id into rel_f from groups_test_segs where sname = 'f'; select seg_id into rel_g from groups_test_segs where sname = 'g'; -- Make a couple of memberships. -- LEGAL MEMBERSHIPS: -- textbook case: -- joe is a blah of A, and F is component of E, so its legal to make joe -- a yippie of F. PERFORM rel_constraint_test_check(rel_a, 'f'); PERFORM rel_constraint_test_check(rel_b, 'f'); -- do constraints respect group hierarchy? If so, this will be legal: PERFORM rel_constraint_test_check(rel_c, 'f'); PERFORM rel_constraint_test_check(rel_d, 'f'); -- ILLEGAL MEMBERSHIPS: -- G is not a component of F, therefore no one can be a yippie of G -- This should violated 2 constraints (object one and object two are both -- invalid). PERFORM rel_constraint_test_check(rel_e, 't'); -- betty is not a blah of A, therefore she cannot be a yippie of F. PERFORM rel_constraint_test_check(rel_f, 't'); -- make sven be a regular member of A. Sven cannot be a yippie of F. PERFORM rel_constraint_test_check(rel_g, 't'); -- TEST THE VIEWS (there should be 4 violated constraints, -- 1 side one violation and 3 side two violations. select count(*) into v_count from rel_constraints_violated_one; if v_count != 1 then raise NOTICE 'rel_constraints_violated_one should have 1 row. Found % rows.', v_count; PERFORM rel_constraint_dump_views(); end if; select count(*) into v_count from rel_constraints_violated_two; if v_count != 3 then raise NOTICE 'rel_constraints_violated_two should have 2 rows. Found % rows.', v_count; PERFORM rel_constraint_dump_views(); end if; -- Remove the constraints PERFORM rel_constraint__delete(side_one_constraint); PERFORM rel_constraint__delete(side_two_constraint); select seg_id into side_one_constraint from groups_test_segs where sname = 'side_one_constraint 1'; select seg_id into side_two_constraint from groups_test_segs where sname = 'side_two_constraint 1'; PERFORM rel_constraint__delete(side_one_constraint); PERFORM rel_constraint__delete(side_two_constraint); -- Remove the test membership relations for r in select * from blah_member_rels LOOP PERFORM blah_member_rel__delete(r.rel_id); end loop; for r in select * from yippie_member_rels LOOP PERFORM yippie_member_rel__delete(r.rel_id); end loop; -- Remove the test segments. PERFORM rel_segment__delete(rel_segment__get(A,'blah_member_rel')); PERFORM rel_segment__delete(rel_segment__get(E,'composition_rel')); PERFORM rel_segment__delete(rel_segment__get(reg_users,'yippie_member_rel')); -- Remove the test groups. PERFORM acs_group__delete(G); PERFORM acs_group__delete(F); PERFORM acs_group__delete(E); PERFORM acs_group__delete(D); PERFORM acs_group__delete(C); PERFORM acs_group__delete(B); PERFORM acs_group__delete(A); -- Remove the test members. PERFORM acs_user__delete(joe); PERFORM acs_user__delete(jane); PERFORM acs_user__delete(bob); PERFORM acs_user__delete(betty); PERFORM acs_user__delete(jack); PERFORM acs_user__delete(jill); PERFORM acs_user__delete(sven); PERFORM acs_user__delete(stacy); return null; END; $$ LANGUAGE plpgsql; select test_rel_constraints(); select check_rel_constraints(); drop function rel_constraint_dump_views(); drop function rel_constraint_test_check (integer, char); drop function test_rel_constraints(); drop function check_rel_constraints(); drop table groups_test_groups; drop table groups_test_users; drop table groups_test_segs; \i rel-segments-test-types-drop.sql select log_level, log_key, message from acs_logs where log_key = 'error';