Index: openacs-4/contrib/obsolete-packages/bboard/sql/postgresql/bboard-packages.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/obsolete-packages/bboard/sql/postgresql/bboard-packages.sql,v diff -u -N -r1.4 -r1.5 --- openacs-4/contrib/obsolete-packages/bboard/sql/postgresql/bboard-packages.sql 1 Dec 2001 22:25:53 -0000 1.4 +++ openacs-4/contrib/obsolete-packages/bboard/sql/postgresql/bboard-packages.sql 9 Dec 2001 04:21:58 -0000 1.5 @@ -500,9 +500,9 @@ child_val record; message_val record; image_p integer; - v_search_key varchar; + v_search_key varbit; begin - select into v_search_key + select tree_sortkey into v_search_key from acs_messages where message_id = thread_id; Index: openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql,v diff -u -N -r1.9 -r1.10 --- openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql 8 Dec 2001 01:17:59 -0000 1.9 +++ openacs-4/contrib/obsolete-packages/bboard/tcl/bboard-procs-postgresql.xql 9 Dec 2001 04:21:58 -0000 1.10 @@ -411,10 +411,10 @@ select s.subscriber_id as recipient_id, s.thread_id as grouping_id, now() as wait_until - from bboard_thread_subscribers s, acs_messages m, acs_messages m2 + from bboard_thread_subscribers s, acs_messages m, + (select tree_ancestor_keys(acs_message_get_tree_sortkey(:message_id)) as tree_sortkey) parents where s.thread_id = m.message_id - and m2.message_id = :message_id - and m.tree_sortkey between tree_root_key(m2.tree_sortkey) and tree_right(tree_root_key(m2.tree_sortkey)) + and m.tree_sortkey = parents.tree_sortkey and exists (select 1 from all_object_party_privilege_map map where map.object_id = :message_id and Index: openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql,v diff -u -N -r1.33 -r1.34 --- openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql 8 Dec 2001 01:17:59 -0000 1.33 +++ openacs-4/packages/acs-content-repository/sql/postgresql/content-create.sql 9 Dec 2001 04:21:58 -0000 1.34 @@ -236,6 +236,13 @@ foreign key (item_id) references cr_items(item_id); +create function cr_items_get_tree_sortkey(integer) returns varbit as ' +declare + p_item_id alias for $1; +begin + return tree_sortkey from cr_items where item_id = p_item_id; +end;' language 'plpgsql'; + create function cr_items_tree_insert_tr () returns opaque as ' declare v_parent_sk varbit default null; @@ -955,6 +962,13 @@ ); +create function cr_keywords_get_tree_sortkey(integer) returns varbit as ' +declare + p_keyword_id alias for $1; +begin + return tree_sortkey from cr_keywords where keyword_id = p_keyword_id; +end;' language 'plpgsql'; + create function cr_keywords_tree_insert_tr () returns opaque as ' declare v_parent_sk varbit default null; Index: openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql,v diff -u -N -r1.35 -r1.36 --- openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql 8 Dec 2001 01:17:59 -0000 1.35 +++ openacs-4/packages/acs-content-repository/sql/postgresql/content-item.sql 9 Dec 2001 04:21:58 -0000 1.36 @@ -13,8 +13,6 @@ create view content_item_globals as select -100 as c_root_folder_id; --- create or replace package body content_item --- function get_root_folder create function content_item__get_root_folder (integer) returns integer as ' declare Index: openacs-4/packages/acs-content-repository/sql/postgresql/content-keyword.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/content-keyword.sql,v diff -u -N -r1.9 -r1.10 --- openacs-4/packages/acs-content-repository/sql/postgresql/content-keyword.sql 8 Dec 2001 01:17:59 -0000 1.9 +++ openacs-4/packages/acs-content-repository/sql/postgresql/content-keyword.sql 9 Dec 2001 04:21:58 -0000 1.10 @@ -8,8 +8,6 @@ -- License. Full text of the license is available from the GNU Project: -- http://www.fsf.org/copyleft/gpl.html --- create or replace package body content_keyword --- function get_heading create function content_keyword__get_heading (integer) returns text as ' declare Index: openacs-4/packages/acs-content-repository/sql/postgresql/content-perms.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-content-repository/sql/postgresql/Attic/content-perms.sql,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/acs-content-repository/sql/postgresql/content-perms.sql 8 Dec 2001 01:17:59 -0000 1.7 +++ openacs-4/packages/acs-content-repository/sql/postgresql/content-perms.sql 9 Dec 2001 04:21:58 -0000 1.8 @@ -151,40 +151,33 @@ has_revoke_authority__privilege alias for $3; has_revoke_authority__revokee_id alias for $4; begin --- select 1 from --- (select object_id from acs_objects --- connect by prior context_id = object_id --- start with object_id = has_revoke_authority__object_id) t, --- (select privilege, child_privilege from acs_privilege_hierarchy --- connect by prior privilege = child_privilege --- start with child_privilege = ''cm_perm'') h --- where --- content_permission__permission_p( --- t.object_id, has_revoke_authority__holder_id, h.child_privilege --- ) = ''t'' --- and --- content_permission__permission_p( --- t.object_id, has_revoke_authority__revokee_id, h.privilege --- ) = ''f''; - return count(*) > 0 from + -- DRB: Note that the privilege selection doesn't use the slick tree_ancestor_keys + -- trick. There are two reasons for this. The first is that we might have a set of + -- tree_sortkeys returned from the acs_privilege_hierarchy_index when child_privilege + -- is ''cm_perm''. The second is that this table is relatively small anyway and the + -- old style's probably just as efficient as the first as an index scan is only preferred + -- by the Postgres optimizer when it will significantly reduce the number of rows scanned. + + return exists (select 1 from (select o2.object_id - from acs_objects o1, acs_objects o2 - where o1.object_id = has_revoke_authority__object_id - and o1.tree_sortkey between o2.tree_sortkey and tree_right(o2.tree_sortkey)) t + from (select tree_ancestor_keys(acs_object__get_tree_sortkey(has_revoke_authority__object_id)) as tree_sortkey) parents, + acs_objects o2 + where o2.tree_sortkey = parents.tree_sortkey) t (select i2.privilege, i2.child_privilege from acs_privilege_hierarchy_index i1, acs_privilege_hierarchy_index i2 where i1.child_privilege = ''cm_perm'' - and i1.tree_sortkey between i2.tree_sortkey and tree_right(i2.tree_sortkey)) h + and i1.tree_sortkey between i2.tree_sortkey and tree_right(i2.tree_sortkey) + and tree_ancestor_p(i2.tree_sortkey, i1.tree_sortkey)) h where content_permission__permission_p( t.object_id, has_revoke_authority__holder_id, h.child_privilege ) and not content_permission__permission_p( t.object_id, has_revoke_authority__revokee_id, h.privilege - ); + )); end;' language 'plpgsql'; Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql,v diff -u -N -r1.12 -r1.13 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql 8 Dec 2001 01:17:59 -0000 1.12 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-metadata-create.sql 9 Dec 2001 04:21:58 -0000 1.13 @@ -57,6 +57,13 @@ -- support for tree queries on acs_object_types +create function acs_object_type_get_tree_sortkey(varchar) returns varbit as ' +declare + p_object_type alias for $1; +begin + return tree_sortkey from acs_object_types where object_type = p_object_type; +end;' language 'plpgsql'; + create function acs_object_type_insert_tr () returns opaque as ' declare v_parent_sk varbit default null; @@ -499,93 +506,6 @@ -- METADATA PACKAGES -- ----------------------- --- create or replace package acs_object_type --- is --- -- define an object type --- procedure create_type ( --- object_type in acs_object_types.object_type%TYPE, --- pretty_name in acs_object_types.pretty_name%TYPE, --- pretty_plural in acs_object_types.pretty_plural%TYPE, --- supertype in acs_object_types.supertype%TYPE --- default 'acs_object', --- table_name in acs_object_types.table_name%TYPE, --- id_column in acs_object_types.id_column%TYPE default 'XXX', --- package_name in acs_object_types.package_name%TYPE default null, --- abstract_p in acs_object_types.abstract_p%TYPE default 'f', --- type_extension_table in acs_object_types.type_extension_table%TYPE --- default null, --- name_method in acs_object_types.name_method%TYPE default null --- ); --- --- -- delete an object type definition --- procedure drop_type ( --- object_type in acs_object_types.object_type%TYPE, --- cascade_p in char default 'f' --- ); --- --- -- look up an object type's pretty_name --- function pretty_name ( --- object_type in acs_object_types.object_type%TYPE --- ) return acs_object_types.pretty_name%TYPE; --- --- -- Returns 't' if object_type_2 is a subtype of object_type_1. Note --- -- that this function will return 'f' if object_type_1 = --- -- object_type_2 --- function is_subtype_p ( --- object_type_1 in acs_object_types.object_type%TYPE, --- object_type_2 in acs_object_types.object_type%TYPE --- ) return char; --- --- end acs_object_type; - --- show errors - - --- create or replace package acs_attribute --- is --- --- -- define an object attribute --- function create_attribute ( --- object_type in acs_attributes.object_type%TYPE, --- attribute_name in acs_attributes.attribute_name%TYPE, --- datatype in acs_attributes.datatype%TYPE, --- pretty_name in acs_attributes.pretty_name%TYPE, --- pretty_plural in acs_attributes.pretty_plural%TYPE default null, --- table_name in acs_attributes.table_name%TYPE default null, --- column_name in acs_attributes.column_name%TYPE default null, --- default_value in acs_attributes.default_value%TYPE default null, --- min_n_values in acs_attributes.min_n_values%TYPE default 1, --- max_n_values in acs_attributes.max_n_values%TYPE default 1, --- sort_order in acs_attributes.sort_order%TYPE default null, --- storage in acs_attributes.storage%TYPE default 'type_specific', --- static_p in acs_attributes.static_p%TYPE default 'f' --- ) return acs_attributes.attribute_id%TYPE; --- --- procedure drop_attribute ( --- object_type in varchar2, --- attribute_name in varchar2 --- ); --- --- procedure add_description ( --- object_type in acs_attribute_descriptions.object_type%TYPE, --- attribute_name in acs_attribute_descriptions.attribute_name%TYPE, --- description_key in acs_attribute_descriptions.description_key%TYPE, --- description in acs_attribute_descriptions.description%TYPE --- ); --- --- procedure drop_description ( --- object_type in acs_attribute_descriptions.object_type%TYPE, --- attribute_name in acs_attribute_descriptions.attribute_name%TYPE, --- description_key in acs_attribute_descriptions.description_key%TYPE --- ); --- --- end acs_attribute; - --- show errors - - --- create or replace package body acs_object_type --- procedure create_type create function acs_object_type__create_type (varchar,varchar,varchar,varchar,varchar,varchar,varchar,boolean,varchar,varchar) returns integer as ' declare Index: openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql,v diff -u -N -r1.27 -r1.28 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql 8 Dec 2001 01:17:59 -0000 1.27 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-objects-create.sql 9 Dec 2001 04:21:58 -0000 1.28 @@ -228,6 +228,15 @@ create trigger acs_objects_last_mod_update_tr before update on acs_objects for each row execute procedure acs_objects_last_mod_update_tr (); +-- tree query support for acs_objects + +create function acs_objects_get_tree_sortkey(integer) returns varbit as ' +declare + p_object_id alias for $1; +begin + return tree_sortkey from acs_objects where object_id = p_object_id; +end;' language 'plpgsql'; + create function acs_objects_insert_tr () returns opaque as ' declare v_parent_sk varbit default null; @@ -534,69 +543,6 @@ -- ACS_OBJECT PACKAGE -- ------------------------ --- create or replace package acs_object --- as --- --- function new ( --- object_id in acs_objects.object_id%TYPE default null, --- object_type in acs_objects.object_type%TYPE --- default 'acs_object', --- creation_date in acs_objects.creation_date%TYPE --- default sysdate, --- creation_user in acs_objects.creation_user%TYPE --- default null, --- creation_ip in acs_objects.creation_ip%TYPE default null, --- context_id in acs_objects.context_id%TYPE default null --- ) return acs_objects.object_id%TYPE; --- --- procedure delete ( --- object_id in acs_objects.object_id%TYPE --- ); --- --- function name ( --- object_id in acs_objects.object_id%TYPE --- ) return varchar2; --- --- -- The acs_object_types.name_method for "acs_object" --- -- --- function default_name ( --- object_id in acs_objects.object_id%TYPE --- ) return varchar2; --- --- -- Determine where the attribute is stored and what sql needs to be --- -- in the where clause to retreive it --- -- Used in get_attribute and set_attribute --- procedure get_attribute_storage ( --- object_id_in in acs_objects.object_id%TYPE, --- attribute_name_in in acs_attributes.attribute_name%TYPE, --- v_column out varchar2, --- v_table_name out varchar2, --- v_key_sql out varchar2 --- ); --- --- -- Get/set the value of an object attribute, as long as --- -- the type can be cast to varchar2 --- function get_attribute ( --- object_id_in in acs_objects.object_id%TYPE, --- attribute_name_in in acs_attributes.attribute_name%TYPE --- ) return varchar2; --- --- procedure set_attribute ( --- object_id_in in acs_objects.object_id%TYPE, --- attribute_name_in in acs_attributes.attribute_name%TYPE, --- value_in in varchar2 --- ); --- --- function check_representation ( --- object_id in acs_objects.object_id%TYPE --- ) return char; --- --- end acs_object; - --- show errors - --- create or replace package body acs_object --- procedure initialize_attributes create function acs_object__initialize_attributes (integer) returns integer as ' declare 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 -N -r1.9 -r1.10 --- openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql 1 Dec 2001 17:55:16 -0000 1.9 +++ openacs-4/packages/acs-kernel/sql/postgresql/acs-relationships-create.sql 9 Dec 2001 04:21:58 -0000 1.10 @@ -362,36 +362,28 @@ actual_object_type_one acs_object_types.object_type%TYPE; actual_object_type_two acs_object_types.object_type%TYPE; begin - select 1 into dummy - from acs_rel_types rt, - acs_objects o1, - acs_objects o2 - where exists (select 1 - from acs_object_types t, acs_object_types o - where t.object_type = o1.object_type - and o.object_type = rt.object_type_one - and t.tree_sortkey between o.tree_sortkey and tree_right(o.tree_sortkey)) - and exists (select 1 - from acs_object_types t, acs_object_types o - where t.object_type = o2.object_type - and o.object_type = rt.object_type_two - and t.tree_sortkey between o.tree_sortkey and tree_right(o.tree_sortkey)) - and rt.rel_type = new.rel_type + + -- DRB: The obvious rewrite using exists kills Postgres!!! Argh!!! This is faster, so there ... + -- Get all the object type + select rt.object_type_one, rt.object_type_two, + o1.object_type, o2.object_type + into target_object_type_one, target_object_type_two, + actual_object_type_one, actual_object_type_two + from acs_rel_types rt, acs_objects o1, acs_objects o2 + where rt.rel_type = new.rel_type and o1.object_id = new.object_id_one and o2.object_id = new.object_id_two; + select count(*) into dummy + from (select tree_ancestor_keys(acs_object_type_get_tree_sortkey(actual_object_type_one)) as tree_sortkey) parents1, + (select tree_ancestor_keys(acs_object_type_get_tree_sortkey(actual_object_type_two)) as tree_sortkey) parents2, + (select tree_sortkey from acs_object_types where object_type = target_object_type_one) root1, + (select tree_sortkey from acs_object_types where object_type = target_object_type_two) root2 + where tree_ancestor_p(root1.tree_sortkey, parents1.tree_sortkey) + and tree_ancestor_p(root2.tree_sortkey, parents2.tree_sortkey); + if NOT FOUND then - -- At least one of the object types must have been wrong. - -- Get all the object type information and print it out. - select rt.object_type_one, rt.object_type_two, - o1.object_type, o2.object_type - into target_object_type_one, target_object_type_two, - actual_object_type_one, actual_object_type_two - from acs_rel_types rt, acs_objects o1, acs_objects o2 - where rt.rel_type = new.rel_type - and o1.object_id = new.object_id_one - and o2.object_id = new.object_id_two; raise EXCEPTION ''-20001: % violation: Invalid object types. Object % (%) must be of type % Object % (%) must be of type %'', new.rel_type, new.object_id_one, 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 -N -r1.17 -r1.18 --- openacs-4/packages/acs-kernel/sql/postgresql/postgresql.sql 8 Dec 2001 01:17:59 -0000 1.17 +++ openacs-4/packages/acs-kernel/sql/postgresql/postgresql.sql 9 Dec 2001 04:21:58 -0000 1.18 @@ -359,10 +359,39 @@ end;' language 'plpgsql' with (isstrict, iscachable); +create function tree_ancestor_key(varbit, integer) returns varbit as ' + +-- Returns a key for the ancestor at the given level. The root is level +-- one. + +declare + p_tree_key alias for $1; + p_level alias for $2; + v_level integer default 0; + v_pos integer default 1; +begin + + if tree_level(p_tree_key) < p_level then + raise exception ''tree_ancestor_key: key is at a level less than %'', p_level; + end if; + + while v_level < p_level loop + v_level := v_level + 1; + if substring(p_tree_key, v_pos, 1) = ''1'' then + v_pos := v_pos + 16; + else + v_pos := v_pos + 8; + end if; + end loop; + + return substring(p_tree_key, 1, v_pos - 1); + +end;' language 'plpgsql' with (isstrict, iscachable); + create function tree_root_key(varbit) returns varbit as ' -- Return the tree_sortkey for the root node of the node with the --- given tree_sortkey. +-- given tree_sortkey. declare p_tree_key alias for $1; @@ -501,7 +530,104 @@ return position(p_potential_ancestor in p_potential_child) = 1; end;' language 'plpgsql'; +create function create_tree_ancestor_keys() returns boolean as ' +-- PG 7.1 does not allow recursive SQL functions, but David Walker figured out how to +-- get around this with a truly inspired hack he posted to the OpenACS 4 Design Forum. + +-- His solution involves a general "create and replace function" function written in +-- Tcl. + +-- Rather than use the general solution I have just hacked up a PL/pgSQL function to +-- create the one recursive function we need: tree_ancestor_keys(varbit, integer). + +-- This function should probably only be called from its overloaded cousin +-- tree_ancestor_keys(varbit). + +begin + + -- create tree_ancestor_keys with a dummy body + + execute ''create function tree_ancestor_keys(varbit, integer) returns setof varbit as '''' + select $1 + '''' language ''''sql'''' ''; + + -- create another function with the body we want + + execute ''create function __tree_ancestor_keys(varbit, integer) returns setof varbit as '''' + select tree_ancestor_key($1, $2) + union + select tree_ancestor_keys($1, $2 + 1) + where $2 < tree_level($1) + '''' language ''''sql'''' with (isstrict) ''; + + -- replace the body for tree_ancestor_keys with the body we want. Slick, eh? + + update pg_proc + set prosrc = hack.prosrc, probin = hack.probin + from (select prosrc, probin + from pg_proc + where proname = ''__tree_ancestor_keys'') hack + where proname = ''tree_ancestor_keys''; + + execute ''drop function __tree_ancestor_keys(varbit, integer)''; + + return true; +end;' language 'plpgsql'; + +select create_tree_ancestor_keys(); + +create function tree_ancestor_keys(varbit) returns setof varbit as ' + +-- tree_ancestor_keys returns the set of ancestor keys starting at the level passed +-- in as the second parameter down to the key passed in as the first parameter. Normally +-- this will be one - its intended use is to drive the recursive building of the set of +-- ancestor keys. + +-- Here is an example on acs_objects: + +-- select o.* +-- from acs_objects o, +-- (select tree_ancestor_keys(acs_objects_get_tree_sortkey(:object_id), 1) as tree_sortkey) parents +-- where o.tree_sortkey = parents.tree_sortkey; + +-- This query will use the index on tree_sortkey to scan acs_objects. The function to grab +-- the tree_sortkey for the node is necessary (and must be defined for each table that uses +-- our hierarchical query scheme) to avoid restrictions on the use of SQL functions that +-- return sets. + +-- if you only want the ancestors for a node within a given subtree, do something like this and +-- cross your fingers that Postgres will figure out whether the join on parent or the root is +-- more restrictive and do the right one first: + +-- select o.* +-- from acs_objects o, +-- (select tree_sortkey from acs_objects where object_id = :root_id) as root +-- (select tree_ancestor_keys(acs_objects_get_tree_sortkey(:object_id), 1) as tree_sortkey) parents +-- where o.tree_sortkey = parents.tree_sortkey +-- and o.tree_sortkey >= root.tree_sortkey; + +-- DO NOT BE TEMPTED TO REWRITE THE ABOVE QUERIES LIKE THIS: + +-- select * +-- from acs_objects +-- where object_id in (select tree_ancestor_keys(object_id) +-- from acs_objects +-- where object_id = :object_id); + +-- This is more readable and is certainly cleaner BUT WILL NOT USE THE INDEX ON TREE_SORTKEY +-- when scanning the acs_objects instance referred to by the left operand of the "in" operator. Given +-- 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. Not tested for PG 7.2. If it fails there a bug report will be +-- filed. + + select tree_ancestor_keys($1, 1) + +' language 'sql' with (isstrict); + ---------------------------------------------------------------------------- -- PG substitute for Oracle user_tab_columns view Index: openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql,v diff -u -N -r1.13 -r1.14 --- openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql 8 Dec 2001 01:17:59 -0000 1.13 +++ openacs-4/packages/acs-kernel/sql/postgresql/site-nodes-create.sql 9 Dec 2001 04:21:58 -0000 1.14 @@ -61,6 +61,13 @@ create index site_nodes_object_id_idx on site_nodes (object_id); create index site_nodes_tree_skey_idx on site_nodes (tree_sortkey); +create function site_node_get_tree_sortkey(integer) returns varbit as ' +declare + p_node_id alias for $1; +begin + return tree_sortkey from site_nodes where node_id = p_node_id; +end;' language 'plpgsql'; + create function site_node_insert_tr () returns opaque as ' declare v_parent_sk varbit default null; @@ -195,8 +202,6 @@ -- show errors --- create or replace package body site_node --- function new create function site_node__new (integer,integer,varchar,integer,boolean,boolean,integer,varchar) returns integer as ' declare Index: openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-create.sql,v diff -u -N -r1.6 -r1.7 --- openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-create.sql 8 Dec 2001 01:17:59 -0000 1.6 +++ openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-create.sql 9 Dec 2001 04:21:58 -0000 1.7 @@ -93,6 +93,13 @@ -- support for tree queries on acs_messages +create function acs_message_get_tree_sortkey(integer) returns varbit as ' +declare + p_message_id alias for $1; +begin + return tree_sortkey from acs_messages where message_id = p_message_id; +end;' language 'plpgsql'; + create function acs_message_insert_tr () returns opaque as ' declare v_parent_sk varbit default null; Index: openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-packages.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-packages.sql,v diff -u -N -r1.9 -r1.10 --- openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-packages.sql 8 Dec 2001 01:17:59 -0000 1.9 +++ openacs-4/packages/acs-messaging/sql/postgresql/acs-messaging-packages.sql 9 Dec 2001 04:21:58 -0000 1.10 @@ -239,7 +239,7 @@ v_message_id acs_messages.message_id%TYPE; v_ancestor_sk varbit; begin - select tree_root_key(tree_sortkey) into v_ancestor_sk + select tree_ancestor_key(tree_sortkey, 1) into v_ancestor_sk from acs_messages where message_id = p_message_id; Index: openacs-4/packages/acs-subsite/www/admin/site-map/index-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-subsite/www/admin/site-map/index-postgresql.xql,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/acs-subsite/www/admin/site-map/index-postgresql.xql 4 Dec 2001 00:20:47 -0000 1.4 +++ openacs-4/packages/acs-subsite/www/admin/site-map/index-postgresql.xql 9 Dec 2001 04:21:58 -0000 1.5 @@ -9,9 +9,9 @@ select s2.node_id, s2.name, s2.directory_p, tree_level(s2.tree_sortkey) as level, acs_object__name(s2.object_id) as obj_name, acs_permission__permission_p(s2.object_id, :user_id, 'admin') as admin_p - from site_nodes s1, site_nodes s2 - where s1.node_id = :root_id - and s1.tree_sortkey between s2.tree_sortkey and tree_right(s2.tree_sortkey) + from (select tree_ancestor_keys(site_node_get_tree_sortkey(:root_id)) as tree_sortkey) parents, + site_nodes s2 + where s2.tree_sortkey = parents.tree_sortkey order by level Index: openacs-4/packages/acs-tcl/tcl/navigation-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/acs-tcl/tcl/Attic/navigation-procs-postgresql.xql,v diff -u -N -r1.6 -r1.7 --- openacs-4/packages/acs-tcl/tcl/navigation-procs-postgresql.xql 8 Dec 2001 01:17:59 -0000 1.6 +++ openacs-4/packages/acs-tcl/tcl/navigation-procs-postgresql.xql 9 Dec 2001 04:21:58 -0000 1.7 @@ -7,10 +7,9 @@ select site_node__url(n2.node_id) as url, n2.object_id, acs_object__name(n2.object_id) as object_name, tree_level(n2.tree_sortkey) as level - from (select * from site_nodes where node_id = :node_id) n1, + from (select tree_ancestor_keys(site_node_get_tree_sortkey(:node_id)) as tree_sortkey) parents, site_nodes n2 - where n1.tree_sortkey between n2.tree_sortkey and tree_right(n2.tree_sortkey) - and tree_ancestor_p(n2.tree_sortkey, n1.tree_sortkey) + where n2.tree_sortkey = parents.tree_sortkey order by level asc Index: openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql,v diff -u -N -r1.17 -r1.18 --- openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql 8 Dec 2001 01:17:59 -0000 1.17 +++ openacs-4/packages/bookmarks/sql/postgresql/bookmarks-create.sql 9 Dec 2001 04:21:58 -0000 1.18 @@ -107,6 +107,13 @@ -- With index on tree_sortkey create index bm_bookmarks_idx1 on bm_bookmarks(tree_sortkey); +create function bm_bookmarks_get_tree_sortkey(integer) returns varbit as ' +declare + p_bookmark_id alias for $1; +begin + return tree_sortkey from bm_bookmarks where bookmark_id = p_bookmark_id; +end;' language 'plpgsql'; + create function bm_bookmarks_insert_tr () returns opaque as ' declare v_parent_sk varbit default null; @@ -721,10 +728,9 @@ SELECT CASE WHEN count(*)=0 THEN ''f'' ELSE ''t'' END INTO v_private_p FROM acs_objects, ( - SELECT bm2.bookmark_id FROM bm_bookmarks bm, bm_bookmarks bm2 - WHERE bm.bookmark_id = p_bookmark_id - and bm.tree_sortkey between bm2.tree_sortkey and tree_right(bm2.tree_sortkey) - and tree_ancestor_p(bm2.tree_sortkey, bm.tree_sortkey) + SELECT bm.bookmark_id FROM bm_bookmarks bm, + (SELECT tree_ancestor_keys(bm_bookmarks_get_tree_sortkey(p_bookmark_id)) as tree_sortkey) parents + WHERE bm.tree_sortkey = parents.tree_sortkey ) b WHERE b.bookmark_id = acs_objects.object_id AND acs_objects.security_inherit_p = ''f''; Index: openacs-4/packages/cms/www/modules/permissions/index-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/cms/www/modules/permissions/index-postgresql.xql,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/cms/www/modules/permissions/index-postgresql.xql 8 Dec 2001 01:18:00 -0000 1.3 +++ openacs-4/packages/cms/www/modules/permissions/index-postgresql.xql 9 Dec 2001 04:21:58 -0000 1.4 @@ -16,24 +16,21 @@ from acs_permissions per, acs_privileges p, parties u, persons n, - (select o2.object_id - from (select * from acs_objects where object_id = :object_id) o1, - acs_objects o2 - where o1.tree_sortkey between o2.tree_sortkey and tree_right(o2.tree_sortkey) - and tree_ancestor_p(o2.tree_sortkey, o1.tree_sortkey) - and tree_level(o2.tree_sortkey) >= (select - case when max(tree_level(ob2.tree_sortkey)) is null + (select o.object_id + from (select tree_ancestor_keys(acs_objects_get_tree_sortkey(:object_id)) as tree_sortkey) parents, + acs_objects o + where o.tree_sortkey = parents.tree_sortkey + and tree_level(o.tree_sortkey) >= (select + case when max(tree_level(ob.tree_sortkey)) is null then 0 - else max(tree_level(ob2.tree_sortkey)) + else max(tree_level(ob.tree_sortkey)) end from - (select * - from acs_objects - where object_id = :object_id) ob1, - acs_objects ob2 - where ob1.tree_sortkey between ob2.tree_sortkey and tree_right(ob2.tree_sortkey) - and tree_ancestor_p(ob2.tree_sortkey, ob1.tree_sortkey) - and ob2.security_inherit_p = 'f')) o + (select tree_ancestor_keys(acs_objects_get_tree_sortkey(:object_id)) + as tree_sortkey) parents, + acs_objects ob + where ob.tree_sortkey = parents.tree_sortkey + and ob.security_inherit_p = 'f')) o where per.privilege = p.privilege and Index: openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql,v diff -u -N -r1.7 -r1.8 --- openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql 8 Dec 2001 01:18:00 -0000 1.7 +++ openacs-4/packages/file-storage/tcl/file-storage-procs-postgresql.xql 9 Dec 2001 04:21:58 -0000 1.8 @@ -71,16 +71,16 @@ - select (case when file_storage__get_content_type(j.item_id) = 'content_folder' + select (case when file_storage__get_content_type(i.item_id) = 'content_folder' then 'index?folder_id=' else 'file?file_id=' - end) || j.item_id, - file_storage__get_title(j.item_id) - from cr_items i, cr_items j, cr_items k - where i.item_id = :start_id - and k.item_id = file_storage__get_root_folder([ad_conn package_id]) - and j.tree_sortkey between tree_left(k.tree_sortkey) and i.tree_sortkey - and tree_ancestor_p(j.tree_sortkey, i.tree_sortkey) + end) || i.item_id, + file_storage__get_title(i.item_id) + from (select tree_ancestor_keys(cr_items_get_tree_sortkey(:start_id)) as tree_sortkey) parents, + (select tree_sortkey from cr_items where item_id = file_storage__get_root_folder([ad_conn package_id])) root, + cr_items i + where i.tree_sortkey = parents.tree_sortkey + and i.tree_sortkey > root.tree_sortkey order by j.tree_sortkey asc Index: openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql,v diff -u -N -r1.17 -r1.18 --- openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql 8 Dec 2001 01:18:00 -0000 1.17 +++ openacs-4/packages/static-pages/sql/postgresql/static-pages-create.sql 9 Dec 2001 04:21:58 -0000 1.18 @@ -54,6 +54,13 @@ --tree_sortkey index DaveB create index sp_folders_tree_skey_idx on sp_folders (tree_sortkey); +create function sp_folders_get_tree_sortkey(integer) returns varbit as ' +declare + p_folder_id alias for $1; +begin + return tree_sortkey from sp_folders where folder_id = p_folder_id; +end;' language 'plpgsql'; + -- tree_sortkey triggers DaveB create function sp_folders_insert_tr () returns opaque as '