]
Kris Verlaenen updated DROOLS-5329:
-----------------------------------
Sprint: 2020 Week 19-21 (from May 4), 2020 Week 22-24 (from May 25), 2020 Week 25-27
(from Jun 15), 2020 Week 28-30 (from Jul 6) (was: 2020 Week 19-21 (from May 4), 2020 Week
22-24 (from May 25), 2020 Week 25-27 (from Jun 15))
Review externalizing lambda failure case
----------------------------------------
Key: DROOLS-5329
URL:
https://issues.redhat.com/browse/DROOLS-5329
Project: Drools
Issue Type: Task
Components: executable model
Affects Versions: 7.37.0.Final
Reporter: Toshiya Kobayashi
Assignee: Toshiya Kobayashi
Priority: Major
In CompilerTest#testStringValueOf, there is a case where MaterializedLambdaPredicate is
not created.
{code:java}
public static org.drools.model.Rule rule_R() {
final org.drools.model.Variable<java.lang.Integer>
var_GENERATED_$pattern_Integer$1$ = D.declarationOf(java.lang.Integer.class,
DomainClassesMetadata81A66AD685F7689036AAA5128956C14B.java_lang_Integer_Metadata_INSTANCE,
"GENERATED_$pattern_Integer$1$");
final org.drools.model.Variable<Integer> var_$i =
D.declarationOf(Integer.class, "$i");
final org.drools.model.Variable<org.drools.modelcompiler.domain.Person>
var_GENERATED_$pattern_Person$1$ =
D.declarationOf(org.drools.modelcompiler.domain.Person.class,
DomainClassesMetadata81A66AD685F7689036AAA5128956C14B.org_drools_modelcompiler_domain_Person_Metadata_INSTANCE,
"GENERATED_$pattern_Person$1$");
org.drools.model.Rule rule =
D.rule("R").build(D.pattern(var_GENERATED_$pattern_Integer$1$).bind(var_$i,
(java.lang.Integer _this) -> _this.intValue()),
D.pattern(var_GENERATED_$pattern_Person$1$).expr("476633DA7C4638FC84A32859E0C843E6",
var_$i,
(_this, $i) ->
org.drools.modelcompiler.util.EvaluationUtil.areNullSafeEquals(_this.getName(),
(String.valueOf($i))),
D.reactOn("name")),
D.on(var_$i).execute(defaultpkg.P1D.LambdaConsequence1D5F4C5CA006007B1D3974ED5A5A05B6.INSTANCE));
return rule;
}
{code}
See
{code:java}
expr("476633DA7C4638FC84A32859E0C843E6",
var_$i,
(_this, $i) ->
org.drools.modelcompiler.util.EvaluationUtil.areNullSafeEquals(_this.getName(),
(String.valueOf($i)))
{code}
It throws DoNotConvertLambdaException in ExecModelLambdaPostProcessor.
{code:java}
private void extractLambdaFromMethodCall(MethodCallExpr methodCallExpr,
Supplier<MaterializedLambda> lambdaExtractor) {
methodCallExpr.getArguments().forEach(a -> {
if (a.isLambdaExpr()) {
LambdaExpr lambdaExpr = a.asLambdaExpr();
try {
CreatedClass aClass =
lambdaExtractor.get().create(lambdaExpr.toString(), imports, staticImports);
lambdaClasses.put(aClass.getClassNameWithPackage(), aClass);
ClassOrInterfaceType type =
StaticJavaParser.parseClassOrInterfaceType(aClass.getClassNameWithPackage());
a.replace(lambdaInstance(type));
} catch(DoNotConvertLambdaException e) {
logger.debug("Cannot externalize lambdas {}",
e.getMessage());
}
}
});
}
{code}
Review if it's something can be fixed.