Oke I get it. I am using the globals just for temporary immutable
values, first to be set by a rule and then to be used by the other rules.
I just have another question, how can I declare an array as a global?
When I try
global int[] type;
global String[] test;
and then in the RHS
$type = new int[4];
Eclipse complains:
Multiple markers at this line
- Syntax error on token "}", delete this token
- Syntax error on token "[", delete this token
- Syntax error on token "}", delete this token
and i get errrors during the compilation too.
Ofcourse I can make an object with an String and/or int array in it and
use that, but is this the expected behavior?
Thanks,
Waruzjan
Anstis, Michael (M.) schreef:
This is in essence already catered for - you need a LHS fact.
A global is just a holder for some (immutable) set of values\functions to
make life easier for common (immutable) values\functions your rule may need.
If you want to start making the global mutable for RETE to "use" the changes
they become facts.
>> rule "Start"
>> salience 101
>> when
>> then
>> MyGlobalObject myGlobal = new MyGlobalObject();
>> ArrayList objectList = new ArrayList() ;
>> objectList.add("1");
>> objectList.add("2");
>> myGlobal.setList(objectList);
>> System.out.println("Start objectList:" + objectList);
>> insert(myGlobal);
>> end
>>
>> rule "end"
>> salience 97
>> when
>> $g : MyGlobalObject( list != null )
>> then
>> System.out.println("End objectList: " + $g.getList());
>> end
>>
-----Original Message-----
From: rules-users-bounces(a)lists.jboss.org
[mailto:rules-users-bounces@lists.jboss.org] On Behalf Of Waruzjan
Shahbazian
Sent: 30 October 2007 09:31
To: Rules Users List
Subject: Re: [rules-users] Initialize Global
Thanks, that sounds logical to me. I guess I just have to "trust" that
the rule where the array gets initialised activates earlier than the
rule where I need the array. That shouldn't be a problem since I use
salience and to avoid nullpoint exceptions I can use the if(objectList
!= null) in the "Then" part of the rule where I need the array.
Maybe an idea for the drools developers to create an "update" function
for the globals so we can eval on them too...in the future.
vdelbart schreef:
> It's normal.
>
> Globally, the rule engine works in two steps :
> - first : the activation (the "when" statement)
> - second : the execution (the "then" statement) with salience, ruleflow
>
...
> In your test, you have in the first step objectList = null and in the
>
second
> step objectList = [1, 2].
>
> If you want to re-activate your rule, you have to do an
>
update/insert/remove
> action... But you can't do that with globals. So you need to use the WM
> facts.
>
>
>
> Waruzjan Shahbazian-2 wrote:
>
>
>> I have the same "problem", but eval(objectList == null) doesn't
work. If
>> I don't execute "drools.getWorkingMemory().setGlobal()" it
"works fine",
>> as if the rule activates and the object is null.
>>
>> global List objectList;
>>
>> rule "Start"
>> salience 101
>> when
>> #conditions
>> then
>> objectList = new ArrayList() ;
>> objectList.add("1");
>> objectList.add("2");
>> System.out.println("Start objectList:"+objectList);
>> //drools.getWorkingMemory().setGlobal("objectList",
objectList);
>> end
>>
>> rule "end"
>> salience 97
>> when
>> eval (objectList == null)
>> then
>> System.out.println("End objectList: "+objectList);
>> end
>>
>> gives:
>>
>> Start objectList:[1, 2]
>> End objectList: null
>>
>> Next I uncomment the
"drools.getWorkingMemory().setGlobal("objectList",
>> objectList);" and run the rule again an get:
>>
>> Start objectList:[1, 2]
>> End objectList: [1, 2]
>>
>> so the objectList isn't null, but the rule still activates...
>>
>> Kris Verlaenen schreef:
>>
>>
>>>> That initialized my global but the rule still runs every execution.
>>>> Can I
>>>> disable the rule after the first execution?
>>>>
>>>>
>>> What do you mean by "every execution". A rule should only be
executed
>>> once, unless it gets reactivated (which should not be the case in this
>>> situation).
>>>
>>>
>>>
>>>> I would like to use (if (objectList==null)). My list is not
>>>> immutable. Can
>>>> I make a similar rule for the LHS?
>>>>
>>>>
>>> You can test whether the global is null using eval( objectList == null
>>> ) in the LHS of the rule.
>>>
>>> Kris
>>> _______________________________________________
>>> 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
------------------------------------------------------------------------
_______________________________________________
rules-users mailing list
rules-users(a)lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users