[rules-users] Checking for a lack of an object

Wolfgang Laun wolfgang.laun at gmail.com
Mon Aug 22 00:45:09 EDT 2011


2011/8/22 Chris Richmond <crichmond at referentia.com>

>  Doesn't retracting all objects then inserting new objects cause the rules
> to be evaluated for the objects currently in working memory?
>
>
Mostly, yes, but rules using just not(<something>) may not fire again unless
retracting changes it to true.


> Do I need to use Stateless instead of Stateful or something?
>

Both use the same reasoning.

Disposing the old session and creating a new one might be one way of
achieving what you have in mind. Also, adding a pattern with a "trigger"
fact you can change judiciously might do the trick.

-W


>
> Thanks,
>
> Chris
>
>
> On 8/19/2011 7:47 PM, Wolfgang Laun wrote:
>
> A condition based on the negated existence quantifier is true when no such
> object is in the WM. Once recognized as true, the rule fires, and that's it
> until it isn't true any more, which is a sort of "rewind" for the condition
> after which the begin of another period of absence is celebrated with
> another firing. Repeated stop-and-go of the rule engine does not influence
> this monitoring of truth.
>
> -W
>
>
> 2011/8/20 Chris Richmond <crichmond at referentia.com>
>
>>  Well..I insert some objects, fire the rules and this rule will trigger
>> the first time (when it finds no object with those characterstis) but every
>> time after than when I insert more objects and fire the rules, the rule
>> never fires again. I have no idea why.  Here is my simple test case.
>>
>> Two clasess: TestMain and TestObject and rule file Test.drl I have
>> included below.
>>
>> It insterts a group of facts at one time, fires the rules, and retracts
>> all those facts from the stream.  I have an event listener on the session,
>> as you see to verify injections and retractions are occuring.
>> So the rule fires on the first batch, but on no other batches after
>> that???? What gives????
>>
>> Among the Inserttion and retraction events I only see:
>>
>> A proper object does not exist
>>
>> One time, during firing rules on the first batch.  Why does this rule
>> never fire again, even though every single batch of objects I insert/retract
>> does not contain the proper rule values, and so should fire the rule.
>>
>> What is going on???
>>
>>
>>
>>
>>
>> TestMain.java *************************************
>>
>> package com.sample;
>>
>> import java.util.ArrayList;
>> import java.util.List;
>>
>> import org.drools.KnowledgeBase;
>> import org.drools.KnowledgeBaseConfiguration;
>> import org.drools.KnowledgeBaseFactory;
>> import org.drools.builder.KnowledgeBuilder;
>> import org.drools.builder.KnowledgeBuilderError;
>> import org.drools.builder.KnowledgeBuilderErrors;
>> import org.drools.builder.KnowledgeBuilderFactory;
>> import org.drools.builder.ResourceType;
>> import org.drools.conf.EventProcessingOption;
>> import org.drools.event.rule.ObjectInsertedEvent;
>> import org.drools.event.rule.ObjectRetractedEvent;
>> import org.drools.event.rule.ObjectUpdatedEvent;
>> import org.drools.event.rule.WorkingMemoryEventListener;
>> import org.drools.io.ResourceFactory;
>> import org.drools.runtime.KnowledgeSessionConfiguration;
>> import org.drools.runtime.StatefulKnowledgeSession;
>> import org.drools.runtime.conf.ClockTypeOption;
>> import org.drools.runtime.rule.FactHandle;
>> import org.drools.runtime.rule.WorkingMemoryEntryPoint;
>>
>> public class TestMain {
>>
>>   @SuppressWarnings("restriction")
>>   public static void main(String[] args) {
>>
>>
>>     try {
>>
>>       KnowledgeSessionConfiguration config =
>> KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
>>       config.setOption( ClockTypeOption.get("realtime") );
>>
>>
>>       KnowledgeBase kbase;
>>       kbase = readKnowledgeBase();
>>       final StatefulKnowledgeSession ksession =
>> kbase.newStatefulKnowledgeSession();
>>
>>       WorkingMemoryEntryPoint myStream =
>> ksession.getWorkingMemoryEntryPoint("My Stream");
>>
>>       ksession.addEventListener(new WorkingMemoryEventListener(){
>>
>>         @Override
>>         public void objectInserted(ObjectInsertedEvent oie) {
>>           System.err.println("Inserted: " + oie.toString());
>>
>>         }
>>
>>         @Override
>>         public void objectRetracted(ObjectRetractedEvent arg0) {
>>           System.err.println("Retracted: " + arg0.toString());
>>
>>         }
>>
>>         @Override
>>         public void objectUpdated(ObjectUpdatedEvent arg0) {
>>           // TODO Auto-generated method stub
>>
>>         }
>>
>>       });
>>
>>
>>       for (int a = 0; a < 1000; a++){
>>         List<FactHandle> factHandles = new ArrayList<FactHandle>();
>>         for (int x = 0; x < 6; x++){
>>
>>           double reading = 11.3;
>>           float f = (float)reading;
>>           TestObject dr = new TestObject("Reading " + x, f);
>>           FactHandle fh = myStream.insert(dr);
>>           factHandles.add(fh);
>>
>>
>>
>>         }
>>         ksession.fireAllRules();
>>         for(FactHandle fh : factHandles){
>>           myStream.retract(fh);
>>         }
>>         Thread.sleep(4000);
>>       }
>>
>>     } catch (Exception e) {
>>       // TODO Auto-generated catch block
>>       e.printStackTrace();
>>     }
>>
>>   }
>>
>>   @SuppressWarnings("restriction")
>>   private static KnowledgeBase readKnowledgeBase() throws Exception {
>>     KnowledgeBuilder kbuilder =
>> KnowledgeBuilderFactory.newKnowledgeBuilder();
>>     kbuilder.add(ResourceFactory.newClassPathResource("Test.drl"),
>> ResourceType.DRL);
>>     KnowledgeBuilderErrors errors = kbuilder.getErrors();
>>     if (errors.size() > 0) {
>>       for (KnowledgeBuilderError error: errors) {
>>         System.err.println(error);
>>       }
>>       throw new IllegalArgumentException("Could not parse knowledge.");
>>     }
>>
>>     KnowledgeBaseConfiguration kbConfig =
>> KnowledgeBaseFactory.newKnowledgeBaseConfiguration();
>>     kbConfig.setOption( EventProcessingOption.STREAM );
>>     KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kbConfig);
>>     kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
>>
>>
>>
>>
>>     return kbase;
>>   }
>>
>>
>>
>>
>> }
>>
>> TestObject.java *************************************
>> package com.sample;
>>
>> public class TestObject {
>>
>>
>>
>>   private String name;
>>   private float reading;
>>
>>
>>   public TestObject(String name, float reading){
>>     this.name = name;
>>     this.reading = reading;
>>   }
>>
>>
>>   public String getName() {
>>     return name;
>>   }
>>
>>
>>   public void setName(String name) {
>>     this.name = name;
>>   }
>>
>>
>>   public float getReading() {
>>     return reading;
>>   }
>>
>>
>>   public void setReading(float reading) {
>>     this.reading = reading;
>>   }
>> }
>>
>>
>> Test.drl*************************************************
>> #created on: Aug 19, 2011
>> package com.sample
>>
>>
>>
>> rule "Test For Lack of Objects with criteria"
>>
>> when
>>         not(TestObject(name=="blah")  from entry-point "My Stream")
>> then
>>         System.err.println("A proper object does not exist");
>> end
>>
>>
>>
>>
>> On 8/18/2011 8:46 PM, Wolfgang Laun wrote:
>>
>> On 19 August 2011 15:17, Chris Richmond <crichmond at referentia.com> wrote:
>>
>>> How do I fire a rule if an object with certain characterstics does not
>>> exists.
>>>
>>> For example my class Foo, if I have a rule:
>>>
>>> rule "Identify Foos with values"
>>>
>>> when
>>>         Foo(stringProp=="blah", intProp==5)
>>> then
>>>         System.err.println("A Foo was found!");
>>> end
>>>
>>>
>>> So how do I check for lack of existence of an object with certain
>>> characteristics
>>>
>>> I tried:
>>> rule "Flag missing Foos with values"
>>>
>>> when
>>>         not(Foo(stringProp=="blah", intProp==5))
>>> then
>>>         System.err.println("A proper foo does not exist");
>>> end
>>>
>>
>> That's the way to do it.
>>
>>
>>>
>>> I also tried:
>>> rule "Flag missing Foos with values"
>>>
>>> when
>>>         not(exists(Foo(stringProp=="blah", intProp==5)))
>>> then
>>>         System.err.println("A proper foo does not exist");
>>> end
>>>
>>
>> Since not( Foo(...)) means "if no Foo(...) exists", the addition of
>> "exists" is superfluous and generally considered bad style (even though some
>> systems accept it to mean just "not".
>>
>> -W
>>
>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>>
>>
>>
>> _______________________________________________
>> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
>
> _______________________________________________
> rules-users mailing listrules-users at lists.jboss.orghttps://lists.jboss.org/mailman/listinfo/rules-users
>
>
>
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.jboss.org/pipermail/rules-users/attachments/20110822/a1e73566/attachment.html 


More information about the rules-users mailing list