From: miker Date: Wed, 4 Nov 2009 19:43:46 +0000 (+0000) Subject: forward porting r14769: add max_delay field to optionally pre-invalidate events based... X-Git-Tag: kcls-grey-screen-prod1~3094 X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=063e08f9147ffa5b2ae856712e4b57c9cff0f0e3;p=evergreen%2Fequinox.git forward porting r14769: add max_delay field to optionally pre-invalidate events based on a delay window, instead of simply the minimum delay time git-svn-id: svn://svn.open-ils.org/ILS/trunk@14772 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml index 611838ba5c..979d12158c 100644 --- a/Open-ILS/examples/fm_IDL.xml +++ b/Open-ILS/examples/fm_IDL.xml @@ -687,6 +687,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm index 951bc2cf65..9bbd14c216 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm @@ -359,7 +359,13 @@ sub create_batch_events { { hook => [ keys %hook_hash ], active => 't' }, ); - my $first_loop = 1; + my $orig_filter_and = []; + if ($$filter{'-and'}) { + for my $f ( @{ $$filter{'-and'} } ) { + push @$orig_filter_and, $f; + } + } + for my $def ( @$defs ) { my $date = DateTime->now->subtract( seconds => interval_to_seconds($def->delay) ); @@ -381,23 +387,27 @@ sub create_batch_events { ->add( seconds => interval_to_seconds($def->delay) ) ->strftime( '%F %T%z' ); } else { - $filter->{ $def->delay_field } = { - '<=' => DateTime - ->now - ->subtract( seconds => interval_to_seconds($def->delay) ) - ->strftime( '%F %T%z' ) - }; + if ($def->max_delay) { + my @times = sort {$a <=> $b} interval_to_seconds($def->delay), interval_to_seconds($def->max_delay); + $filter->{ $def->delay_field } = { + 'between' => [ + DateTime->now->subtract( seconds => $times[0] )->strftime( '%F %T%z' ), + DateTime->now->subtract( seconds => $times[1] )->strftime( '%F %T%z' ) + ] + }; + } else { + $filter->{ $def->delay_field } = { + '<=' => DateTime->now->subtract( seconds => interval_to_seconds($def->delay) )->strftime( '%F %T%z' ) + }; + } } my $class = _fm_class_by_hint($hook_hash{$def->hook}->core_type); # filter where this target has an event (and it's pending, for active hooks) - if($first_loop) { - $$filter{'-and'} = [] if (!exists($$filter{'-and'})); - $first_loop = 0; - } else { - # remove the pre-existing event check for the previous event def - pop @{ $filter->{'-and'} }; + $$filter{'-and'} = []; + for my $f ( @$orig_filter_and ) { + push @{ $$filter{'-and'} }, $f; } push @{ $filter->{'-and'} }, { diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql index 67ef55f078..d65867b7ad 100644 --- a/Open-ILS/src/sql/Pg/002.schema.config.sql +++ b/Open-ILS/src/sql/Pg/002.schema.config.sql @@ -51,7 +51,7 @@ CREATE TABLE config.upgrade_log ( install_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW() ); -INSERT INTO config.upgrade_log (version) VALUES ('0070'); -- Scott McKellar +INSERT INTO config.upgrade_log (version) VALUES ('0071'); -- miker CREATE TABLE config.bib_source ( id SERIAL PRIMARY KEY, diff --git a/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql b/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql index 83b3c10699..31ec7df55b 100644 --- a/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql +++ b/Open-ILS/src/sql/Pg/400.schema.action_trigger.sql @@ -114,6 +114,7 @@ CREATE TABLE action_trigger.event_definition ( cleanup_success TEXT REFERENCES action_trigger.cleanup (module) DEFERRABLE INITIALLY DEFERRED, cleanup_failure TEXT REFERENCES action_trigger.cleanup (module) DEFERRABLE INITIALLY DEFERRED, delay INTERVAL NOT NULL DEFAULT '5 minutes', + max_delay INTERVAL, delay_field TEXT, -- for instance, xact_start on a circ hook ... look for fields on hook.core_type where datatype=timestamp? If not set, delay from now() group_field TEXT, -- field from this.hook.core_type to batch event targets together on, fed into reactor a group at a time. template TEXT, -- the TT block. will have an 'environment' hash (or array of hashes, grouped events) built up by validator and collector(s), which can be modified. diff --git a/Open-ILS/src/sql/Pg/upgrade/0071.schema.action_trigger.event_definition.max_delay.sql b/Open-ILS/src/sql/Pg/upgrade/0071.schema.action_trigger.event_definition.max_delay.sql new file mode 100644 index 0000000000..3edcb154a9 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/0071.schema.action_trigger.event_definition.max_delay.sql @@ -0,0 +1,10 @@ +-- Already exists as far back as 1.6.0.0, so don't use this in version upgrades + +BEGIN; + +INSERT INTO config.upgrade_log (version) VALUES ('0071'); + +ALTER TABLE action_trigger.event_definition ADD COLUMN max_delay INTERVAL + +COMMIT; +