Index: openacs-4/packages/views/views.info =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/views/views.info,v diff -u -N -r1.4 -r1.5 --- openacs-4/packages/views/views.info 17 Oct 2008 10:58:15 -0000 1.4 +++ openacs-4/packages/views/views.info 2 Nov 2013 16:15:13 -0000 1.5 @@ -8,7 +8,7 @@ t views - + Jeff Davis Track views of objects. Xarg @@ -17,7 +17,7 @@ http://www.gnu.org/copyleft/gpl.html 0 - + Index: openacs-4/packages/views/lib/views-chunk.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/views/lib/views-chunk.tcl,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/views/lib/views-chunk.tcl 2 Aug 2007 08:32:10 -0000 1.3 +++ openacs-4/packages/views/lib/views-chunk.tcl 2 Nov 2013 16:15:13 -0000 1.4 @@ -32,7 +32,7 @@ set user_filter_label "" } else { if {[info exists viewer_id]} { - if {![empty_string_p $viewer_id]} { + if {$viewer_id ne ""} { set user_filter_label [acs_user::get_element -user_id $viewer_id -element name] } else { set user_filter_label All Index: openacs-4/packages/views/sql/postgresql/views-procs.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/views/sql/postgresql/views-procs.sql,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/views/sql/postgresql/views-procs.sql 1 Aug 2007 08:59:56 -0000 1.3 +++ openacs-4/packages/views/sql/postgresql/views-procs.sql 2 Nov 2013 16:15:13 -0000 1.4 @@ -12,12 +12,18 @@ -- License. Full text of the license is available from the GNU Project: -- http://www.fsf.org/copyleft/gpl.html -create or replace function views__record_view (integer, integer) returns integer as ' -declare - p_object_id alias for $1; - p_viewer_id alias for $2; + + +-- +-- procedure views__record_view/2 +-- +CREATE OR REPLACE FUNCTION views__record_view( + p_object_id integer, + p_viewer_id integer +) RETURNS integer AS $$ +DECLARE v_views views_views.views_count%TYPE; -begin +BEGIN select views_count into v_views from views_views where object_id = p_object_id and viewer_id = p_viewer_id; if v_views is null then @@ -32,19 +38,26 @@ end if; return v_views + 1; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; comment on function views__record_view(integer, integer) is 'update the view count of object_id for viewer viewer_id, returns view count'; select define_function_args('views__record_view','object_id,viewer_id'); -create or replace function views_by_type__record_view (integer, integer, varchar) returns integer as ' -declare - p_object_id alias for $1; - p_viewer_id alias for $2; - p_view_type alias for $3; + + +-- +-- procedure views_by_type__record_view/3 +-- +CREATE OR REPLACE FUNCTION views_by_type__record_view( + p_object_id integer, + p_viewer_id integer, + p_view_type varchar +) RETURNS integer AS $$ +DECLARE v_views views_views.views_count%TYPE; -begin +BEGIN select views_count into v_views from views_by_type where object_id = p_object_id and viewer_id = p_viewer_id and view_type = p_view_type; if v_views is null then @@ -60,7 +73,8 @@ end if; return v_views + 1; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; comment on function views_by_type__record_view(integer, integer, varchar) is 'update the view by type count of object_id for viewer viewer_id, returns view count'; Index: openacs-4/packages/views/sql/postgresql/views-triggers.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/views/sql/postgresql/views-triggers.sql,v diff -u -N -r1.3 -r1.4 --- openacs-4/packages/views/sql/postgresql/views-triggers.sql 1 Aug 2007 08:59:56 -0000 1.3 +++ openacs-4/packages/views/sql/postgresql/views-triggers.sql 2 Nov 2013 16:15:13 -0000 1.4 @@ -12,8 +12,8 @@ -- License. Full text of the license is available from the GNU Project: -- http://www.fsf.org/copyleft/gpl.html -create function views_views_ins_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_views_ins_tr () RETURNS trigger AS $$ +BEGIN if not exists (select 1 from view_aggregates where object_id = new.object_id) then INSERT INTO view_aggregates (object_id,views_count,unique_views,last_viewed) VALUES (new.object_id,1,1,now()); @@ -24,21 +24,23 @@ end if; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_views_ins_tr after insert on views_views for each row execute procedure views_views_ins_tr(); -create function views_views_upd_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_views_upd_tr () RETURNS trigger AS $$ +BEGIN UPDATE view_aggregates SET views_count = views_count + 1, last_viewed = now() WHERE object_id = new.object_id; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_views_upd_tr after update on views_views @@ -47,8 +49,8 @@ -- XXXJCD: Should there be a delete trigger? -create or replace function views_by_type_ins_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_by_type_ins_tr () RETURNS trigger AS $$ +BEGIN if not exists (select 1 from view_aggregates_by_type where object_id = new.object_id and view_type = new.view_type) then INSERT INTO view_aggregates_by_type (object_id,view_type,views_count,unique_views,last_viewed) VALUES (new.object_id,new.view_type,1,1,now()); @@ -60,22 +62,24 @@ end if; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_by_type_ins_tr after insert on views_by_type for each row execute procedure views_by_type_ins_tr(); -create or replace function views_by_type_upd_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_by_type_upd_tr () RETURNS trigger AS $$ +BEGIN UPDATE view_aggregates_by_type SET views_count = views_count + 1, last_viewed = now() WHERE object_id = new.object_id AND view_type = new.view_type; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_by_type_upd_tr after update on views_by_type Index: openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d-0.1d2.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d-0.1d2.sql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d-0.1d2.sql 23 Jul 2007 05:25:10 -0000 1.1 +++ openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d-0.1d2.sql 2 Nov 2013 16:15:13 -0000 1.2 @@ -44,13 +44,19 @@ '; -create or replace function views_by_type__record_view (integer, integer, varchar) returns integer as ' -declare - p_object_id alias for $1; - p_viewer_id alias for $2; - p_type alias for $3; + + +-- +-- procedure views_by_type__record_view/3 +-- +CREATE OR REPLACE FUNCTION views_by_type__record_view( + p_object_id integer, + p_viewer_id integer, + p_type varchar +) RETURNS integer AS $$ +DECLARE v_views views.views%TYPE; -begin +BEGIN select views into v_views from views_by_type where object_id = p_object_id and viewer_id = p_viewer_id and type = p_type; if v_views is null then @@ -66,14 +72,15 @@ end if; return v_views + 1; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; comment on function views_by_type__record_view(integer, integer, varchar) is 'update the view by type count of object_id for viewer viewer_id, returns view count'; select define_function_args('views_by_type__record_view','object_id,viewer_id,type'); -create function views_by_type_ins_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_by_type_ins_tr () RETURNS trigger AS $$ +BEGIN if not exists (select 1 from view_aggregates_by_type where object_id = new.object_id and type = new.type) then INSERT INTO view_aggregates_by_type (object_id,type,views,unique_views,last_viewed) VALUES (new.object_id,new.type,1,1,now()); @@ -85,22 +92,24 @@ end if; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_by_type_ins_tr after insert on views_by_type for each row execute procedure views_by_type_ins_tr(); -create function views_by_type_upd_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_by_type_upd_tr () RETURNS trigger AS $$ +BEGIN UPDATE view_aggregates_by_type SET views = views + 1, last_viewed = now() WHERE object_id = new.object_id AND type = new.type; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_by_type_upd_tr after update on views_by_type Index: openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d2-0.1d3.sql =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d2-0.1d3.sql,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d2-0.1d3.sql 1 Aug 2007 08:59:57 -0000 1.1 +++ openacs-4/packages/views/sql/postgresql/upgrade/upgrade-0.1d2-0.1d3.sql 2 Nov 2013 16:15:13 -0000 1.2 @@ -34,12 +34,21 @@ --Modify function with new table and column names. -create or replace function views__record_view (integer, integer) returns integer as ' -declare - p_object_id alias for $1; - p_viewer_id alias for $2; + + +-- added +select define_function_args('views__record_view','object_id,viewer_id'); + +-- +-- procedure views__record_view/2 +-- +CREATE OR REPLACE FUNCTION views__record_view( + p_object_id integer, + p_viewer_id integer +) RETURNS integer AS $$ +DECLARE v_views views_views.views_count%TYPE; -begin +BEGIN select views_count into v_views from views_views where object_id = p_object_id and viewer_id = p_viewer_id; if v_views is null then @@ -54,12 +63,13 @@ end if; return v_views + 1; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; --Create new triggers with new names -create or replace function views_views_ins_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_views_ins_tr () RETURNS trigger AS $$ +BEGIN if not exists (select 1 from view_aggregates where object_id = new.object_id) then INSERT INTO view_aggregates (object_id,views_count,unique_views,last_viewed) VALUES (new.object_id,1,1,now()); @@ -70,35 +80,43 @@ end if; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_views_ins_tr after insert on views_views for each row execute procedure views_views_ins_tr(); -create or replace function views_views_upd_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_views_upd_tr () RETURNS trigger AS $$ +BEGIN UPDATE view_aggregates SET views_count = views_count + 1, last_viewed = now() WHERE object_id = new.object_id; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_views_upd_tr after update on views_views for each row execute procedure views_views_upd_tr(); -create or replace function views_by_type__record_view (integer, integer, varchar) returns integer as ' -declare - p_object_id alias for $1; - p_viewer_id alias for $2; - p_view_type alias for $3; + + +-- +-- procedure views_by_type__record_view/3 +-- +CREATE OR REPLACE FUNCTION views_by_type__record_view( + p_object_id integer, + p_viewer_id integer, + p_view_type varchar +) RETURNS integer AS $$ +DECLARE v_views views_views.views_count%TYPE; -begin +BEGIN select views_count into v_views from views_by_type where object_id = p_object_id and viewer_id = p_viewer_id and view_type = p_view_type; if v_views is null then @@ -114,14 +132,15 @@ end if; return v_views + 1; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; comment on function views_by_type__record_view(integer, integer, varchar) is 'update the view by type count of object_id for viewer viewer_id, returns view count'; select define_function_args('views_by_type__record_view','object_id,viewer_id,view_type'); -create or replace function views_by_type_ins_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_by_type_ins_tr () RETURNS trigger AS $$ +BEGIN if not exists (select 1 from view_aggregates_by_type where object_id = new.object_id and view_type = new.view_type) then INSERT INTO view_aggregates_by_type (object_id,view_type,views_count,unique_views,last_viewed) VALUES (new.object_id,new.view_type,1,1,now()); @@ -133,22 +152,24 @@ end if; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_by_type_ins_tr after insert on views_by_type for each row execute procedure views_by_type_ins_tr(); -create or replace function views_by_type_upd_tr () returns opaque as ' -begin +CREATE OR REPLACE FUNCTION views_by_type_upd_tr () RETURNS trigger AS $$ +BEGIN UPDATE view_aggregates_by_type SET views_count = views_count + 1, last_viewed = now() WHERE object_id = new.object_id AND view_type = new.view_type; return new; -end;' language 'plpgsql'; +END; +$$ LANGUAGE plpgsql; create trigger views_by_type_upd_tr after update on views_by_type Index: openacs-4/packages/views/tcl/test/views-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/views/tcl/test/views-procs.tcl,v diff -u -N -r1.1 -r1.2 --- openacs-4/packages/views/tcl/test/views-procs.tcl 2 Aug 2007 08:33:39 -0000 1.1 +++ openacs-4/packages/views/tcl/test/views-procs.tcl 2 Nov 2013 16:15:13 -0000 1.2 @@ -18,32 +18,32 @@ set object_id_list [db_list get_object_id_list "select ao.object_id from acs_objects ao left outer join (select object_id from views_views where viewer_id != :viewer_id) vt on ao.object_id = vt.object_id"] set object_id [lindex [util::randomize_list $object_id_list] 0] - aa_false "User view object_id" [expr [views::viewed_p -object_id $object_id -user_id 0] > 0] + aa_false "User view object_id" [expr {[views::viewed_p -object_id $object_id -user_id 0] > 0}] aa_log "User_id is $viewer_id, object is $object_id" views::record_view -object_id $object_id -viewer_id $viewer_id set count_record [db_string count_record "select count(*) from views_views where object_id = :object_id and viewer_id = :viewer_id" -default 0] - aa_true "Record add" [expr $count_record > 0] + aa_true "Record add" [expr {$count_record > 0}] set count_views [db_string count_views "select views_count from views_views where object_id = :object_id and viewer_id = :viewer_id" -default 0] views::record_view -object_id $object_id -viewer_id $viewer_id #Update count views set count_record [db_string count_record "select count(*) from views_views where object_id = :object_id and viewer_id = :viewer_id" -default 0] - aa_true "Update record but don't insert new row" [expr $count_record == 1] + aa_true "Update record but don't insert new row" [expr {$count_record == 1}] set count_views2 [db_string count_views2 "select views_count from views_views where object_id = :object_id and viewer_id = :viewer_id" -default 0] - aa_true "Count_view is updated" [expr $count_views2 > $count_views] + aa_true "Count_view is updated" [expr {$count_views2 > $count_views}] set get [views::get -object_id $object_id] aa_log "Return of function views::get $get" - aa_true "User view object_id" [expr [views::viewed_p -object_id $object_id -user_id $viewer_id] > 0] + aa_true "User view object_id" [expr {[views::viewed_p -object_id $object_id -user_id $viewer_id] > 0}] set all_views_count [db_string count_views_views "select sum(views_count) from views_views where object_id = :object_id"] set view_count_aggregates [db_string get_views_count "select views_count from view_aggregates where object_id = :object_id"] @@ -70,32 +70,32 @@ set type test - aa_false "User has viewed object_id" [expr [views::viewed_p -object_id $object_id -user_id $viewer_id -type $type] > 0] + aa_false "User has viewed object_id" [expr {[views::viewed_p -object_id $object_id -user_id $viewer_id -type $type] > 0}] aa_log "User_id is $viewer_id, object is $object_id and type $type" views::record_view -object_id $object_id -viewer_id $viewer_id -type $type set count_record [db_string count_record "select count(*) from views_by_type where object_id = :object_id and viewer_id = :viewer_id" -default 0] - aa_true "Record add" [expr $count_record > 0] + aa_true "Record add" [expr {$count_record > 0}] set count_views [db_string count_views "select views_count from views_by_type where object_id = :object_id and viewer_id = :viewer_id" -default 0] views::record_view -object_id $object_id -viewer_id $viewer_id -type $type #Update count views set count_record [db_string count_record "select count(*) from views_by_type where object_id = :object_id and viewer_id = :viewer_id" -default 0] - aa_true "Update record but don't insert new row" [expr $count_record == 1] + aa_true "Update record but don't insert new row" [expr {$count_record == 1}] set count_views2 [db_string count_views2 "select views_count from views_by_type where object_id = :object_id and viewer_id = :viewer_id" -default 0] - aa_true "Count_view is updated" [expr $count_views2 > $count_views] + aa_true "Count_view is updated" [expr {$count_views2 > $count_views}] set get [views::get -object_id $object_id] aa_log "Return of function views::get $get" - aa_true "User has viewed object_id" [expr [views::viewed_p -object_id $object_id -user_id $viewer_id -type $type] > 0] + aa_true "User has viewed object_id" [expr {[views::viewed_p -object_id $object_id -user_id $viewer_id -type $type] > 0}] set all_views_count [db_string count_views_views "select sum(views_count) from views_by_type where object_id = :object_id and view_type=:type"] set view_count_aggregates [db_string get_views_count "select views_count from view_aggregates_by_type where object_id = :object_id and view_type=:type"] aa_equals "views_count on view_aggregates is equal to sum views_count on views_views" $view_count_aggregates $all_views_count