From 9eadecd960757d95bcdee5e9829486b697a00b12 Mon Sep 17 00:00:00 2001 From: Edson Tirelli Date: Sat, 22 Oct 2011 16:29:08 -0400 Subject: [PATCH] JBRULES-3260: fixing expiration calculation for non-expiring events (cherry picked from commit db904a742ebfb6bab48b96f095d7990d3cfe3547) --- .../drools/integrationtests/StreamsTest.java | 66 +++++++++++++++++-- .../org/drools/reteoo/ReteooRuleBase.java | 5 +- 2 files changed, 66 insertions(+), 5 deletions(-) diff --git a/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java b/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java index 13de000fe16..c36b1057432 100644 --- a/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java +++ b/drools-compiler/src/test/java/org/drools/integrationtests/StreamsTest.java @@ -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; @@ -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; /** @@ -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 ); @@ -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 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() ); + } + } + } + } diff --git a/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java b/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java index f5afeda9408..58fb8149dba 100644 --- a/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java +++ b/drools-core/src/main/java/org/drools/reteoo/ReteooRuleBase.java @@ -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 ) ); } } }