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@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@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@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@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@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users



_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users




_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users