[jboss-svn-commits] JBL Code SVN: r28020 - in labs/jbossrules/trunk: drools-compiler/src/test/java/org/drools/integrationtests and 5 other directories.

jboss-svn-commits at lists.jboss.org jboss-svn-commits at lists.jboss.org
Tue Jul 14 17:19:50 EDT 2009


Author: tirelli
Date: 2009-07-14 17:19:49 -0400 (Tue, 14 Jul 2009)
New Revision: 28020

Modified:
   labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/PropagationContext.java
   labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ObjectRetractedEvent.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Behavior.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingLengthWindow.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/TimerService.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java
   labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/PseudoClockScheduler.java
Log:
Improving support for idle and time to next job

Modified: labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/PropagationContext.java
===================================================================
--- labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/PropagationContext.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-api/src/main/java/org/drools/runtime/rule/PropagationContext.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -9,6 +9,15 @@
     public static final int RULE_ADDITION = 3;
     public static final int RULE_REMOVAL  = 4;
     public static final int EXPIRATION    = 5;
+    
+    public static final String[] typeDescr = new String[] {
+                                                           "ASSERTION",
+                                                           "RETRACTION",
+                                                           "MODIFICATION",
+                                                           "RULE_ADDITION",
+                                                           "RULE_REMOVAL",
+                                                           "EXPIRATION"
+    };
 
     public long getPropagationNumber();
 

Modified: labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java
===================================================================
--- labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/CepEspTest.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -20,6 +20,7 @@
 import org.drools.SessionConfiguration;
 import org.drools.StatefulSession;
 import org.drools.StockTick;
+import org.drools.audit.WorkingMemoryFileLogger;
 import org.drools.base.evaluators.TimeIntervalParser;
 import org.drools.builder.KnowledgeBuilder;
 import org.drools.builder.KnowledgeBuilderFactory;
@@ -1071,7 +1072,7 @@
 
     }
 
