Skip to content

Commit

Permalink
JBRULES-3260: fixing expiration calculation for non-expiring events
Browse files Browse the repository at this point in the history
(cherry picked from commit db904a7)
  • Loading branch information
etirelli committed Oct 22, 2011
1 parent be69731 commit 9eadecd
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 5 deletions.
Expand Up @@ -51,6 +51,7 @@
import org.drools.SessionConfiguration;
import org.drools.StockTick;
import org.drools.StockTickInterface;
import org.drools.base.ClassObjectType;
import org.drools.builder.KnowledgeBuilder;
import org.drools.builder.KnowledgeBuilderFactory;
import org.drools.builder.ResourceType;
Expand All @@ -61,12 +62,16 @@
import org.drools.event.rule.AgendaEventListener;
import org.drools.event.rule.ObjectRetractedEvent;
import org.drools.event.rule.WorkingMemoryEventListener;
import org.drools.impl.KnowledgeBaseImpl;
import org.drools.io.ResourceFactory;
import org.drools.reteoo.ObjectTypeNode;
import org.drools.reteoo.ReteooRuleBase;
import org.drools.rule.EntryPoint;
import org.drools.runtime.KnowledgeSessionConfiguration;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.conf.ClockTypeOption;
import org.drools.runtime.rule.WorkingMemoryEntryPoint;
import org.drools.spi.ObjectType;
import org.drools.time.impl.PseudoClockScheduler;

/**
Expand Down Expand Up @@ -362,14 +367,23 @@ public void testModifyOnEntryPointFacts() throws Exception {

org.drools.event.rule.AgendaEventListener ael = mock( org.drools.event.rule.AgendaEventListener.class );
ksession.addEventListener( ael );

WorkingMemoryEntryPoint ep1 = ksession.getWorkingMemoryEntryPoint( "ep1" );
WorkingMemoryEntryPoint ep2 = ksession.getWorkingMemoryEntryPoint( "ep2" );
WorkingMemoryEntryPoint ep3 = ksession.getWorkingMemoryEntryPoint( "ep3" );

ep1.insert( new StockTick( 1, "RHT", 10, 1000 ) );
ep2.insert( new StockTick( 1, "RHT", 10, 1000 ) );
ep3.insert( new StockTick( 1, "RHT", 10, 1000 ) );
ep1.insert( new StockTick( 1,
"RHT",
10,
1000 ) );
ep2.insert( new StockTick( 1,
"RHT",
10,
1000 ) );
ep3.insert( new StockTick( 1,
"RHT",
10,
1000 ) );
int rulesFired = ksession.fireAllRules();
assertEquals( 3,
rulesFired );
Expand Down Expand Up @@ -507,4 +521,48 @@ public void testEventExpirationSetToZero() throws Exception {
assertThat( ksession.getObjects().size(),
equalTo( 0 ) );
}

@Test
public void testEventExpirationValue() throws Exception {
String drl1 = "package org.drools.pkg1\n" +
"import org.drools.StockTick\n" +
"declare StockTick\n" +
" @role(event)\n" +
"end\n" +
"rule X\n" +
"when\n" +
" StockTick()\n" +
"then\n" +
"end\n";
String drl2 = "package org.drools.pkg2\n" +
"import org.drools.StockTick\n" +
"declare StockTick\n" +
" @role(event)\n" +
"end\n" +
"rule X\n" +
"when\n" +
" StockTick()\n" +
"then\n" +
"end\n";
KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ResourceFactory.newByteArrayResource( drl1.getBytes() ),
ResourceType.DRL );
kbuilder.add( ResourceFactory.newByteArrayResource( drl2.getBytes() ),
ResourceType.DRL );
assertFalse( kbuilder.getErrors().toString(),
kbuilder.hasErrors() );
KnowledgeBaseConfiguration kconf = KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
kconf.setOption( EventProcessingOption.STREAM );
KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase( kconf );
kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );

List<ObjectTypeNode> otns = ((ReteooRuleBase)((KnowledgeBaseImpl)kbase).getRuleBase()).getRete().getObjectTypeNodes();
ObjectType stot = new ClassObjectType( StockTick.class );
for( ObjectTypeNode otn : otns ) {
if( otn.getObjectType().isAssignableFrom( stot ) ) {
assertEquals( -1, otn.getExpirationOffset() );
}
}
}

}
Expand Up @@ -470,11 +470,14 @@ protected void updateDependentTypes( Package newPkg,
TypeDeclaration typeDeclaration ) {
// update OTNs
if( this.getConfiguration().getEventProcessingMode().equals( EventProcessingOption.STREAM ) ) {
// if the expiration for the type was set, then add 1, otherwise return -1
long exp = typeDeclaration.getExpirationOffset() > -1 ? typeDeclaration.getExpirationOffset() + 1 : -1;

// if we are running in STREAM mode, update expiration offset
for( EntryPointNode ep : this.rete.getEntryPointNodes().values() ) {
for( ObjectTypeNode node : ep.getObjectTypeNodes().values() ) {
if( node.isAssignableFrom( typeDeclaration.getObjectType() ) ) {
node.setExpirationOffset( Math.max( node.getExpirationOffset(), typeDeclaration.getExpirationOffset()+1 ) );
node.setExpirationOffset( Math.max( node.getExpirationOffset(), exp ) );
}
}
}
Expand Down

0 comments on commit 9eadecd

Please sign in to comment.