[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