-    public void testIdleTime2() throws Exception {
+    public void testIdleTimeAndTimeToNextJob() throws Exception {
         // read in the source
         final Reader reader = new InputStreamReader( getClass().getResourceAsStream( "test_CEP_SimpleTimeWindow.drl" ) );
         final RuleBaseConfiguration rbconf = new RuleBaseConfiguration();
@@ -1083,87 +1084,106 @@
         conf.setClockType( ClockType.PSEUDO_CLOCK );
         StatefulSession wm = ruleBase.newStatefulSession( conf,
                                                           null );
+        WorkingMemoryFileLogger logger = new WorkingMemoryFileLogger(wm);
+        logger.setFileName( "audit" );
 
-        List results = new ArrayList();
+        try {
+            List results = new ArrayList();
 
-        wm.setGlobal( "results",
-                      results );
-        InternalWorkingMemory iwm = (InternalWorkingMemory) wm;
+            wm.setGlobal( "results",
+                          results );
+            InternalWorkingMemory iwm = (InternalWorkingMemory) wm;
 
-        // how to initialize the clock?
-        // how to configure the clock?
-        SessionPseudoClock clock = (SessionPseudoClock) wm.getSessionClock();
-        clock.advanceTime( 5,
-                           TimeUnit.SECONDS ); // 5 seconds
-        wm.insert( new OrderEvent( "1",
-                                   "customer A",
-                                   70 ) );
-        assertEquals( 0,
-                      iwm.getIdleTime() );
+            // how to initialize the clock?
+            // how to configure the clock?
+            SessionPseudoClock clock = (SessionPseudoClock) wm.getSessionClock();
+            clock.advanceTime( 5,
+                               TimeUnit.SECONDS ); // 5 seconds
+            
+            // there is no next job, so returns -1
+            assertEquals( -1, iwm.getTimeToNextJob());
+            wm.insert( new OrderEvent( "1",
+                                       "customer A",
+                                       70 ) );
+            assertEquals( 0,
+                          iwm.getIdleTime() );
+            // now, there is a next job in 30 seconds: expire the event
+            assertEquals( 30000, iwm.getTimeToNextJob());
 
-        wm.fireAllRules();
-        assertEquals( 1,
-                      results.size() );
-        assertEquals( 70,
-                      ((Number) results.get( 0 )).intValue() );
+            wm.fireAllRules();
+            assertEquals( 1,
+                          results.size() );
+            assertEquals( 70,
+                          ((Number) results.get( 0 )).intValue() );
 
-        // advance clock and assert new data
-        clock.advanceTime( 10,
-                           TimeUnit.SECONDS ); // 10 seconds
-        wm.insert( new OrderEvent( "2",
-                                   "customer A",
-                                   60 ) );
-        wm.fireAllRules();
+            // advance clock and assert new data
+            clock.advanceTime( 10,
+                               TimeUnit.SECONDS ); // 10 seconds
+            // next job is in 20 seconds: expire the event
+            assertEquals( 20000, iwm.getTimeToNextJob());
+            
+            wm.insert( new OrderEvent( "2",
+                                       "customer A",
+                                       60 ) );
+            wm.fireAllRules();
 
-        assertEquals( 2,
-                      results.size() );
-        assertEquals( 65,
-                      ((Number) results.get( 1 )).intValue() );
+            assertEquals( 2,
+                          results.size() );
+            assertEquals( 65,
+                          ((Number) results.get( 1 )).intValue() );
 
-        // advance clock and assert new data
-        clock.advanceTime( 10,
-                           TimeUnit.SECONDS ); // 10 seconds
-        wm.insert( new OrderEvent( "3",
-                                   "customer A",
-                                   50 ) );
-        wm.fireAllRules();
-        assertEquals( 3,
-                      results.size() );
-        assertEquals( 60,
-                      ((Number) results.get( 2 )).intValue() );
+            // advance clock and assert new data
+            clock.advanceTime( 10,
+                               TimeUnit.SECONDS ); // 10 seconds
+            // next job is in 10 seconds: expire the event
+            assertEquals( 10000, iwm.getTimeToNextJob());
+            
+            wm.insert( new OrderEvent( "3",
+                                       "customer A",
+                                       50 ) );
+            wm.fireAllRules();
+            assertEquals( 3,
+                          results.size() );
+            assertEquals( 60,
+                          ((Number) results.get( 2 )).intValue() );
 
-        // advance clock and assert new data
-        clock.advanceTime( 10,
-                           TimeUnit.SECONDS ); // 10 seconds
-        // advancing clock time will cause events to expire
-        assertEquals( 0,
-                      iwm.getIdleTime() );
+            // advance clock and assert new data
+            clock.advanceTime( 10,
+                               TimeUnit.SECONDS ); // 10 seconds
+            // advancing clock time will cause events to expire
+            assertEquals( 0,
+                          iwm.getIdleTime() );
+            // next job is in 10 seconds: expire another event
+            //assertEquals( 10000, iwm.getTimeToNextJob());
 
-        wm.insert( new OrderEvent( "4",
-                                   "customer A",
-                                   25 ) );
-        wm.fireAllRules();
+            wm.insert( new OrderEvent( "4",
+                                       "customer A",
+                                       25 ) );
+            wm.fireAllRules();
 
-        // first event should have expired, making average under the rule threshold, so no additional rule fire
-        assertEquals( 3,
-                      results.size() );
+            // first event should have expired, making average under the rule threshold, so no additional rule fire
+            assertEquals( 3,
+                          results.size() );
 
-        // advance clock and assert new data
-        clock.advanceTime( 10,
-                           TimeUnit.SECONDS ); // 10 seconds
+            // advance clock and assert new data
+            clock.advanceTime( 10,
+                               TimeUnit.SECONDS ); // 10 seconds
 
-        wm.insert( new OrderEvent( "5",
-                                   "customer A",
-                                   70 ) );
-        assertEquals( 0,
-                      iwm.getIdleTime() );
+            wm.insert( new OrderEvent( "5",
+                                       "customer A",
+                                       70 ) );
+            assertEquals( 0,
+                          iwm.getIdleTime() );
 
-        //        wm  = SerializationHelper.serializeObject(wm);
-        wm.fireAllRules();
+            //        wm  = SerializationHelper.serializeObject(wm);
+            wm.fireAllRules();
 
-        // still under the threshold, so no fire
-        assertEquals( 3,
-                      results.size() );
+            // still under the threshold, so no fire
+            assertEquals( 3,
+                          results.size() );
+        } finally {
+            logger.writeToDisk();
+        }
     }
 
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ObjectRetractedEvent.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ObjectRetractedEvent.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/event/ObjectRetractedEvent.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -29,6 +29,8 @@
     private final FactHandle  handle;
 
     private final Object      oldObject;
+    
+    private final int         type;
 
     public ObjectRetractedEvent(final WorkingMemory workingMemory,
                                 final PropagationContext propagationContext,
@@ -38,6 +40,7 @@
                propagationContext );
         this.handle = handle;
         this.oldObject = oldObject;
+        this.type = propagationContext.getType();
     }
 
     public FactHandle getFactHandle() {
@@ -48,7 +51,12 @@
         return this.oldObject;
     }
 
+    public int getType() {
+        return this.type;
+    }
+    
     public String toString() {
-        return "[ObjectRetracted: handle=" + this.handle + "; old_object=" + this.oldObject + "]";
+        return "[ObjectRetracted: type="+PropagationContext.typeDescr[type]+" handle=" + this.handle + "; old_object=" + this.oldObject + "]";
     }
+    
 }
\ No newline at end of file

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/reteoo/builder/PatternBuilder.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -279,6 +279,11 @@
                 }
                 
             }
