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

Borris borris at chaos.org.uk
Tue Jul 22 11:48:11 EDT 2014


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






More information about the rules-users mailing list