package org.drools.integrationtests; import java.util.Comparator; import junit.framework.TestCase; import org.drools.Cheese; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.RuleBase; import org.drools.RuleBaseConfiguration; import org.drools.RuleBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.runtime.StatefulKnowledgeSession; import org.drools.runtime.rule.LiveQuery; import org.drools.runtime.rule.Row; import ca.odell.glazedlists.SortedList; public class DroolsEventListTest extends TestCase { protected RuleBase getRuleBase() throws Exception { RuleBaseConfiguration config = new RuleBaseConfiguration(); config.setMultithreadEvaluation( false ); return RuleBaseFactory.newRuleBase( RuleBase.RETEOO, config ); } public void testOpenQuery() throws Exception { String str = ""; str += "package org.drools.test \n"; str += "import org.drools.Cheese \n"; str += "query cheeses(String $type1, String $type2) \n"; str += " stilton : Cheese(type == $type1, $price : price) \n"; str += " cheddar : Cheese(type == $type2, price == stilton.price) \n"; str += "end\n"; KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(); kbuilder.add( ResourceFactory.newByteArrayResource( str.getBytes() ), ResourceType.DRL ); if ( kbuilder.hasErrors() ) { fail( kbuilder.getErrors().toString() ); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() ); StatefulKnowledgeSession ksession = kbase.newStatefulKnowledgeSession(); Cheese stilton1 = new Cheese( "stilton", 1 ); Cheese cheddar1 = new Cheese( "cheddar", 1 ); Cheese stilton2 = new Cheese( "stilton", 2 ); Cheese cheddar2 = new Cheese( "cheddar", 2 ); Cheese stilton3 = new Cheese( "stilton", 3 ); Cheese cheddar3 = new Cheese( "cheddar", 3 ); org.drools.runtime.rule.FactHandle s1Fh = ksession.insert( stilton1 ); org.drools.runtime.rule.FactHandle s2Fh = ksession.insert( stilton2 ); org.drools.runtime.rule.FactHandle s3Fh = ksession.insert( stilton3 ); org.drools.runtime.rule.FactHandle c1Fh = ksession.insert( cheddar1 ); org.drools.runtime.rule.FactHandle c2Fh = ksession.insert( cheddar2 ); org.drools.runtime.rule.FactHandle c3Fh = ksession.insert( cheddar3 ); DroolsEventList list = new DroolsEventList(); // Open the LiveQuery LiveQuery query = ksession.openLiveQuery( "cheeses", new Object[] { "cheddar", "stilton" } , list ); SortedList<Row> sorted = new SortedList<Row>( list, new Comparator<Row>() { public int compare(Row r1, Row r2) { Cheese c1 = ( Cheese ) r1.get( "stilton" ); Cheese c2 = ( Cheese ) r2.get( "stilton" ); return c1.getPrice() - c2.getPrice(); } }); assertEquals( 3, sorted.size() ); assertEquals( 1, ((Cheese)sorted.get( 0 ).get( "stilton" )).getPrice() ); assertEquals( 2, ((Cheese)sorted.get( 1 ).get( "stilton" )).getPrice() ); assertEquals( 3, ((Cheese)sorted.get( 2 ).get( "stilton" )).getPrice() ); // alter the price to remove the last row stilton3.setPrice( 4 ); ksession.update( s3Fh, stilton3 ); assertEquals( 2, sorted.size() ); assertEquals( 1, ((Cheese)sorted.get( 0 ).get( "stilton" )).getPrice() ); assertEquals( 2, ((Cheese)sorted.get( 1 ).get( "stilton" )).getPrice() ); // alter the price to put the last row back in stilton3.setPrice( 3 ); ksession.update( s3Fh, stilton3 ); assertEquals( 3, sorted.size() ); assertEquals( 1, ((Cheese)sorted.get( 0 ).get( "stilton" )).getPrice() ); assertEquals( 2, ((Cheese)sorted.get( 1 ).get( "stilton" )).getPrice() ); assertEquals( 3, ((Cheese)sorted.get( 2 ).get( "stilton" )).getPrice() ); // alter the price to remove the middle row stilton2.setPrice( 4 ); ksession.update( s2Fh, stilton2 ); assertEquals( 2, sorted.size() ); assertEquals( 1, ((Cheese)sorted.get( 0 ).get( "stilton" )).getPrice() ); assertEquals( 3, ((Cheese)sorted.get( 1 ).get( "stilton" )).getPrice() ); // alter the price to add the previous middle rows to the end cheddar2.setPrice( 4 ); ksession.update( c2Fh, cheddar2 ); assertEquals( 3, sorted.size() ); assertEquals( 1, ((Cheese)sorted.get( 0 ).get( "stilton" )).getPrice() ); assertEquals( 3, ((Cheese)sorted.get( 1 ).get( "stilton" )).getPrice() ); assertEquals( 4, ((Cheese)sorted.get( 2 ).get( "stilton" )).getPrice() ); // Check a standard retract ksession.retract( s1Fh ); assertEquals( 2, sorted.size() ); assertEquals( 3, ((Cheese)sorted.get( 0 ).get( "stilton" )).getPrice() ); assertEquals( 4, ((Cheese)sorted.get( 1 ).get( "stilton" )).getPrice() ); // Close the query, we should get removed events for each row query.close(); assertEquals( 0, sorted.size() ); } }