+            for( Behavior behavior : pattern.getBehaviors() ) {
+                if( behavior.getExpirationOffset() != -1 ) {
+                    expirationOffset = Math.max( behavior.getExpirationOffset(), expirationOffset );
+                }
+            }
             if( expirationOffset == 0) {
                 otn.setExpirationOffset( context.getTemporalDistance().getExpirationOffset( pattern ) );
             } else {

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Behavior.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Behavior.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/Behavior.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -92,5 +92,17 @@
      */
     public void expireTuples(Object context, 
                              InternalWorkingMemory workingMemory);
+
+    /**
+     * Some behaviors might change the expiration offset for the 
+     * associated fact type. Example: time sliding windows. 
+     * 
+     * For these behaviors, this method must return the expiration
+     * offset associated to them.
+     * 
+     * @return the expiration offset for this behavior or -1 if 
+     *         they don't have a time based expiration offset.
+     */
+    public long getExpirationOffset();
     
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingLengthWindow.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingLengthWindow.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingLengthWindow.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -148,6 +148,14 @@
     }
     
 
+    /**
+     * Length windows don't change expiration offset, so
+     * always return -1
+     */
+    public long getExpirationOffset() {
+        return -1;
+    }
+
     public String toString() {
         return "SlidingLengthWindow( size="+size+" )";
     }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/rule/SlidingTimeWindow.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -26,6 +26,7 @@
 import java.util.PriorityQueue;
 
 import org.drools.common.EventFactHandle;
+import org.drools.common.InternalFactHandle;
 import org.drools.common.InternalWorkingMemory;
 import org.drools.common.PropagationContextImpl;
 import org.drools.common.WorkingMemoryAction;
@@ -156,11 +157,12 @@
                                             tuple ) ) {
             queue.expiringTuple = tuple;
             queue.queue.remove();
+            final InternalFactHandle handle = tuple.getFactHandle();
             final PropagationContext propagationContext = new PropagationContextImpl( workingMemory.getNextPropagationIdCounter(),
                                                                                       PropagationContext.EXPIRATION,
                                                                                       null,
                                                                                       null,
-                                                                                      tuple.getFactHandle() );
+                                                                                      handle );
             tuple.getRightTupleSink().retractRightTuple( tuple,
                                                          propagationContext,
                                                          workingMemory );
@@ -200,6 +202,10 @@
         }
     }
 
+    public long getExpirationOffset() {
+        return this.size;
+    }
+
     public String toString() {
         return "SlidingTimeWindow( size=" + size + " )";
     }
@@ -337,7 +343,5 @@
             // TODO Auto-generated method stub
 
         }
-
     }
-
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/TimerService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/TimerService.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/TimerService.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -55,5 +55,14 @@
 	 * Shuts the service down
 	 */
     public void shutdown();
+    
+    /**
+     * Returns the number of time units (usually ms) to
+     * the next scheduled job
+     * 
+     * @return the number of time units until the next scheduled job or -1 if
+     *         there is no job scheduled
+     */
+    public long getTimeToNextJob();
 	
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/JDKTimerService.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -165,4 +165,9 @@
 
     }
 
+    public long getTimeToNextJob() {
+        // TODO Auto-generated method stub
+        return 0;
+    }
+
 }

Modified: labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/PseudoClockScheduler.java
===================================================================
--- labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/PseudoClockScheduler.java	2009-07-14 21:09:04 UTC (rev 28019)
+++ labs/jbossrules/trunk/drools-core/src/main/java/org/drools/time/impl/PseudoClockScheduler.java	2009-07-14 21:19:49 UTC (rev 28020)
@@ -124,8 +124,8 @@
     /**
      * @inheritDoc
      */
-    public long advanceTime(long amount,
-                            TimeUnit unit) {
+    public synchronized long advanceTime(long amount,
+                                         TimeUnit unit) {
         this.timer += unit.toMillis( amount );
         this.runCallBacks();
         return this.timer;
@@ -158,7 +158,7 @@
 
     private void runCallBacks() {
         ScheduledJob item = queue.peek();
-        while ( item != null && ( item.getTrigger().hasNextFireTime().getTime() <= this.timer ) ) {
+        while ( item != null && (item.getTrigger().hasNextFireTime().getTime() <= this.timer) ) {
             // remove the head
             queue.remove();
             // updates the trigger
@@ -174,6 +174,11 @@
         }
     }
 
+    public synchronized long getTimeToNextJob() {
+        ScheduledJob item = queue.peek();
+        return ( item != null ) ? item.getTrigger().hasNextFireTime().getTime() - this.timer : -1;
+    }
+
     /**
      * An Scheduled Job class with all fields final to make it
      * multi-thread safe.




More information about the jboss-svn-commits mailing list