[rules-users] streams and equality assertion behavior

Jaroslaw Kijanowski kijanowski at gmail.com
Wed Jul 1 05:56:59 EDT 2009


Hi,
  I've configured my knowledge base to use the EQUALITY assertion behaviour.
When I insert two equal facts into the session, only one gets processed 
(objects and their fact handles are equal).
However when I insert two equal facts via streams, my rule fires twice 
(objects are equal, but their fact handles are not). Isn't equality 
assertion behaviour supported when using streams?

Here's my rule and test class:

package com.sample
import com.sample.Message;
declare Message
   @role( event )
   @timestamp( time )
end

rule "r"
when
   Message( $i:i) //from entry-point "myStream"
then
   System.out.println( $i );
end

+++++++++++++++++++++++++++++++++++++++++

public class Message {

	private int i;
	private Date time;
//getters, setters, hashcode, equals, constructor
}

+++++++++++++++++++++++++++++++++++++++++

public class DroolsTest {
   public static final void main(String[] args) {
     try {
       KnowledgeBase kbase = readKnowledgeBase();
       StatefulKnowledgeSession ksession = 
kbase.newStatefulKnowledgeSession();

       //WorkingMemoryEntryPoint stream = 
ksession.getWorkingMemoryEntryPoint("myStream");

       Date d = new Date();
       Message message1 = new Message(1,d);
       FactHandle fh1 = ksession.insert(message1);
       //FactHandle fh1 = stream.insert(message1);
       Message message2 = new Message(1,d);
       FactHandle fh2 = ksession.insert(message2);
       //FactHandle fh2 = stream.insert(message2);

       if (message1.equals(message2) && fh1.equals(fh2)){
         System.out.println("equal");
       }
       ksession.fireAllRules();
     } catch (Throwable t) {
       t.printStackTrace();
     }
   }

   private static KnowledgeBase readKnowledgeBase() throws Exception {
     KnowledgeBuilder kbuilder = 
KnowledgeBuilderFactory.newKnowledgeBuilder();
     kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), 
ResourceType.DRL);
     if (kbuilder.getErrors().size() > 0) {
       throw new IllegalArgumentException("Could not parse knowledge.");
     }
     KnowledgeBaseConfiguration kbaseConfig = 
KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
     kbaseConfig.setOption(AssertBehaviorOption.EQUALITY);
     kbaseConfig.setOption(EventProcessingOption.STREAM);
     kbaseConfig.setOption(RemoveIdentitiesOption.YES);

     KnowledgeBase kbase = 
KnowledgeBaseFactory.newKnowledgeBase(kbaseConfig);
     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
     return kbase;
   }
}

+++++++++++++++++++++++++++++++++++++++++

Thanks,
  Jarek



More information about the rules-users mailing list