I have found my answer. Yes we can use the function in the LHS. and we can
use the fact as a parameter for function. Here is how my rule looks like now
rule CheckStationNumber
when
$ao:AssertionObject()
eval((getRecord($ao).getStationNo()) == null)
then
error("station number should not be null",log);
end
where getRecord($ao) is the function i define in my rule and AssertionObject
is the fact i insert into my ksession.
thanks
Abarna
On Sat, Aug 1, 2009 at 5:27 PM, Abarna Ramachandran <rabarna(a)archstone.in>wrote:
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(a)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(a)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@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(a)lists.jboss.org
>>
https://lists.jboss.org/mailman/listinfo/rules-users
>>
>>
>
> _______________________________________________
> rules-users mailing list
> rules-users(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
>