Re: [rules-users] Are globals not permitted with queries?
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@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 ___ rules-users mailing list rules-users@lists.jboss.org
Re: [rules-users] Are globals not permitted with queries?
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@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
[rules-users] Are globals not permitted with queries?
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@lists.jboss.org https://lists.jboss.org/mailman/listinfo/rules-users
Re: [rules-users] Are globals not permitted with queries?
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@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