Visualization error with Global facts

71 views
Skip to first unread message

Andre Kapp

unread,
Jan 14, 2022, 2:34:05 AM1/14/22
to Drools Usage
Following a discussion by a previous user and ended up on this article:

Now, this is something that looks super handy to have!

So - running into an issue where I'm getting an undeclared global.
This is a code snippet of what I'm trying out to see how this works:

```
List<DroolsRuleFileDocument> ruleFiles = mmDroolsSessionHandler.getRuleFiles();
KieFileSystem kfs = mmDroolsSessionHandler.getKieFileSystem(ruleFiles);

KieServices ks = KieServices.Factory.get();

var globalParameters = applicationProperties.getGlobalParameters();
var globalFactDTO = mapStructMapper.buildGlobalFactDTO(globalParameters);

KieSession kieSession = getKieSession(kfs);
kieSession.setGlobal("globalFactDTO", globalFactDTO);
kieSession.fireAllRules();
kieSession.dispose();

KieBuilder kieBuilder2 = ks.newKieBuilder(kfs);
kieBuilder2.buildAll(ImpactAnalysisProject.class);

ImpactAnalysisKieModule analysisKieModule = (ImpactAnalysisKieModule) kieBuilder2.getKieModule();

```

The ruleFiles is a list of the drl and xlsx files that I download from AWS DocumentDB. These have certain properties that I filter on. This is production code and working like a dream.

The problem is this line:
```
ImpactAnalysisKieModule analysisKieModule = (ImpactAnalysisKieModule) kieBuilder2.getKieModule();
```

The following is the error when the module is build:

org.drools.modelcompiler.builder.errors.UnknownDeclarationException: Unknown declaration: globalFactDTO
        at org.drools.modelcompiler.builder.generator.RuleContext.lambda$getDeclarationByIdWithException$0(RuleContext.java:256)
        at java.base/java.util.Optional.orElseThrow(Optional.java:401)
        at org.drools.modelcompiler.builder.generator.RuleContext.getDeclarationByIdWithException(RuleContext.java:256)
        at org.drools.modelcompiler.builder.generator.BoxedParameters.getBoxedParametersWithUnboxedAssignment(BoxedParameters.java:47)
        at org.drools.modelcompiler.builder.generator.Consequence.executeCall(Consequence.java:288)
        at org.drools.modelcompiler.builder.generator.Consequence.createCall(Consequence.java:154)
        at org.drools.impact.analysis.parser.impl.RhsParser.parse(RhsParser.java:62)
        at org.drools.impact.analysis.parser.impl.PackageParser.parseRule(PackageParser.java:63)
        at org.drools.impact.analysis.parser.impl.PackageParser.parse(PackageParser.java:50)
        at org.drools.impact.analysis.parser.internal.ImpactModelBuilderImpl.buildRules(ImpactModelBuilderImpl.java:192)
        at org.drools.impact.analysis.parser.internal.ImpactModelBuilderImpl.doSecondBuildStep(ImpactModelBuilderImpl.java:114)
        at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:115)
        at org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:99)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:270)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.buildKnowledgePackages(AbstractKieProject.java:216)
        at org.drools.compiler.kie.builder.impl.AbstractKieProject.verify(AbstractKieProject.java:80)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildKieProject(KieBuilderImpl.java:277)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:245)
        at org.drools.compiler.kie.builder.impl.KieBuilderImpl.buildAll(KieBuilderImpl.java:202)
        at za.co.mamamoney.commissions.controller.TestController.impactAnalysis(TestController.java:184)


It seems the error happens due to the global not inject into the session.

What I have tried so far as well:
Move buildAll(...) call to a bit later so that I can get hold of the session before that and then inject the global.

```
KieBuilder kieBuilder2 = ks.newKieBuilder(kfs);
// kieBuilder2.buildAll(ImpactAnalysisProject.class);

KieContainer kieContainer = ks.newKieContainer(kieBuilder2.getKieModule().getReleaseId());

KieSession session = kieContainer.newKieSession();
session.setGlobal("globalFactDTO", globalFactDTO);

kieBuilder2.buildAll(ImpactAnalysisProject.class);

ImpactAnalysisKieModule analysisKieModule = (ImpactAnalysisKieModule) kieBuilder2.getKieModule();
```

This throws a different error:

```
java.lang.ClassCastException: class org.drools.compiler.kie.builder.impl.MemoryKieModule cannot be cast to class org.drools.impact.analysis.parser.internal.ImpactAnalysisKieModule (org.drools.compiler.kie.builder.impl.MemoryKieModule and org.drools.impact.analysis.parser.internal.ImpactAnalysisKieModule are in unnamed module of loader 'app')
```

Any ideas on how to get past the Global fact problem. Removing it from all the rule files is not really an option..(unless I really really have to)

Tks
Andre

Toshiya Kobayashi

unread,
Jan 16, 2022, 9:09:00 PM1/16/22
to Drools Usage
Hi Andre,

Thank you for the feedback.

Impact analysis is not affected by KieSession. It seems to be simply a bug in drools-impact-analysis. I filed a JIRA and will work on a fix.


Sorry, I don't find a quick workaround at the moment. I'll keep you posted.

Regards,
Toshiya

2022年1月14日金曜日 16:34:05 UTC+9 kap...@gmail.com:

Toshiya Kobayashi

unread,
Mar 11, 2022, 12:04:30 AM3/11/22
to Drools Usage
Sorry about replying late.

DROOLS-6772 has been fixed and the fix is available since Drools 7.65.0.Final.

Regards,
Toshiya

2022年1月17日月曜日 11:09:00 UTC+9 Toshiya Kobayashi:
Reply all
Reply to author
Forward
0 new messages