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 <ladd(a)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-...
Sent from the Drools: User forum mailing list archive at
Nabble.com.
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users