[jboss-jira] [JBoss JIRA] (DROOLS-5348) Lambda predicate is not externalized when a binding variable is involved

Toshiya Kobayashi (Jira) issues at jboss.org
Thu May 21 04:29:48 EDT 2020


     [ https://issues.redhat.com/browse/DROOLS-5348?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Toshiya Kobayashi updated DROOLS-5348:
--------------------------------------
    Description: 
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}



> Lambda predicate is not externalized when a binding variable is involved
> ------------------------------------------------------------------------
>
>                 Key: DROOLS-5348
>                 URL: https://issues.redhat.com/browse/DROOLS-5348
>             Project: Drools
>          Issue Type: Sub-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}



--
This message was sent by Atlassian Jira
(v7.13.8#713008)


More information about the jboss-jira mailing list