[rules-users] Are globals not permitted with queries?

Davide Sottara dsotty at gmail.com
Fri Jul 25 16:06:00 EDT 2014


Confirmed, the NPE is a bug.. The use case was not covered.
A tentative fix is here, we'll discuss it next week

https://issues.jboss.org/browse/DROOLS-564
https://github.com/sotty/drools/commit/9db38d098e67560839b36661bdf24a5f5cdae1df

Davide

On 07/23/2014 10:56 PM, Borris wrote:
> I want to pass strings around between rules and queries to control their 
> actions and provide control values. I know I can just use "literals" but 
> I know from past experience that that leads to small typos not being 
> detected (either at compile time or run time) and leads to nasty subtle 
> errors down the line.
>
> For rules, you can over come this with a bunch of public static final 
> String in a class (I call mine Consts) - and then any spelling mistakes 
> become compile time issues as you are matching against a 
> variable/constant name and if you spell this right then you know you get 
> the right control string.
>
> But does anyone have a technique that works with queries? I know lots of 
> the docn talks about queries being things you can invoke from Java. But 
> I use queries in my rules (they have a private stack and support 
> recursion that rules don't quite do in the same way). Does anyone have a 
> clever technique they've used in the past?
>
> Thanks
>
> Borris
>
>
> On 22/07/2014 17:16, Davide Sottara wrote:
>> The case may not be supported, but even then, it should be reported as
>> a compilation error, not as a NPE
>> I'll investigate and report back later
>> Thanks
>> Davide
>>
>> On 07/22/2014 05:48 PM, Borris wrote:
>>> I was experimenting with ways of avoiding having to put literal strings
>>> into my rules (it is very fragile and bugs can be silent for a long
>>> time). I tried declaring a global and then tried supplying it to a
>>> query. This generates a backtrace during the newKieSession. A simple
>>> example to provoke the problem:
>>>
>>>
>>>               KieServices ks = KieServices.Factory.get();
>>>               KieContainer kContainer = ks.getKieClasspathContainer();
>>>               KieSession kSession =
>>> kContainer.newKieSession("ksession-rules");
>>>
>>>               kSession.setGlobal("AString", "Hello World");
>>>
>>>               kSession.fireAllRules();
>>>
>>>
>>>
>>> package com.sample
>>>
>>> global java.lang.String AString;
>>>
>>> declare Thing
>>>       name: String @key
>>> end
>>>
>>> rule init
>>>       when
>>>       then
>>>           insert( new Thing( AString ) );
>>> end
>>>
>>> query test(String $in)
>>>       Thing( $in; )
>>> end
>>>
>>> rule spot
>>>       when
>>>           test( "Hello World"; )
>>>           Thing( "Hello World"; )
>>>           test( AString; )
>>>           Thing( AString; )
>>>       then
>>>           System.out.println("found msg\n");
>>> end
>>>
>>>
>>> java.lang.NullPointerException
>>>       at
>>> org.drools.core.rule.LogicTransformer.processElement(LogicTransformer.java:243)
>>>       at
>>> org.drools.core.rule.LogicTransformer.processElement(LogicTransformer.java:263)
>>>       at
>>> org.drools.core.rule.LogicTransformer.fixClonedDeclarations(LogicTransformer.java:134)
>>>       at
>>> org.drools.core.rule.LogicTransformer.transform(LogicTransformer.java:99)
>>>       at
>>> org.drools.core.definitions.rule.impl.RuleImpl.getTransformedLhs(RuleImpl.java:560)
>>>       at
>>> org.drools.core.reteoo.builder.ReteooRuleBuilder.addRule(ReteooRuleBuilder.java:105)
>>>       at org.drools.core.reteoo.ReteooBuilder.addRule(ReteooBuilder.java:100)
>>>       at
>>> org.drools.core.impl.KnowledgeBaseImpl.addRule(KnowledgeBaseImpl.java:1455)
>>>       at
>>> org.drools.core.impl.KnowledgeBaseImpl.addRule(KnowledgeBaseImpl.java:1435)
>>>       at
>>> org.drools.core.impl.KnowledgeBaseImpl.addPackages(KnowledgeBaseImpl.java:838)
>>>       at
>>> org.drools.core.impl.KnowledgeBaseImpl.addKnowledgePackages(KnowledgeBaseImpl.java:266)
>>>       at
>>> org.drools.compiler.kie.builder.impl.KieContainerImpl.createKieBase(KieContainerImpl.java:412)
>>>       at
>>> org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:346)
>>>       at
>>> org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:498)
>>>       at
>>> org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:469)
>>>       at com.sample.DroolsTest.main(DroolsTest.java:17)
>>>
>>>
>>> The 3rd action in the spot rule causes the null exception during
>>> initialise, if it is present. Comment out just that line and no
>>> exceptions happen and behaviour is as expected.
>>>
>>> Are globals permitted in the way I am trying to use them, as a parameter
>>> to a query?
>>>
>>> Borris
>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> rules-users mailing list
>>> rules-users at lists.jboss.org
>>> https://lists.jboss.org/mailman/listinfo/rules-users
>>>
>> _______________________________________________
>> rules-users mailing list
>> rules-users at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/rules-users
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
>



More information about the rules-users mailing list