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

Chris Richmond crichmond at referentia.com
Mon Aug 22 12:14:54 EDT 2011


Doesn't retracting all objects then inserting new objects cause the 
rules to be evaluated for the objects currently in working memory?

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

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 
> <mailto: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 <http://this.name> = name;
>         this.reading = reading;
>       }
>
>
>       public String getName() {
>         return name;
>       }
>
>
>       public void setName(String name) {
>     this.name <http://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
>>     <mailto: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 <mailto:rules-users at lists.jboss.org>
>>         https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>>
>>
>>     _______________________________________________
>>     rules-users mailing list
>>     rules-users at lists.jboss.org  <mailto:rules-users at lists.jboss.org>
>>     https://lists.jboss.org/mailman/listinfo/rules-users
>
>
>     _______________________________________________
>     rules-users mailing list
>     rules-users at lists.jboss.org <mailto:rules-users at lists.jboss.org>
>     https://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/0cf7cd2d/attachment.html 


More information about the rules-users mailing list