begin; -- As it comes out, forums has some embedded views counter -- feature. This is not used upstream, but it is in some local -- installations we know of. As on these table forums_reading_info can -- grow very large, there were reports of bad performances. This -- update has the goal to optimize and streamline current reading -- count implementation. During this, some inconsistency between -- oracle and postgres and duplication was found and addressed. -- data model drop table if exists forums_reading_info_user; alter table forums_reading_info add column forum_id integer constraint forum_read_forum_id_fk references forums_forums (forum_id) on delete cascade; -- populate reference to forum in table update forums_reading_info i set forum_id = ( select forum_id from forums_messages where message_id = i.root_message_id); create index forums_reading_info_forum_forum_index on forums_reading_info (forum_id); alter table forums_reading_info alter column forum_id set not null; -- this was a sort of materialized view, but consistency checks made -- code complicated. Redefined as a view create or replace view forums_reading_info_user as select forum_id, user_id, count(*) as threads_read from forums_reading_info group by forum_id, user_id; -- functions -- -- procedure forums_reading_info__remove_msg/1 -- CREATE OR REPLACE FUNCTION forums_reading_info__remove_msg( p_message_id integer ) RETURNS integer AS $$ DECLARE BEGIN delete from forums_reading_info where root_message_id = p_message_id; return 0; END; $$ LANGUAGE plpgsql; -- -- procedure forums_reading_info__user_add_forum/2 -- -- -- procedure forums_reading_info__user_add_forum/2 -- CREATE OR REPLACE FUNCTION forums_reading_info__user_add_forum( p_forum_id integer, p_user_id integer ) RETURNS integer AS $$ DECLARE v_message_id integer; BEGIN for v_message_id in select message_id from forums_messages_approved m where forum_id = p_forum_id and parent_id is null and not exists (select 1 from forums_reading_info where user_id = p_user_id and root_message_id = m.message_id) loop insert into forums_reading_info ( root_message_id, user_id, forum_id ) values ( v_message_id, p_user_id, p_forum_id ); end loop; return 0; END; $$ LANGUAGE plpgsql; -- -- procedure forums_reading_info__user_add_msg/2 -- CREATE OR REPLACE FUNCTION forums_reading_info__user_add_msg( p_root_message_id integer, p_user_id integer ) RETURNS integer AS $$ DECLARE v_forum_id integer; BEGIN if NOT exists (select 1 from forums_reading_info where user_id = p_user_id and root_message_id = p_root_message_id) then insert into forums_reading_info ( root_message_id, user_id, forum_id ) values ( p_root_message_id, p_user_id, (select forum_id from forums_messages where message_id = p_root_message_id) ); end if; return 0; END; $$ LANGUAGE plpgsql; -- These functions were defined with a name not conformant with -- package notation used to mimic oracle. They resulted also -- redundant once we eliminated the forums_reading_info_users table drop function forums_message__move_update_reading_info(integer, integer, integer); delete from acs_function_args where function = upper('forums_message__move_update_reading_info'); delete from acs_function_args where function = upper('forums_message__move_thread_update_reading_info'); drop function forums_message__move_thread_update_reading_info(integer, integer, integer); drop function forums_message__move_thread_thread_update_reading_info(integer, integer, integer); delete from acs_function_args where function = upper('forums_message__move_thread_thread_update_reading_info'); -- move thread to other thread -- added select define_function_args('forums_reading_info__move_thread_update','source_message_id,target_message_id'); -- -- procedure forums_reading_info__move_thread_update/2 -- CREATE OR REPLACE FUNCTION forums_reading_info__move_thread_update( p_source_message_id integer, p_target_message_id integer ) RETURNS integer AS $$ DECLARE BEGIN -- for all users that have read target, but not the source, remove -- target_info delete from forums_reading_info i where root_message_id = p_target_message_id and not exists (select 1 from forums_reading_info where root_message_id = p_source_message_id and user_id = i.user_id); -- for all users that have read source, remove reading info four -- source message since it no longer is root_message_id delete from forums_reading_info where root_message_id = p_source_message_id; return 1; END; $$ LANGUAGE plpgsql; drop function forums_message__repair_reading_info(); delete from acs_function_args where function = upper('forums_message__repair_reading_info'); end;