Index: openacs-4/packages/acs-kernel/acs-kernel.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/acs-kernel.info,v diff -u -r1.136.2.20 -r1.136.2.21 --- openacs-4/packages/acs-kernel/acs-kernel.info 31 Aug 2016 10:55:14 -0000 1.136.2.20 +++ openacs-4/packages/acs-kernel/acs-kernel.info 31 Aug 2016 18:57:41 -0000 1.136.2.21 @@ -9,15 +9,15 @@ f t - + OpenACS Core Team Routines and data models providing the foundation for OpenACS-based Web services. 2016-07-05 OpenACS The OpenACS kernel contains the core datamodel create and drop scripts for such things as objects, groups, partiies and the supporting PL/SQL and PL/pgSQL procedures. 3 - + Index: openacs-4/packages/acs-kernel/sql/oracle/acs-relationships-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/acs-relationships-create.sql,v diff -u -r1.14 -r1.14.8.1 --- openacs-4/packages/acs-kernel/sql/oracle/acs-relationships-create.sql 6 Jan 2010 20:07:24 -0000 1.14 +++ openacs-4/packages/acs-kernel/sql/oracle/acs-relationships-create.sql 31 Aug 2016 18:57:41 -0000 1.14.8.1 @@ -52,6 +52,7 @@ max_n_rels_two integer constraint acs_rel_types_max_n_2_ck check (max_n_rels_two >= 0), + composable_p boolean default 't' not null, constraint acs_rel_types_n_rels_one_ck check (min_n_rels_one <= max_n_rels_one), constraint acs_rel_types_n_rels_two_ck Index: openacs-4/packages/acs-kernel/sql/oracle/groups-body-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/groups-body-create.sql,v diff -u -r1.17.10.1 -r1.17.10.2 --- openacs-4/packages/acs-kernel/sql/oracle/groups-body-create.sql 1 Jul 2016 14:04:39 -0000 1.17.10.1 +++ openacs-4/packages/acs-kernel/sql/oracle/groups-body-create.sql 31 Aug 2016 18:57:41 -0000 1.17.10.2 @@ -50,9 +50,10 @@ raise_application_error(-20000,v_error); end if; - select object_id_one, object_id_two, rel_type + select object_id_one, object_id_two, r.rel_type, composable_p into v_object_id_one, v_object_id_two, v_rel_type - from acs_rels + from acs_rels r + join acs_rel_types t on (r.rel_type = t.rel_type) where rel_id = :new.rel_id; -- Insert a row for me in the group_member_index. @@ -67,23 +68,25 @@ party_approved_member.add(v_object_id_one, v_object_id_two, v_rel_type); end if; - -- For all groups of which I am a component, insert a - -- row in the group_member_index. - for map in (select distinct group_id - from group_component_map - where component_id = v_object_id_one) loop - insert into group_element_index - (group_id, element_id, rel_id, container_id, - rel_type, ancestor_rel_type) - values - (map.group_id, v_object_id_two, :new.rel_id, v_object_id_one, - v_rel_type, 'membership_rel'); + if v_composable_p = 't' then + -- For all groups of which I am a component, insert a + -- row in the group_member_index. + for map in (select distinct group_id + from group_component_map + where component_id = v_object_id_one) loop + insert into group_element_index + (group_id, element_id, rel_id, container_id, + rel_type, ancestor_rel_type) + values + (map.group_id, v_object_id_two, :new.rel_id, v_object_id_one, + v_rel_type, 'membership_rel'); - if :new.member_state = 'approved' then - party_approved_member.add(map.group_id, v_object_id_two, v_rel_type); - end if; + if :new.member_state = 'approved' then + party_approved_member.add(map.group_id, v_object_id_two, v_rel_type); + end if; - end loop; + end loop; + end if; end; / show errors @@ -157,23 +160,25 @@ party_approved_member.add(v_object_id_one, members.member_id, members.rel_type); end loop; - -- Make my elements be elements of my new composite group + -- Make my composable elements be elements of my new composite group insert into group_element_index (group_id, element_id, rel_id, container_id, rel_type, ancestor_rel_type) select distinct v_object_id_one, element_id, rel_id, container_id, - rel_type, ancestor_rel_type + m.rel_type, ancestor_rel_type from group_element_map m + join acs_rel_types t on (m.rel_type = t.rel_type) where group_id = v_object_id_two + and t.composable_p = 't' and not exists (select 1 from group_element_map where group_id = v_object_id_one and element_id = m.element_id and rel_id = m.rel_id); -- For all direct or indirect containers of my new composite group, - -- add me and add my elements + -- add me and add my composable elements for map in (select distinct group_id from group_component_map where component_id = v_object_id_one) loop @@ -186,11 +191,13 @@ (map.group_id, v_object_id_two, :new.rel_id, v_object_id_one, v_rel_type, 'composition_rel'); - -- Add rows for my elements + -- Add rows for my composable elements for members in (select distinct member_id, rel_type from group_approved_member_map m + join acs_rel_types t on (m.rel_type = t.rel_type) where group_id = v_object_id_two + and t.composable_p = 't' and not exists (select 1 from group_element_map where group_id = map.group_id @@ -207,7 +214,9 @@ map.group_id, element_id, rel_id, container_id, rel_type, ancestor_rel_type from group_element_map m + join acs_rel_types t on (m.rel_type = t.rel_type) where group_id = v_object_id_two + and t.composable_p = 't' and not exists (select 1 from group_element_map where group_id = map.group_id Index: openacs-4/packages/acs-kernel/sql/oracle/groups-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/groups-create.sql,v diff -u -r1.12 -r1.12.10.1 --- openacs-4/packages/acs-kernel/sql/oracle/groups-create.sql 8 Sep 2008 20:05:17 -0000 1.12 +++ openacs-4/packages/acs-kernel/sql/oracle/groups-create.sql 31 Aug 2016 18:57:41 -0000 1.12.10.1 @@ -89,7 +89,8 @@ object_type_one => 'group', role_one => 'composite', min_n_rels_one => 0, max_n_rels_one => null, object_type_two => 'group', role_two => 'component', - min_n_rels_two => 0, max_n_rels_two => null + min_n_rels_two => 0, max_n_rels_two => null, + composable_p => 't' ); -- @@ -107,7 +108,8 @@ object_type_one => 'group', min_n_rels_one => 0, max_n_rels_one => null, object_type_two => 'person', role_two => 'member', - min_n_rels_two => 0, max_n_rels_two => null + min_n_rels_two => 0, max_n_rels_two => null, + composable_p => 't' ); acs_rel_type.create_role ('admin', 'Administrator', 'Administrators'); @@ -123,7 +125,8 @@ object_type_one => 'group', min_n_rels_one => 0, max_n_rels_one => null, object_type_two => 'person', role_two => 'admin', - min_n_rels_two => 0, max_n_rels_two => null + min_n_rels_two => 0, max_n_rels_two => null, + composable_p => 'f' ); commit; Index: openacs-4/packages/acs-kernel/sql/oracle/test/rel-segments-test-types-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/oracle/test/rel-segments-test-types-create.sql,v diff -u -r1.2 -r1.2.24.1 --- openacs-4/packages/acs-kernel/sql/oracle/test/rel-segments-test-types-create.sql 30 Sep 2003 12:10:02 -0000 1.2 +++ openacs-4/packages/acs-kernel/sql/oracle/test/rel-segments-test-types-create.sql 31 Aug 2016 18:57:41 -0000 1.2.24.1 @@ -10,7 +10,8 @@ object_type_one => 'group', min_n_rels_one => 0, max_n_rels_one => null, object_type_two => 'party', role_two => 'member', - min_n_rels_two => 0, max_n_rels_two => null + min_n_rels_two => 0, max_n_rels_two => null, + composable_p => 't' ); @@ -25,7 +26,8 @@ object_type_one => 'group', min_n_rels_one => 0, max_n_rels_one => null, object_type_two => 'party', role_two => 'member', - min_n_rels_two => 0, max_n_rels_two => null + min_n_rels_two => 0, max_n_rels_two => null, + composable_p => 't' ); end; / Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/acs-kernel/sql/oracle/upgrade/upgrade--5.9.1d15-5.9.1d16.sql'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-create.sql,v diff -u -r1.38 -r1.38.4.1 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-create.sql 7 Jul 2011 10:46:01 -0000 1.38 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-create.sql 31 Aug 2016 18:57:41 -0000 1.38.4.1 @@ -13,13 +13,68 @@ references acs_objects(object_id) ); -comment on table acs_magic_objects is ' +comment on table acs_magic_objects is $$ This table allows us to provide semantic names for certain special objects like the site-wide organization, and the all users party. -'; +$$; +-- The very first thing we must do is create the security_context_root +-- object. +-- added +select define_function_args('acs__magic_object_id','name'); +-- +-- procedure acs__magic_object_id/1 +-- +CREATE OR REPLACE FUNCTION acs__magic_object_id( + magic_object_id__name varchar +) RETURNS integer AS $$ +DECLARE +BEGIN + return object_id + from acs_magic_objects + where name = magic_object_id__name; +END; +$$ LANGUAGE plpgsql stable strict; + +-- +-- procedure inline_0/0 +-- +CREATE OR REPLACE FUNCTION inline_0( + +) RETURNS integer AS $$ +DECLARE + root_id integer; +BEGIN + + root_id := acs_object__new ( + -4, + 'acs_object', + now(), + null, + null, + null, + 't', + '#acs-kernel.lt_Security_context_root#', + null + ); + + insert into acs_magic_objects + (name, object_id) + values + ('security_context_root', -4); + + return root_id; + +END; +$$ LANGUAGE plpgsql; + +select inline_0(); +drop function inline_0 (); + + + -- added select define_function_args('acs__add_user','user_id;null,object_type;user,creation_date;now(),creation_user;null,creation_ip;null,authority_id,username,email,url;null,first_names,last_name,password,salt,screen_name;null,email_verified_p;t,member_state;approved'); @@ -127,22 +182,7 @@ --- added -select define_function_args('acs__magic_object_id','name'); --- --- procedure acs__magic_object_id/1 --- -CREATE OR REPLACE FUNCTION acs__magic_object_id( - magic_object_id__name varchar -) RETURNS integer AS $$ -DECLARE -BEGIN - return object_id - from acs_magic_objects - where name = magic_object_id__name; -END; -$$ LANGUAGE plpgsql stable strict; -- ****************************************************************** -- * Community Core API @@ -190,51 +230,6 @@ -- Community Core Initialization -- ----------------------------------- --- The very first thing we must do is create the security_context_root --- object. - - - --- --- procedure inline_0/0 --- -CREATE OR REPLACE FUNCTION inline_0( - -) RETURNS integer AS $$ -DECLARE - root_id integer; -BEGIN - - root_id := acs_object__new ( - -4, - 'acs_object', - now(), - null, - null, - null, - 't', - '#acs-kernel.lt_Security_context_root#', - null - ); - - insert into acs_magic_objects - (name, object_id) - values - ('security_context_root', -4); - - - return root_id; - -END; -$$ LANGUAGE plpgsql; - -select inline_0 (); - -drop function inline_0 (); - - --- show errors - begin; -------------------------------------------------------------- @@ -283,6 +278,15 @@ values (0, 'user', '#acs-kernel.Unregistered_Visitor#'); + -- + -- Create an "identity relationship" (needs acs-object 0 and magic object 'unregistered_visitor') + -- + perform acs_object__new(-10, 'relationship'); + insert into acs_rels (rel_id, rel_type, object_id_one, object_id_two) values (-10, 'relationship', 0, 0); + + -- + -- Insert user 0 into parties, persons, users and acs_magic_objects + -- insert into parties (party_id) values @@ -334,12 +338,10 @@ null); return 0; - END; $$ LANGUAGE plpgsql; select inline_2 (); - drop function inline_2 (); @@ -379,12 +381,13 @@ -- Users" group perform composition_rel__new ( - null, + null, -- rel_id 'composition_rel', acs__magic_object_id('the_public'), acs__magic_object_id('registered_users'), - null, - null); + null, -- creation_user + null -- creation_ip + ); return 0; END; Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql,v diff -u -r1.32.4.2 -r1.32.4.3 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql 1 Jul 2016 08:57:55 -0000 1.32.4.2 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql 31 Aug 2016 18:57:41 -0000 1.32.4.3 @@ -48,6 +48,8 @@ max_n_rels_two integer constraint acs_rel_types_max_n_2_ck check (max_n_rels_two >= 0), + composable_p boolean + default 't' not null, constraint acs_rel_types_n_rels_one_ck check (min_n_rels_one <= max_n_rels_one), constraint acs_rel_types_n_rels_two_ck @@ -59,7 +61,7 @@ create index acs_rel_types_objtypetwo_idx on acs_rel_types (object_type_two); create index acs_rel_types_role_two_idx on acs_rel_types (role_two); -comment on table acs_rel_types is ' +comment on table acs_rel_types is $$ Each row in acs_rel_types represents a type of relationship between objects. For example, the following DML statement: @@ -69,17 +71,17 @@ object_type_one, role_one, min_n_rels_one, max_n_rels_one, object_type_two, role_two, min_n_rels_two, max_n_rels_two) values - (''employment'', - ''person'', ''employee'', 0, null, - ''company'', ''employer'', 0, null) + ('employment', + 'person', 'employee', 0, null, + 'company', 'employer', 0, null) defines an "employment" relationship type that can be expressed in in natural language as:
A person may be the employee of zero or more companies, and a company may be the employer of zero or more people.
-'; +$$; @@ -197,11 +199,39 @@ -- procedure create_type --- added -select define_function_args('acs_rel_type__create_type','rel_type,pretty_name,pretty_plural,supertype;relationship,table_name,id_column,package_name,object_type_one,role_one;null,min_n_rels_one,max_n_rels_one,object_type_two,role_two;null,min_n_rels_two,max_n_rels_two'); +-- procedure create_type +-- acs_rel_type__create_type /15 vs. /16 has +-- /15 has no "roles" (one and two), but "type_extension_table" + +-- /16 +-- pos 1-7: same as /15 +-- pos 08: object_type_one (varchar) +-- pos 09: role_one (varchar) +-- pos 10: min_n_rels_one (integer) +-- pos 11: max_n_rels (integer) +-- pos 12: object_type_one (varchar) +-- pos 13: role_two (varchar) +-- pos 14: min_n_rels_two (integer) +-- pos 15: max_n_rels_two (integer) +-- pos 16: composable_p (boolean) + +-- /15 +-- pos 1-7: same as /15 +-- pos 08: type_extension_table (varchar) +-- pos 09: object_type_one (varchar) +-- pos 10: min_n_rels_one (integer) +-- pos 11: max_n_rels (integer) +-- pos 12: object_type_two (varchar) +-- pos 13: min_n_rels_two (integer) +-- pos 14: max_n_rels_two (integer) +-- pos 15: composable_p (boolean) + + +select define_function_args('acs_rel_type__create_type','rel_type,pretty_name,pretty_plural,supertype;relationship,table_name,id_column,package_name,object_type_one,role_one;null,min_n_rels_one,max_n_rels_one,object_type_two,role_two;null,min_n_rels_two,max_n_rels_two,composable_p;t'); + -- --- procedure acs_rel_type__create_type/15 +-- procedure acs_rel_type__create_type/16 -- CREATE OR REPLACE FUNCTION acs_rel_type__create_type( create_type__rel_type varchar, @@ -218,7 +248,8 @@ create_type__object_type_two varchar, create_type__role_two varchar, -- default null create_type__min_n_rels_two integer, - create_type__max_n_rels_two integer + create_type__max_n_rels_two integer, + create_type__composable_p boolean default true ) RETURNS integer AS $$ DECLARE @@ -245,25 +276,26 @@ object_type_one, role_one, min_n_rels_one, max_n_rels_one, object_type_two, role_two, - min_n_rels_two, max_n_rels_two) + min_n_rels_two, max_n_rels_two, + composable_p) values (create_type__rel_type, create_type__object_type_one, create_type__role_one, create_type__min_n_rels_one, create_type__max_n_rels_one, create_type__object_type_two, create_type__role_two, - create_type__min_n_rels_two, create_type__max_n_rels_two); + create_type__min_n_rels_two, create_type__max_n_rels_two, + create_type__composable_p); return 0; END; $$ LANGUAGE plpgsql; --- procedure create_type -- --- procedure acs_rel_type__create_type/14 +-- procedure acs_rel_type__create_type/15 -- CREATE OR REPLACE FUNCTION acs_rel_type__create_type( create_type__rel_type varchar, @@ -279,7 +311,8 @@ create_type__max_n_rels_one integer, create_type__object_type_two varchar, create_type__min_n_rels_two integer, - create_type__max_n_rels_two integer + create_type__max_n_rels_two integer, + create_type__composable_p boolean default true ) RETURNS integer AS $$ DECLARE @@ -308,13 +341,15 @@ object_type_one, role_one, min_n_rels_one, max_n_rels_one, object_type_two, role_two, - min_n_rels_two, max_n_rels_two) + min_n_rels_two, max_n_rels_two, + composable_p) values (create_type__rel_type, create_type__object_type_one, create_type__role_one, create_type__min_n_rels_one, create_type__max_n_rels_one, create_type__object_type_two, create_type__role_two, - create_type__min_n_rels_two, create_type__max_n_rels_two); + create_type__min_n_rels_two, create_type__max_n_rels_two, + create_type__composable_p); return 0; END; @@ -522,9 +557,10 @@ END; $$ LANGUAGE plpgsql; -create trigger acs_rels_in_tr before insert or update on acs_rels -for each row execute procedure acs_rels_in_tr (); + create trigger acs_rels_in_tr before insert or update on acs_rels + for each row execute procedure acs_rels_in_tr (); + -- show errors Index: openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql,v diff -u -r1.35.2.3 -r1.35.2.4 --- openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql 7 Jul 2016 06:12:46 -0000 1.35.2.3 +++ openacs-4/packages/acs-kernel/sql/postgresql/groups-body-create.sql 31 Aug 2016 18:57:41 -0000 1.35.2.4 @@ -32,12 +32,12 @@ -- procedure membership_rels_in_tr/0 -- CREATE OR REPLACE FUNCTION membership_rels_in_tr( - ) RETURNS trigger AS $$ DECLARE v_object_id_one acs_rels.object_id_one%TYPE; v_object_id_two acs_rels.object_id_two%TYPE; v_rel_type acs_rels.rel_type%TYPE; + v_composable_p acs_rel_types.composable_p%TYPE; v_error text; map record; BEGIN @@ -48,9 +48,10 @@ raise EXCEPTION '-20000: %', v_error; end if; - select object_id_one, object_id_two, rel_type - into v_object_id_one, v_object_id_two, v_rel_type - from acs_rels + select object_id_one, object_id_two, r.rel_type, composable_p + into v_object_id_one, v_object_id_two, v_rel_type, v_composable_p + from acs_rels r + join acs_rel_types t on (r.rel_type = t.rel_type) where rel_id = new.rel_id; -- Insert a row for me in the group_element_index. @@ -65,26 +66,29 @@ perform party_approved_member__add(v_object_id_one, v_object_id_two, new.rel_id, v_rel_type); end if; - -- For all groups of which I am a component, insert a - -- row in the group_element_index. - for map in select distinct group_id + -- If this rel_type composable... + if v_composable_p = 't' then + + -- For all groups of which I am a component, insert a + -- row in the group_element_index. + for map in select distinct group_id from group_component_map where component_id = v_object_id_one - loop + loop - insert into group_element_index - (group_id, element_id, rel_id, container_id, - rel_type, ancestor_rel_type) - values - (map.group_id, v_object_id_two, new.rel_id, v_object_id_one, - v_rel_type, 'membership_rel'); + insert into group_element_index + (group_id, element_id, rel_id, container_id, + rel_type, ancestor_rel_type) + values + (map.group_id, v_object_id_two, new.rel_id, v_object_id_one, + v_rel_type, 'membership_rel'); - if new.member_state = 'approved' then - perform party_approved_member__add(map.group_id, v_object_id_two, new.rel_id, v_rel_type); - end if; + if new.member_state = 'approved' then + perform party_approved_member__add(map.group_id, v_object_id_two, new.rel_id, v_rel_type); + end if; - end loop; - + end loop; + end if; return new; END; @@ -214,15 +218,17 @@ and element_id = m.member_id and rel_id = m.rel_id); - -- Make my elements be elements of my new composite group + -- Make my composable elements be elements of my new composite group insert into group_element_index (group_id, element_id, rel_id, container_id, rel_type, ancestor_rel_type) select distinct v_object_id_one, element_id, rel_id, container_id, - rel_type, ancestor_rel_type + m.rel_type, ancestor_rel_type from group_element_map m + join acs_rel_types t on (m.rel_type = t.rel_type) where group_id = v_object_id_two + and t.composable_p = 't' and not exists (select 1 from group_element_map where group_id = v_object_id_one @@ -247,25 +253,29 @@ -- Add to party_approved_member_map - perform party_approved_member__add(map.group_id, member_id, rel_id, rel_type) + perform party_approved_member__add(map.group_id, member_id, rel_id, m.rel_type) from group_approved_member_map m + join acs_rel_types t on (m.rel_type = t.rel_type) where group_id = v_object_id_two + and t.composable_p = 't' and not exists (select 1 from group_element_map where group_id = map.group_id and element_id = m.member_id and rel_id = m.rel_id); - -- Add rows for my elements + -- Add rows for my composable elements insert into group_element_index (group_id, element_id, rel_id, container_id, rel_type, ancestor_rel_type) select distinct map.group_id, element_id, rel_id, container_id, - rel_type, ancestor_rel_type + m.rel_type, ancestor_rel_type from group_element_map m + join acs_rel_types t on (m.rel_type = t.rel_type) where group_id = v_object_id_two + and t.composable_p = 't' and not exists (select 1 from group_element_map where group_id = map.group_id @@ -413,6 +423,7 @@ DECLARE v_rel_id integer; BEGIN + raise NOTICE 'composition_rel__new one % two %', object_id_one, object_id_two; v_rel_id := acs_rel__new ( new__rel_id, rel_type, Index: openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql,v diff -u -r1.28.4.1 -r1.28.4.2 --- openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql 1 Jul 2016 08:57:55 -0000 1.28.4.1 +++ openacs-4/packages/acs-kernel/sql/postgresql/groups-create.sql 31 Aug 2016 18:57:41 -0000 1.28.4.2 @@ -108,7 +108,8 @@ 'group', 'component', 0, - null + null, + 't' ); @@ -132,7 +133,8 @@ 'person', -- object_type_two 'member', -- role_two 0, -- min_n_rels_two - null -- max_n_rels_two + null, -- max_n_rels_two + 't' ); -- @@ -155,7 +157,8 @@ 'person', -- object_type_two 'admin', -- role_two 0, -- min_n_rels_two - null -- max_n_rels_two + null, -- max_n_rels_two + false -- composable_p ); return 0; @@ -317,13 +320,13 @@ -- create index group_elem_idx_container_idx on group_element_index (container_id); -comment on table group_element_index is ' +comment on table group_element_index is $$ This table is for internal use by the parties system. It as an auxiliary table, a denormalization of data, that is used to improve performance. Do not query on this table or insert into it. Query on group_element_map - instead. And insert by using the API''s for membership_rel, composition_rel, + instead. And insert by using the API's for membership_rel, composition_rel, or some sub-type of those relationship types. -'; +$$; -- ease life of syntax high-lighter ' ----------- Index: openacs-4/packages/acs-kernel/sql/postgresql/postgresql.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/postgresql.sql,v diff -u -r1.48.2.4 -r1.48.2.5 --- openacs-4/packages/acs-kernel/sql/postgresql/postgresql.sql 1 Jul 2016 04:44:17 -0000 1.48.2.4 +++ openacs-4/packages/acs-kernel/sql/postgresql/postgresql.sql 31 Aug 2016 18:57:41 -0000 1.48.2.5 @@ -771,9 +771,6 @@ -- that acs_objects will become HUGE on real systems the resulting sequential scan would cripple -- performance. --- WARNING: subselects in where clauses that call this function and join on an outer table appear --- to reliably kill PG 7.1.2, at least if "exists" is involved. PG 7.2 doesn''t die on my test --- case, so it appears to have been fixed. create or replace function tree_ancestor_keys(varbit) returns setof varbit as $$ select tree_ancestor_keys($1, 1) Index: openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql,v diff -u -r1.16.2.1 -r1.16.2.2 --- openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql 1 Jul 2016 04:44:17 -0000 1.16.2.1 +++ openacs-4/packages/acs-kernel/sql/postgresql/rel-segments-create.sql 31 Aug 2016 18:57:41 -0000 1.16.2.2 @@ -185,13 +185,10 @@ -- Helper functions to maintain the materialized party_approved_member_map. --- --- Create an "identity relationship" --- -select acs_object__new(-10, 'relationship') from dual; -insert into acs_rels (rel_id, rel_type, object_id_one, object_id_two) values (-10, 'relationship', 0, 0); + + select define_function_args('party_approved_member__add_one','party_id,member_id,rel_id'); -- @@ -333,8 +330,8 @@ END; $$ LANGUAGE plpgsql; -create trigger parties_in_tr after insert on parties -for each row execute procedure parties_in_tr (); + create trigger parties_in_tr after insert on parties + for each row execute procedure parties_in_tr (); CREATE OR REPLACE FUNCTION parties_del_tr () RETURNS trigger AS $$ BEGIN Index: openacs-4/packages/acs-kernel/sql/postgresql/test/rel-segments-test-types-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/test/rel-segments-test-types-create.sql,v diff -u -r1.3 -r1.3.4.1 --- openacs-4/packages/acs-kernel/sql/postgresql/test/rel-segments-test-types-create.sql 7 Jul 2011 10:46:02 -0000 1.3 +++ openacs-4/packages/acs-kernel/sql/postgresql/test/rel-segments-test-types-create.sql 31 Aug 2016 18:57:41 -0000 1.3.4.1 @@ -16,7 +16,8 @@ 'party', 'member', 0, - null + null, + 't' ); @@ -35,7 +36,8 @@ 'party', 'member', 0, - null + null, + 't' ); return null; Fisheye: Tag 1.1 refers to a dead (removed) revision in file `openacs-4/packages/acs-kernel/sql/postgresql/upgrade/upgrade-5.9.1d15-5.9.1d16.sql'. Fisheye: No comparison available. Pass `N' to diff? Index: openacs-4/packages/acs-kernel/sql/test/rel-segments-test-types-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/test/rel-segments-test-types-create.sql,v diff -u -r1.4 -r1.4.4.1 --- openacs-4/packages/acs-kernel/sql/test/rel-segments-test-types-create.sql 30 Mar 2013 19:32:40 -0000 1.4 +++ openacs-4/packages/acs-kernel/sql/test/rel-segments-test-types-create.sql 31 Aug 2016 18:57:41 -0000 1.4.4.1 @@ -12,11 +12,12 @@ 'group', null, 0, - null, + null::integer, 'party', 'member', 0, - null + null::integer, + 'f' ); @@ -31,11 +32,12 @@ 'group', null, 0, - null, + null::integer, 'party', 'member', 0, - null + null::integer, + 'f' ); return null; Index: openacs-4/packages/acs-subsite/acs-subsite.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/acs-subsite.info,v diff -u -r1.117.2.20 -r1.117.2.21 --- openacs-4/packages/acs-subsite/acs-subsite.info 6 Jul 2016 13:47:03 -0000 1.117.2.20 +++ openacs-4/packages/acs-subsite/acs-subsite.info 31 Aug 2016 18:57:41 -0000 1.117.2.21 @@ -9,7 +9,7 @@ t t - + OpenACS Subsite 2015-10-04 @@ -18,10 +18,10 @@ GPL 3 - + - + Index: openacs-4/packages/acs-subsite/sql/oracle/email-image.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/sql/oracle/email-image.sql,v diff -u -r1.2 -r1.2.14.1 --- openacs-4/packages/acs-subsite/sql/oracle/email-image.sql 26 Sep 2006 15:19:56 -0000 1.2 +++ openacs-4/packages/acs-subsite/sql/oracle/email-image.sql 31 Aug 2016 18:57:41 -0000 1.2.14.1 @@ -26,7 +26,8 @@ max_n_rels_one => 1, object_type_two => 'content_item', min_n_rels_two => 0, - max_n_rels_two => 1 + max_n_rels_two => 1, + composable_p => 'f' ); commit; Index: openacs-4/packages/acs-subsite/sql/oracle/portraits.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/sql/oracle/portraits.sql,v diff -u -r1.2 -r1.2.14.1 --- openacs-4/packages/acs-subsite/sql/oracle/portraits.sql 26 Sep 2006 15:19:56 -0000 1.2 +++ openacs-4/packages/acs-subsite/sql/oracle/portraits.sql 31 Aug 2016 18:57:41 -0000 1.2.14.1 @@ -29,7 +29,8 @@ max_n_rels_one => 1, object_type_two => 'content_item', min_n_rels_two => 0, - max_n_rels_two => 1 + max_n_rels_two => 1, + composable_p => 'f' ); commit; Index: openacs-4/packages/acs-subsite/sql/oracle/user-profiles-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/sql/oracle/user-profiles-create.sql,v diff -u -r1.3 -r1.3.22.1 --- openacs-4/packages/acs-subsite/sql/oracle/user-profiles-create.sql 26 Jan 2004 15:39:46 -0000 1.3 +++ openacs-4/packages/acs-subsite/sql/oracle/user-profiles-create.sql 31 Aug 2016 18:57:41 -0000 1.3.22.1 @@ -35,7 +35,8 @@ object_type_two => 'user', role_two => 'user', min_n_rels_two => 0, - max_n_rels_two => null + max_n_rels_two => null, + composable_p => 'f' ); end; Index: openacs-4/packages/acs-subsite/sql/postgresql/email-image.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/sql/postgresql/email-image.sql,v diff -u -r1.4 -r1.4.2.1 --- openacs-4/packages/acs-subsite/sql/postgresql/email-image.sql 27 Oct 2014 16:39:45 -0000 1.4 +++ openacs-4/packages/acs-subsite/sql/postgresql/email-image.sql 31 Aug 2016 18:57:41 -0000 1.4.2.1 @@ -28,7 +28,8 @@ 'content_item', null, 0, - 1 + 1, + 'f' ); return 0; Index: openacs-4/packages/acs-subsite/sql/postgresql/portraits.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/sql/postgresql/portraits.sql,v diff -u -r1.5 -r1.5.4.1 --- openacs-4/packages/acs-subsite/sql/postgresql/portraits.sql 30 Mar 2013 18:04:20 -0000 1.5 +++ openacs-4/packages/acs-subsite/sql/postgresql/portraits.sql 31 Aug 2016 18:57:41 -0000 1.5.4.1 @@ -57,7 +57,8 @@ 'content_item', null, 0, - 1 + 1, + 'f' ); return 0; Index: openacs-4/packages/acs-subsite/sql/postgresql/user-profiles-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/sql/postgresql/user-profiles-create.sql,v diff -u -r1.7 -r1.7.4.1 --- openacs-4/packages/acs-subsite/sql/postgresql/user-profiles-create.sql 30 Mar 2013 18:04:20 -0000 1.7 +++ openacs-4/packages/acs-subsite/sql/postgresql/user-profiles-create.sql 31 Aug 2016 18:57:41 -0000 1.7.4.1 @@ -65,7 +65,8 @@ 'user', 'user', 0, - null + null, + 'f' ); return 0; Index: openacs-4/packages/acs-subsite/tcl/rel-types-procs-oracle.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/tcl/rel-types-procs-oracle.xql,v diff -u -r1.3.14.2 -r1.3.14.3 --- openacs-4/packages/acs-subsite/tcl/rel-types-procs-oracle.xql 2 Jan 2016 12:42:03 -0000 1.3.14.2 +++ openacs-4/packages/acs-subsite/tcl/rel-types-procs-oracle.xql 31 Aug 2016 18:57:41 -0000 1.3.14.3 @@ -27,7 +27,8 @@ object_type_two => :object_type_two, role_two => :role_two, min_n_rels_two => :min_n_rels_two, - max_n_rels_two => :max_n_rels_two + max_n_rels_two => :max_n_rels_two, + composable_p => :composable_p ); end; Index: openacs-4/packages/acs-subsite/tcl/rel-types-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/tcl/rel-types-procs-postgresql.xql,v diff -u -r1.8.14.2 -r1.8.14.3 --- openacs-4/packages/acs-subsite/tcl/rel-types-procs-postgresql.xql 2 Jan 2016 12:42:04 -0000 1.8.14.2 +++ openacs-4/packages/acs-subsite/tcl/rel-types-procs-postgresql.xql 31 Aug 2016 18:57:41 -0000 1.8.14.3 @@ -53,7 +53,8 @@ :object_type_two, :role_two, :min_n_rels_two, - :max_n_rels_two + :max_n_rels_two, + :composable_p ); Index: openacs-4/packages/acs-subsite/tcl/rel-types-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/tcl/rel-types-procs.tcl,v diff -u -r1.11.2.4 -r1.11.2.5 --- openacs-4/packages/acs-subsite/tcl/rel-types-procs.tcl 2 Jan 2016 12:42:04 -0000 1.11.2.4 +++ openacs-4/packages/acs-subsite/tcl/rel-types-procs.tcl 31 Aug 2016 18:57:41 -0000 1.11.2.5 @@ -92,6 +92,7 @@ object_type_two min_n_rels_two max_n_rels_two + {composable_p "t"} } { Creates a new relationship type named rel_type Index: openacs-4/packages/acs-subsite/tcl/test/acs-subsite-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/tcl/test/acs-subsite-procs.tcl,v diff -u -r1.7.2.1 -r1.7.2.2 --- openacs-4/packages/acs-subsite/tcl/test/acs-subsite-procs.tcl 10 Sep 2015 08:21:37 -0000 1.7.2.1 +++ openacs-4/packages/acs-subsite/tcl/test/acs-subsite-procs.tcl 31 Aug 2016 18:57:41 -0000 1.7.2.2 @@ -105,6 +105,88 @@ and a.name = 'the_pubic'" -default 0] 0 } + +aa_register_case -cats smoke acs_subsite_check_composite_group { + Build a 3-level hierachy of composite groups and check memberships. This test case covers the membership and composition rel insertion triggers and composability of basic membership and admin rels. + + @author Michael Steigman +} { + + aa_run_with_teardown \ + -rollback \ + -test_code { + + db_transaction { + # create groups and relate them to one another + set level_1_group [group::new -group_name "Level 1 Group"] + set level_2_group [group::new -group_name "Level 2 Group"] + relation_add composition_rel $level_1_group $level_2_group + + array set user_1 [auth::create_user \ + -username "__test1" \ + -email "__user1@test.test" \ + -first_names "__user1.Test first" \ + -last_name "__user1.Test last" \ + -password 1 \ + -password_confirm 1] + set user_1_id $user_1(user_id) + + array set user_2 [auth::create_user \ + -username "__test2" \ + -email "__user2@test.test" \ + -first_names "__user2.Test first" \ + -last_name "__user2.Test last" \ + -password 1 \ + -password_confirm 1] + set user_2_id $user_2(user_id) + + group::add_member -group_id $level_2_group -user_id $user_1_id -rel_type membership_rel + group::add_member -group_id $level_2_group -user_id $user_1_id -rel_type admin_rel + + # check that user_1 is a member of level_1_group but not admin + aa_true "User 1 is a member of Level 1 Group" [db_0or1row member_p { + SELECT 1 + FROM group_member_map + WHERE group_id = :level_1_group + AND member_id = :user_1_id + AND rel_type = 'membership_rel' + }] + + aa_false "User 1 is not an admin of Level 1 Group" [db_0or1row member_p { + SELECT 1 + FROM group_member_map + WHERE group_id = :level_1_group + AND member_id = :user_1_id + AND rel_type = 'admin_rel' + }] + + # create new group then relate it to level_2_group + set level_3_group [group::new -group_name "Level 3 Group"] + group::add_member -group_id $level_3_group -user_id $user_2(user_id) -rel_type membership_rel + group::add_member -group_id $level_3_group -user_id $user_2(user_id) -rel_type admin_rel + relation_add composition_rel $level_2_group $level_3_group + + # check that user_2 is a member of level_1_group but not admin + aa_true "User 2 is a member of Level 1 Group" [db_0or1row member_p { + SELECT 1 + FROM group_member_map + WHERE group_id = :level_1_group + AND member_id = :user_2_id + AND rel_type = 'membership_rel' + }] + + aa_false "User 2 is not an admin of Level 1 Group" [db_0or1row member_p { + SELECT 1 + FROM group_member_map + WHERE group_id = :level_1_group + AND member_id = :user_2_id + AND rel_type = 'admin_rel' + }] + + } + } +} + # Local variables: # mode: tcl # tcl-indent-level: 4 Index: openacs-4/packages/dotlrn/sql/postgresql/admins-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/postgresql/admins-init.sql,v diff -u -r1.6 -r1.6.4.1 --- openacs-4/packages/dotlrn/sql/postgresql/admins-init.sql 1 Nov 2013 21:08:28 -0000 1.6 +++ openacs-4/packages/dotlrn/sql/postgresql/admins-init.sql 31 Aug 2016 18:57:41 -0000 1.6.4.1 @@ -48,7 +48,7 @@ 'profiled_group', null, 0, - null, + null::integer, 'user', null, 0, Index: openacs-4/packages/dotlrn/sql/postgresql/class-memberships-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/postgresql/class-memberships-create.sql,v diff -u -r1.4 -r1.4.4.1 --- openacs-4/packages/dotlrn/sql/postgresql/class-memberships-create.sql 1 Nov 2013 21:08:29 -0000 1.4 +++ openacs-4/packages/dotlrn/sql/postgresql/class-memberships-create.sql 31 Aug 2016 18:57:41 -0000 1.4.4.1 @@ -138,11 +138,11 @@ 'dotlrn_class_instance', null, 0, - null, + null::integer, 'user', 'student', 0, - null + null::integer ); perform acs_rel_type__create_type ( @@ -156,11 +156,11 @@ 'dotlrn_class_instance', null, 0, - null, + null::integer, 'user', 'teaching_assistant', 0, - null + null::integer ); perform acs_rel_type__create_type ( @@ -173,11 +173,11 @@ 'dotlrn_ca_rel', 'dotlrn_class_instance', null, 0, - null, + null::integer, 'user', 'course_assistant', 0, - null + null::integer ); perform acs_rel_type__create_type ( @@ -191,11 +191,11 @@ 'dotlrn_class_instance', null, 0, - null, + null::integer, 'user', 'course_admin', 0, - null + null::integer ); perform acs_rel_type__create_type ( @@ -208,11 +208,11 @@ 'dotlrn_instructor_rel', 'dotlrn_class_instance', null, 0, - null, + null::integer, 'user', 'instructor', 0, - null + null::integer ); return 0; Index: openacs-4/packages/dotlrn/sql/postgresql/dotlrn-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/postgresql/dotlrn-init.sql,v diff -u -r1.14 -r1.14.4.1 --- openacs-4/packages/dotlrn/sql/postgresql/dotlrn-init.sql 1 Nov 2013 21:08:29 -0000 1.14 +++ openacs-4/packages/dotlrn/sql/postgresql/dotlrn-init.sql 31 Aug 2016 18:57:41 -0000 1.14.4.1 @@ -338,21 +338,21 @@ -- create basic rel_types perform acs_rel_type__create_type ( - 'dotlrn_member_rel', - '#dotlrn.dotlrn_member_rel_pretty_name#', - '#dotlrn.dotlrn_member_rel_pretty_plural#', - 'membership_rel', - 'dotlrn_member_rels', - 'rel_id', - 'dotlrn_member_rel', - 'dotlrn_community', - null, - 0, - null, - 'user', - 'member', - 0, - null + 'dotlrn_member_rel', -- rel_type + '#dotlrn.dotlrn_member_rel_pretty_name#', -- pretty_name + '#dotlrn.dotlrn_member_rel_pretty_plural#', -- pretty_plural + 'membership_rel', -- supertype + 'dotlrn_member_rels', -- table_name + 'rel_id', -- id_column + 'dotlrn_member_rel', -- package_name + 'dotlrn_community', -- object_type_one + null, -- role_one + 0, -- min_n_rels_one + null::integer, -- max_n_rels_one + 'user', -- object_type_two + 'member', -- role_two + 0, -- min_n_rels_two + null::integer -- max_n_rels_two ); perform acs_rel_type__create_type ( @@ -366,11 +366,11 @@ 'dotlrn_community', null, 0, - null, + null::integer, 'user', 'admin', 0, - null + null::integer ); -- all rels to communities must have a portal_id Index: openacs-4/packages/dotlrn/sql/postgresql/externals-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/postgresql/externals-init.sql,v diff -u -r1.6 -r1.6.4.1 --- openacs-4/packages/dotlrn/sql/postgresql/externals-init.sql 1 Nov 2013 21:08:29 -0000 1.6 +++ openacs-4/packages/dotlrn/sql/postgresql/externals-init.sql 31 Aug 2016 18:57:41 -0000 1.6.4.1 @@ -48,7 +48,7 @@ 'profiled_group', null, 0, - null, + null::integer, 'user', null, 0, Index: openacs-4/packages/dotlrn/sql/postgresql/privacy-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/postgresql/privacy-init.sql,v diff -u -r1.3.4.1 -r1.3.4.2 --- openacs-4/packages/dotlrn/sql/postgresql/privacy-init.sql 3 Aug 2016 10:08:23 -0000 1.3.4.1 +++ openacs-4/packages/dotlrn/sql/postgresql/privacy-init.sql 31 Aug 2016 18:57:41 -0000 1.3.4.2 @@ -45,7 +45,7 @@ 'group', null, 0, - null, + null::integer, 'user', null, 0, @@ -73,7 +73,7 @@ 'group', null, 0, - null, + null::integer, 'user', null, 0, Index: openacs-4/packages/dotlrn/sql/postgresql/professors-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/postgresql/professors-init.sql,v diff -u -r1.6 -r1.6.4.1 --- openacs-4/packages/dotlrn/sql/postgresql/professors-init.sql 1 Nov 2013 21:08:29 -0000 1.6 +++ openacs-4/packages/dotlrn/sql/postgresql/professors-init.sql 31 Aug 2016 18:57:41 -0000 1.6.4.1 @@ -48,7 +48,7 @@ 'profiled_group', null, 0, - null, + null::integer, 'user', null, 0, Index: openacs-4/packages/dotlrn/sql/postgresql/users-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/dotlrn/sql/postgresql/users-init.sql,v diff -u -r1.4 -r1.4.4.1 --- openacs-4/packages/dotlrn/sql/postgresql/users-init.sql 1 Nov 2013 21:08:30 -0000 1.4 +++ openacs-4/packages/dotlrn/sql/postgresql/users-init.sql 31 Aug 2016 18:57:41 -0000 1.4.4.1 @@ -44,7 +44,7 @@ 'profiled_group', null, 0, - null, + null::integer, 'user', null, 0, Index: openacs-4/packages/evaluation/sql/postgresql/evaluation-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/evaluation/sql/postgresql/evaluation-create.sql,v diff -u -r1.25.10.1 -r1.25.10.2 --- openacs-4/packages/evaluation/sql/postgresql/evaluation-create.sql 15 May 2016 19:54:31 -0000 1.25.10.1 +++ openacs-4/packages/evaluation/sql/postgresql/evaluation-create.sql 31 Aug 2016 18:57:41 -0000 1.25.10.2 @@ -207,7 +207,7 @@ 'evaluation_task_groups', null, 0, - null, + null::integer, 'user', null, 0, Index: openacs-4/packages/user-profile/sql/postgresql/user-profile-init.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/user-profile/sql/postgresql/user-profile-init.sql,v diff -u -r1.2 -r1.2.2.1 --- openacs-4/packages/user-profile/sql/postgresql/user-profile-init.sql 27 Oct 2014 16:42:00 -0000 1.2 +++ openacs-4/packages/user-profile/sql/postgresql/user-profile-init.sql 31 Aug 2016 18:57:41 -0000 1.2.2.1 @@ -27,7 +27,7 @@ 'profiled_group', null, 0, - null, + null::integer, 'user', null, 0,