-
Sub-task
-
Resolution: Done
-
Major
-
7.37.0.Final
-
None
-
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)
-
3
-
NEW
-
NEW
In CompilerTest#testStringValueOf, there is a case where MaterializedLambdaPredicate is not created.
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; }
See
expr("476633DA7C4638FC84A32859E0C843E6", var_$i, (_this, $i) -> org.drools.modelcompiler.util.EvaluationUtil.areNullSafeEquals(_this.getName(), (String.valueOf($i)))
It throws DoNotConvertLambdaException in ExecModelLambdaPostProcessor.
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()); } } }); }
In order to externalize, parameters of the lambda need to have their types.