[rules-users] can functions be used in rule's when part?

Abarna Ramachandran rabarna at archstone.in
Sat Aug 1 07:57:42 EDT 2009


I really appreciate your help. I understand my mistake. I have another
question. Can i use a fact as a parameter for function defined in the rule
and make a call to that function in the when part of the rule.
For example something like this
rule CheckStationNumber
when
  AssertionObject(getRecord(AssertionObject).getStationNo() == null)
then
    error("station number should not be null",log);
end

thanks
Abarna

2009/8/1 Wolfgang Laun <wolfgang.laun at gmail.com>

> The global ao must be assigned to the ksession, from your Java code, by
> calling
>    ksession.setGlobal( "ao",  assertionObject )
> before you do anything that triggers LHS evaluations. See Drools Expert,
> section 4.5.2.
>
> The WM and rule setup as you present it does not make sense (to me). If you
> insert an AssertionObject as a WM fact, you shouldn't have it as a global.
> If you want it as a fact, you'll need rules with patterns like
> when
>    AssertionObject(...)
> And the same goes for BillingRecord
>
> -W
>
>
> 2009/8/1 Abarna Ramachandran <rabarna at archstone.in>
>
>> I am getting the following error when trying to insert my object into
>> ksession. I have attached my rules and java object. Please help me in
>> debugging why this is happening. I am using java 5 and drools 5.0
>>
>> thanks
>>
>> *error while inserting:*
>>
>> org.drools.RuntimeDroolsException:
>> defaultpkg.Rule_CheckStationNumber_0Eval0Invoker at e4aea391 :
>> java.lang.NullPointerException
>>
>> *rules.drl*
>> import java.lang.*;
>> import java.util.*;
>> import ct.fw.rules.*;
>> import ct.fw.utils.*;
>> import ct.fw.rules.*;
>> import ct.fw.logging.*;
>> import ct.fw.pf.dbi.*;
>> import ct.fw.pf.dao.*;
>> import ct.fw.pf.seq.*;
>> import ct.fw.pf.util.*;
>> import ct.fw.pf.vo.*;
>> import ct.fw.ex.*;
>> import org.apache.commons.lang.*;
>> import com.aa.gccp.domain.*;
>>
>>    global ct.fw.rules.AssertionObject ao
>>    global ct.fw.logging.SmartLogger log
>>
>>     function BillingRecord getRecord(AssertionObject ao)
>>         {
>>             return (BillingRecord) ao.get(0);
>>         }
>>     function void debug(String msg,SmartLogger log)
>>         {
>>             log.debug(BusinessRulesValidator.class, msg);
>>         }
>>     function void error(String msg,SmartLogger log)
>>         {
>>             log.error(BusinessRulesValidator.class, msg);
>>             System.out.println("Message from rules "+msg);
>>         }
>>
>> rule CheckTrue
>> when
>>    eval(true)
>> then
>>     System.out.println("evaluating true");
>> end
>>
>> rule CheckTrue2
>> when
>>    eval(true)
>> then
>>     error("evaluating from rules2",log);
>> end
>>
>> rule CheckStationNumber
>> when
>>    eval(((getRecord(ao)).getStationNo()) == null)
>> then
>>     error("station number should not be null",log);
>> end
>>
>> *part where i load the rules and insert the facts. There is no error when
>> loading the rules.drl. That means no parsing errors. The error happens at
>> ksessio.insert(assertionObject).*
>>
>> public void assertRulesObject(AssertionObject assertionObject) throws
>> BusinessRuleException
>>     {
>>         long current = System.currentTimeMillis();
>>         KnowledgeBase kbase = knowledgeBasesMap.get(rulesFileName);
>>
>>         if (kbase == null)
>>         {
>>             kbase = knowledgeBasesMap.get(rulesFileName + DRL);
>>         }
>>
>>         if ((kbase == null) || ((current - lastRefreshedMilliseconds) >
>> refreshTimeMilliseconds))
>>         {
>>             if (rulesFileName.toLowerCase().indexOf(DRL) == -1)
>>             {
>>                 kbase = load(rulesFileName + DRL);
>>             }
>>             else
>>             {
>>                 kbase = load(rulesFileName);
>>             }
>>
>>             lastRefreshedMilliseconds = System.currentTimeMillis();
>>         }
>>         this.assertionObject = assertionObject;
>>
>>         List assertionobjectslist = new ArrayList();
>> *// i am just doing this part just to make sure assertion object is not
>> null and i will get some answer. this part runs fine.  *
>>   if (assertionObject != null)
>>         {
>>             assertionobjectslist = assertionObject.getValidationObjects();
>>             String StationNumber = ((BillingRecord)
>> assertionObject.get(0)).getStationNo();
>>             System.out.println("Station Number in assertion object is " +
>> StationNumber);
>>         }
>>         else
>>         {
>>             System.out.println("Assertion Object is null");
>>         }
>>         System.out.println("The number of objects in assertionobject is "
>> + assertionobjectslist.size());
>>
>>         try
>>         {
>>             StatefulKnowledgeSession ksession =
>> kbase.newStatefulKnowledgeSession();
>> *//the next line throws the exception*
>>             ksession.insert(assertionObject);
>>
>>             ksession.fireAllRules();
>>             ksession.dispose();
>>
>>         }
>>         catch (RuntimeDroolsException e1)
>>         {
>>             throw new BusinessRuleException(e1.getMessage());
>>         }
>>
>>         businessRulesErrors = assertionObject.getBusinessRulesErrors();
>>
>>         if (throwException)
>>         {
>>             if (!assertionObject.getBusinessRulesErrors().isEmpty())
>>             {
>>                 throw new BusinessRuleException(businessRulesErrors);
>>             }
>>         }
>>     }
>>
>>
>> Any help is appreciated. thanks
>>
>>
>> _______________________________________________
>> rules-users mailing list
>> 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/20090801/c874e055/attachment.html 


More information about the rules-users mailing list