The globals are global to the consequence, where we inject them for the
user. For the function we expect the user to pass those injected globals
as arguments, i'm not convinced that this is overly more painful that
the variables automatigically being there in the function.
That said if someone was will doing to do the work, we woudl probably
accept the patch. But it would need to do the following.
1) determine the used globals for the function
2) add those parameters onto the end of the generated function.
3) update any generated consequences, or functions for that matter, and
add in the globals to the paramters list.
So basically a lot of data munging in the templates.
Mark
Greg Barton wrote:
How about a ThreadLocal?
--- On Wed, 10/15/08, David Sinclair <dsinclair(a)chariotsolutions.com> wrote:
> From: David Sinclair <dsinclair(a)chariotsolutions.com>
> Subject: [rules-dev] Re: [rules-users] No globals in functions?
> To: "Edson Tirelli" <tirelli(a)post.com>
> Cc: "Mark Proctor" <mproctor(a)codehaus.org>, "Rules Dev
List" <rules-dev(a)lists.jboss.org>
> Date: Wednesday, October 15, 2008, 12:53 PM
> What about injecting the globals into the classes and doing
> reflection to
> invoke the method dynamically? That way we would only need
> to change the
> JavaFunctionBuilder to rewrite the calls to the globals?
> For example
>
> function foo() {
> global.bar(abx);
> }
>
> gets re-written as
>
> function foo() {
> method.invoke(global, [abx]);
> }
>
> methods would be cached and such. Or do you guys not want
> the reflection in
> there?
>
>
> On Wed, Oct 15, 2008 at 1:45 PM, Edson Tirelli
> <tirelli(a)post.com> wrote:
>
>
>> It may be invoked by a consequence, an eval, a
>>
> predicate, or a return
>
>> value constraint.
>>
>> If you fix it for the consequence in
>>
> JavaConsequenceBuilder, the others
>
>> will work the same. You will have to change the java.g
>>
> grammar as I
>
>> mentioned in my previousre e-mail to make it work.
>>
>> []s
>> Edson
>>
>> 2008/10/14 David Sinclair
>>
> <dsinclair(a)chariotsolutions.com>
>
>> Edson,
>>
>>> Changing the builder shouldn't be too much of
>>>
> a problem. If I make the
>
>>> changes you suggested, how does the global
>>>
> actually get passed to the
>
>>> method? For example if something defined a
>>>
> function like
>
>>> void function doX(int abc) {
>>> ...
>>> global.doY(bcd);
>>> }
>>> and I rewrite it to be
>>>
>>> void function doX(int abc, GlobalType global) {
>>> ...
>>> }
>>>
>>> Who is the invoker of the method?
>>>
>>> thanks
>>>
>>> dave
>>>
>>>
>>>
>>> On Mon, Oct 13, 2008 at 3:24 PM, Edson Tirelli
>>>
> <tirelli(a)post.com> wrote:
>
>>>> Hi Dave,
>>>>
>>>> Excellent!
>>>> I will try to explain the current situation
>>>>
> and one possible solution,
>
>>>> but you may have better ideas.
>>>>
>>>> Functions in Drools are compiled as simple
>>>>
> static methods in a
>
>>>> generated java class. We use MVEL Templates to
>>>>
> generate the code of the
>
>>>> class and the static method.
>>>>
>>>> Take a look at JavaFunctionBuilder.java
>>>>
> class for the code generation
>
>>>> call and at javaFunction.mvel for the code
>>>>
> template.
>
>>>> Now, the problem with globals is that they
>>>>
> are scoped to sessions, not
>
>>>> rulebases, so you can not resolve them until
>>>>
> runtime. You can not for
>
>>>> instance, make them a static reference of the
>>>>
> generated class and set it at
>
>>>> rulebase compilation time.
>>>>
>>>> So, my suggestion would be to:
>>>>
>>>> 1. at compile time, use
>>>>
> JavaDialect.analyzeBlock() method to analyze and
>
>>>> find out what are the globals that are used by
>>>>
> the funcion method code.
>
>>>> 2. modify the code generation to add
>>>>
> parameters to that in the method
>
>>>> call. So, if "log" is a global and
>>>>
> if the function is declared like this:
>
>>>> function void someFunction( String param ) {
>>>> // ... code ...
>>>> log.something(...);
>>>> // ... code ...
>>>> }
>>>>
>>>> you detect the use of "log" and
>>>>
> add it as a parameter of the generated
>
>>>> method:
>>>>
>>>> ...
>>>> public static void someFunction( Logger log,
>>>>
> String Param ) {
>
>>>> ...
>>>> }
>>>> ...
>>>>
>>>> This way, at runtime we can inject the
>>>>
> parameter into the call. You
>
>>>> can look at JavaConsequenceBuilder.java and
>>>>
> javaInvokers.mvel to see how we
>
>>>> do kind-of the same thing for consequences.
>>>>
>>>> 3. Now the most interesting part. :) We use
>>>>
> an ANTLR grammar for parsing
>
>>>> Java code blocks. You need to change the
>>>>
> parser to rewrite any function call
>
>>>> the user is doing in his code to inject the
>>>>
> log parameter transparently. I
>
>>>> did the very same thing for modify blocks:
>>>>
>>>> modify( $something ) {
>>>> ...
>>>> }
>>>>
>>>> It is not hard once you get the hang of it.
>>>>
> It is a bit of "hand work"
>
>>>> though. Look at the
>>>>
> JavaConsequenceBuilder.fixModifyBlocks() for what I did.
>
>>>> Also, the ANTLR Java grammar is java.g.
>>>>
>>>> Let me know if you have questions or if you
>>>>
> have a better idea, and
>
>>>> welcome aboard!
>>>>
>>>> Cheers,
>>>> Edson
>>>>
>>>>
>>>>
>>>> 2008/10/13 David Sinclair
>>>>
> <dsinclair(a)chariotsolutions.com>
>
>>>> Hi Edson,
>>>>
>>>>> My name is dave sinclair. I started using
>>>>>
> Drools in early August of this
>
>>>>> year, but have a lot of experience with
>>>>>
> rules engines. I have worked
>
>>>>> primarily with ArtEntrprise and some with
>>>>>
> PegaRules. I would love to help
>
>>>>> with this project and thought that this
>>>>>
> may be the area to jump in on.
>
>>>>> I have the M2 code, and was reading it
>>>>>
> over the weekend. Mostly the core
>
>>>>> and some of the compilier. If you want to
>>>>>
> point me in the right direction on
>
>>>>> the global/functions I'd be happy to
>>>>>
> have a look.
>
>>>>> thanks
>>>>>
>>>>> dave
>>>>>
>>>>>
>>>>> On Mon, Oct 13, 2008 at 9:59 AM, Bagwell,
>>>>>
> Allen F <afbagwe(a)sandia.gov>wrote:
>
>>>>>> Edson,
>>>>>>
>>>>>> Thanks for the tip. I figured I'd
>>>>>>
> need to use a workaround like this.
>
>>>>>> Unfortunately I'm under a series
>>>>>>
> of tight development and test
>
>>>>>> deadlines all the way into early
>>>>>>
> summer. Otherwise, I'd have a look.
>
>>>>>> Hopefully someone else out there can
>>>>>>
> assist.
>
>>>>>> Thanks,
>>>>>> -A
>>>>>>
>>>>>> ------------------------------
>>>>>> *From:*
>>>>>>
> rules-users-bounces(a)lists.jboss.org [mailto:
>
>>>>>> rules-users-bounces(a)lists.jboss.org]
>>>>>>
> *On Behalf Of *Edson Tirelli
>
>>>>>> *Sent:* Friday, October 10, 2008 5:46
>>>>>>
> AM
>
>>>>>> *To:* Rules Users List
>>>>>> *Subject:* Re: [rules-users] No
>>>>>>
> globals in functions?
>
>>>>>> Allen,
>>>>>>
>>>>>> There is a technical explanation
>>>>>>
> behind that and we never had the
>
>>>>>> time to find a way to overcome this
>>>>>>
> limitation. What you can do, although
>
>>>>>> not ideal, is to send the global as a
>>>>>>
> parameter:
>
>>>>>> funcion void foo( Logger log, String
>>>>>>
> cond )
>
>>>>>> {
>>>>>> ...
>>>>>> }
>>>>>>
>>>>>> rule XYZ
>>>>>> when
>>>>>> then
>>>>>> foo( log, someString );
>>>>>> end
>>>>>>
>>>>>> If you or anyone would like to help
>>>>>>
> improving this, let us know and
>
>>>>>> we can discuss ways into doing it.
>>>>>>
>>>>>> []s
>>>>>> Edson
>>>>>>
>>>>>> 2008/10/9 Bagwell, Allen F
>>>>>>
> <afbagwe(a)sandia.gov>
>
>>>>>>> There's probably an easy
>>>>>>>
> explanation for this. I was wondering about
>
>>>>>>> why functions inside of rule files
>>>>>>>
> can't access globals?
>
>>>>>>> For example, I have a log4j logger
>>>>>>>
> that I pass into my rule files via
>
>>>>>>> a global. The logger should never
>>>>>>>
> be a part of working memory. It's just
>
>>>>>>> there to capture valuable
>>>>>>>
> feedback.
>
>>>>>>> But I can't do this:
>>>>>>>
>>>>>>> global Logger log;
>>>>>>>
>>>>>>> function void foo(String cond)
>>>>>>> {
>>>>>>> if (cond == "error")
>>>>>>> log.error("I saw an
>>>>>>>
> error");
>
>>>>>>> }
>>>>>>>
>>>>>>> Because the compiler says that in
>>>>>>>
> the function it can't resolve 'log'.
>
>>>>>>> -A
>>>>>>>
>>>>>>> Allen F. Bagwell
>>>>>>> e-mail: afbagwe(a)sandia.gov
>>>>>>> phone: 505/284-4517
>>>>>>> fax: 505/ 844-7886
>>>>>>>
>>>>>>> There is no monument dedicated to
>>>>>>>
> the memory of a committee. -- Lester
>
>>>>>>> J. Pourciau
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>>
> _______________________________________________
>
>>>>>>> rules-users mailing list
>>>>>>> rules-users(a)lists.jboss.org
>>>>>>>
>>>>>>>
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
>>>>>>>
>>>>>> --
>>>>>> Edson Tirelli
>>>>>> JBoss Drools Core Development
>>>>>> JBoss, a division of Red Hat @
>>>>>>
>
www.jboss.com
>
>>>>>>
> _______________________________________________
>
>>>>>> rules-users mailing list
>>>>>> rules-users(a)lists.jboss.org
>>>>>>
>>>>>>
>
https://lists.jboss.org/mailman/listinfo/rules-users
>
>>>>>>
>>>> --
>>>> Edson Tirelli
>>>> JBoss Drools Core Development
>>>> JBoss, a division of Red Hat @
www.jboss.com
>>>>
>>>>
>>>
>> --
>> Edson Tirelli
>> JBoss Drools Core Development
>> JBoss, a division of Red Hat @
www.jboss.com
>>
>>
> _______________________________________________
> rules-dev mailing list
> rules-dev(a)lists.jboss.org
>
https://lists.jboss.org/mailman/listinfo/rules-dev
>