Uploaded image for project: 'Drools'
  1. Drools
  2. DROOLS-5329 Review externalizing lambda failure case
  3. DROOLS-5348

Lambda predicate is not externalized when a binding variable is involved

XMLWordPrintable

    • Icon: Sub-task Sub-task
    • Resolution: Done
    • Icon: Major Major
    • 7.39.0.Final
    • 7.37.0.Final
    • executable model
    • 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.

              rhn-support-tkobayas Toshiya Kobayashi
              rhn-support-tkobayas Toshiya Kobayashi
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

                Created:
                Updated:
                Resolved: