forward porting r14769: add max_delay field to optionally pre-invalidate events based...
authormiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 4 Nov 2009 19:43:46 +0000 (19:43 +0000)
committermiker <miker@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Wed, 4 Nov 2009 19:43:46 +0000 (19:43 +0000)
git-svn-id: svn://svn.open-ils.org/ILS/trunk@14772 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/examples/fm_IDL.xml
Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm
Open-ILS/src/sql/Pg/002.schema.config.sql
Open-ILS/src/sql/Pg/400.schema.action_trigger.sql
Open-ILS/src/sql/Pg/upgrade/0071.schema.action_trigger.event_definition.max_delay.sql [new file with mode: 0644]

index 611838b..979d121 100644 (file)
@@ -687,6 +687,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
                        <field reporter:label="Success Cleanup" name="cleanup_success"  reporter:datatype="link"/>
                        <field reporter:label="Failure Cleanup" name="cleanup_failure"  reporter:datatype="link"/>
                        <field reporter:label="Processing Delay" name="delay"  reporter:datatype="interval"/>
+                       <field reporter:label="Max Event Validity Delay" name="max_delay"  reporter:datatype="interval"/>
                        <field reporter:label="Processing Delay Context Field" name="delay_field"  reporter:datatype="text"/>
                        <field reporter:label="Processing Group Context Field" name="group_field"  reporter:datatype="text"/>
                        <field reporter:label="Template" name="template"  reporter:datatype="text"/>
index 951bc2c..9bbd14c 100644 (file)
@@ -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'} }, {
index 67ef55f..d65867b 100644 (file)
@@ -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,
index 83b3c10..31ec7df 100644 (file)
@@ -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 (file)
index 0000000..3edcb15
--- /dev/null
@@ -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;
+