The first firing of "Faults coincide" is a bug.

Rule "Faults don't coincide" doesn't do what I think you want it to do
- "or" is inclusive, not exclusive.

I'd recommend using this rule:
rule "Detect"
when
    f1 : MyEvent( key == "faultType1", value == "ALARM" )
         not MyEvent( key == "faultType1", this after f1 )
    f2 : MyEvent( key == "faultType2", value == "ALARM" )
         not MyEvent( key == "faultType2", this after f2 )
then
    System.out.println( "************ BOTH FAULTS ARE ACTIVE! f1.key =
" + f1.getKey() + " f2.key = " + f2.getKey() );
end

-W


On 22/06/2012, Ladd <l...@codemettle.com> wrote:
> I'm new to Drools and have what I think should be a simple use case.  But
> I'm
> getting some puzzling results from my tests.
>
> I have a simple class with just a key and value.  What I want to detect is
> when the last occurrence with key "X" has a value of "ALARM" and the last
> occurrence with key "Y" has a value of "ALARM".
>
> Could someone please either educate me or point me to the documentation
> that
> explains how this would be done?  Many thanks in advance!!
>
> Here's my test code and results:
>
> *The event class:*
> public class MyEvent {
>       
>       String key;
>       String value;
>       
>       public MyEvent( String key, String value ) {
>               this.key = key;
>               this.value = value;
>       }
>       
>       public String getKey() {
>               return key;
>       }
>       public void setKey(String key) {
>               this.key = key;
>       }
>       public String getValue() {
>               return value;
>       }
>       public void setValue(String value) {
>               this.value = value;
>       }
> }
>
> *The test runner:*
>       @Test
>       public void testWindowLen1() {
>       
>               StringBuilder sb = new StringBuilder();
>               
>               sb.append( "import drools.tests.MyEvent \n" );
>               sb.append( " \n" );
>               
>               sb.append( "declare MyEvent @role(event) end \n" );
>               sb.append( " \n" );
>               
>               sb.append( "rule \"Any event detected\" \n" );
>               sb.append( " \n" );
>               sb.append( "salience 10 \n" );
>               sb.append( "when \n" );
>               sb.append( "    f : MyEvent() \n" );
>               sb.append( "then \n" );
>               sb.append( "    System.out.println( \"************ fault seen 
> with key \" +
> f.getKey() + \" value \" + f.getValue() ); \n" );
>               sb.append( "end \n" );
>               sb.append( " \n" );
>               
>               sb.append( "rule \"Faults coincide\" \n" );
>               sb.append( " \n" );
>               sb.append( "when \n" );
>               sb.append( "    f1 : MyEvent( key == \"faultType1\", value == 
> \"ALARM\" )
> over window:length( 1 ) \n" );
>               sb.append( "    f2 : MyEvent( key == \"faultType2\", value == 
> \"ALARM\" )
> over window:length( 1 ) \n" );
>               sb.append( "then \n" );
>               sb.append( "    System.out.println( \"************ both faults 
> are active!
> f1.key = \" + f1.getKey() + \" f2.key = \" + f2.getKey() ); \n" );
>               sb.append( "end \n" );
>               sb.append( " \n" );
>               
>               sb.append( "rule \"Faults don't coincide\" \n" );
>               sb.append( " \n" );
>               sb.append( "when \n" );
>               sb.append( "    f1 : MyEvent( key == \"faultType1\", value != 
> \"ALARM\" )
> over window:length( 1 ) \n" );
>               sb.append( "            or \n" );
>               sb.append( "    f2 : MyEvent( key == \"faultType2\", value != 
> \"ALARM\" )
> over window:length( 1 ) \n" );
>               sb.append( "then \n" );
>               sb.append( "    System.out.println( \"************ at least one 
> fault isn't
> active!\" ); \n" );
>               sb.append( "end \n" );
>               
>               
>               StatefulKnowledgeSession ksession = null;
>               KnowledgeBase kbase = null;
>               KnowledgeBaseConfiguration config =
> KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
>               config.setOption( EventProcessingOption.STREAM );
>               
>               kbase = KnowledgeBaseFactory.newKnowledgeBase( config );
>               
>               ksession = kbase.newStatefulKnowledgeSession();
>               
>               KnowledgeBuilder kbuilder =
> KnowledgeBuilderFactory.newKnowledgeBuilder();
>               
>               kbuilder.add( ResourceFactory.newByteArrayResource(
> sb.toString().getBytes() ), ResourceType.DRL );
>               if( kbuilder.hasErrors() ) {
>                       System.err.println( kbuilder.getErrors().toString() );
>               } else {
>                       kbase.addKnowledgePackages( 
> kbuilder.getKnowledgePackages() );
>               }
>               
>               // Inject the first fault = ALARM
>               MyEvent faultType1Alarm = new MyEvent( "faultType1", "ALARM" );
>               System.out.println( "Firing fault1 = ALARM" );
>               ksession.insert( faultType1Alarm );
>               ksession.fireAllRules();
>               
>               // Inject the second fault = ALARM
>               // Want this to trigger the "Faults concide" rule
>               MyEvent faultType2Alarm = new MyEvent( "faultType2", "ALARM" );
>               System.out.println( "Firing fault2 = ALARM" );
>               ksession.insert( faultType2Alarm );
>               ksession.fireAllRules();
>               
>               // Inject the first fault = OK
>               // Want this to trigger the "Faults don't concide" rule
>               MyEvent faultType1OK = new MyEvent( "faultType1", "OK" );
>               System.out.println( "Firing fault1 = OK" );
>               ksession.insert( faultType1OK );
>               ksession.fireAllRules();
>               
>               ksession.dispose();
>               
>               System.out.println( "Done!" );
>               
>               assert( true );
>       }
>
> *And the results that have me scratching my head:*
> Firing fault1 = ALARM
> ************ fault seen with key faultType1 value ALARM
> ************ at least one fault isn't active!
> ************ at least one fault isn't active!
> ************ both faults are active! f1.key = faultType1 f2.key =
> faultType1
> Firing fault2 = ALARM
> ************ fault seen with key faultType2 value ALARM
> ************ at least one fault isn't active!
> ************ at least one fault isn't active!
> ************ both faults are active! f1.key = faultType2 f2.key =
> faultType2
> ************ both faults are active! f1.key = faultType2 f2.key =
> faultType1
> Firing fault1 = OK
> ************ fault seen with key faultType1 value OK
> ************ at least one fault isn't active!
> ************ at least one fault isn't active!
> ************ both faults are active! f1.key = faultType1 f2.key =
> faultType1
> ************ both faults are active! f1.key = faultType1 f2.key =
> faultType2
> Done!
>
> --
> View this message in context:
> http://drools.46999.n3.nabble.com/Trouble-wrapping-my-head-around-window-length-1-tp4018171.html
> Sent from the Drools: User forum mailing list archive at Nabble.com.
> _______________________________________________
> rules-users mailing list
> rules-users@lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users

Reply via email to