Yes, this is syntactically correct, but it sure looks strange.
In your Java code, you have
AssertionObject assertionObject);
and this contains a list of BillingRecord where the property stationNo
should not be null, then *normally* one would do
for( Object o: assertionObject.getValidationObjects() ) { # assuming
these are what $ao.get(...) returns
ksession.insert( o );
}
and this would let you write a simple rule like
rule CheckStationNumber
when
BillingRecord( stationNo == null )
then
error("station number should not be null",log);
end
-W
2009/8/1 Abarna Ramachandran <rabarna(a)archstone.in>
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
>>
>>
>
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users