piacenti opened a new issue, #6193:
URL: https://github.com/apache/incubator-kie-drools/issues/6193

   I'm working in migrating IBM ODM rule to Drools and I'm starting to hit some 
issues on larger rules. I'm using Drools version 9.44.0.Final and RuleUnit. I'm 
writing automation to facilitate the migration effort which means that the 
output is not necessarily the ideal approach for the rules in Drools so you may 
see for example a mix of OOPath as well as usages of `from` in migrated rules.
   I've hit two flavors of hitting the limits of the number of arguments 
supported by existing interfaces.
   One is in the code generated for from
   ```
   ule "Sb And P S Combination Not Valid for A (P C) - Validate Ver2"
        when
                $response: /ruleResponse
                $ac: /ac
                $p: P() from BindingUtils.getPoliciesUnder($ac)
                $rule: Rule(ruleIsInScope("Sb And P S Combination Not Valid for 
A (P C) - Validate Ver2")) from $p.rules
                Optional($p_s_prefix: ((String)this.orElse(null)), $p_s_prefix 
!= null) from Optional.ofNullable(JavaStringUtils.subString($ac.selectedPType, 
0, 2))
                $pACStatPlanCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("pACStatPlanCCodes"))
                $pNonOwnedCStatPlanCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("pNonOwnedCStatPlanCCodes"))
                $pNonOwnedVolunteerCStatPlanCCodes: List() from collect 
(String() from 
$rule.findVariableAsListFromCommaSeparatedString("pNonOwnedVolunteerCStatPlanCCodes"))
                $pDocCStatPlanCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("pDocCStatPlanCoveargeCodes"))
                $pAMiscellaneousCStatPlanCCodes: List() from collect (String() 
from 
$rule.findVariableAsListFromCommaSeparatedString("pAMiscellaneousCStatPlanCoveargeCodes"))
                $pHACStatPlanCoveargeCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("pHACStatPlanCoveargeCodes"))
                    // problem statement
                $c: C() from CUtils.getCByCCodeA($pACStatPlanCCodes, $p.aC, 
$pNonOwnedCStatPlanCCodes, $p.nonOwnedEmployeesC, 
$pNonOwnedVolunteerCStatPlanCCodes, $p.nonOwnedVolunteersC, 
$pDocCStatPlanCCodes, $p.docC, $pAMiscellaneousCStatPlanCCodes, 
$p.aMiscellaneousC, $pHACStatPlanCoveargeCodes, $p.hAC)
                $pr_bl: PrBl(statisticalPSbCode != null, 
OperatorOverride.IsNot(statisticalPSbCode, "000")) from $c.prBl
                $validSbPSDataTable: DataTable() from 
$rule.findVariableAsDataTable("validSbPSDataTable")
                $validSbPSDataTable_criteria: 
Criteria($validSbPSDataTable.firstMatching(this) == null) from 
$validSbPSDataTable.newCriteria("PSPrefix", $p_s_prefix, "StatSbCode", 
$pr_bl.statisticalPSbCode)
        then
                ...
   end
   ```
   This rule generates the code below:
   ```
   final org.drools.model.Variable<rules.xom.C> var_$c = 
D.declarationOf(rules.xom.C.class,
                                                           
DomainClassesMetadata496d704c60974bf395ea779de8b891a8.rules_xom_C_Metadata_INSTANCE,
                                                           "$c",
                                                           D.from(var_$p,
                                                                  
var_$pACStatPlanCCodes,
                                                                  
var_$pNonOwnedCStatPlanCCodes,
                                                                  
var_$pNonOwnedVolunteerCStatPlanCCodes,
                                                                  
var_$pDocCStatPlanCCodes,
                                                                  
var_$pAMiscellaneousCStatPlanCCodes,
                                                                  
var_$pHACStatPlanCoveargeCodes,
                                                                  
rules.P8F.LambdaExtractor8F90ADB9CA625E650E75380AFD4DCB44.INSTANCE));
   ```
   It fails to compile because D.from is only overloaded to take up to 4 
binding variables.
   The generated LambdaExtractor referenced above also has issues. It generates 
the following
   ```
   public enum LambdaExtractor8F90ADB9CA625E650E75380AFD4DCB44 implements 
org.drools.model.functions.Function7<rules.xom.P, java.util.List, 
java.util.List, java.util.List, java.util.List, java.util.List, java.util.List, 
java.util.Collection<rules.xom.C>>, org.drools.model.functions.HashedExpression
   ```
   The problem is there is no interface for a `Function7`, it only goes up to 
`Function6`. I've looked at those classes and was able to create the proper 
implementations for From5, From6, From7 as well as Function7 but I'm not aware 
of any process being present that would allow me to inject those.
   
   I also noticed another issue with another extreme case where there are too 
many bindings for the rule below.
   ```
   rule "Sr Balancing A - Validate"
        when
                $response: /ruleResponse
                $ac: /ac
                $p: P() from BindingUtils.getPUnder($ac)
                $st: St() from BindingUtils.getStsUnder($p)
                $rule: Rule(ruleIsInScope("Sr Balancing A - Validate")) from 
$st.rules
                $pACLevelCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("pACLevelCCodes"))
                $pNonOwnedEmployeeCLevelCCodes: List() from collect (String() 
from 
$rule.findVariableAsListFromCommaSeparatedString("pNonOwnedEmployeeCLevelCCodes"))
                $pNonOwnedVolunteerCLevelCCodes: List() from collect (String() 
from 
$rule.findVariableAsListFromCommaSeparatedString("pNonOwnedVolunteerCLevelCCodes"))
                $pDocCLevelCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("pDocCLevelCCodes"))
                $pAMiscellaneousCLevelCCodes: List() from collect (String() 
from 
$rule.findVariableAsListFromCommaSeparatedString("pAMiscellaneousCLevelCCodes"))
                $pHACLevelCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("pHACLevelCCodes"))
                $stACLevelCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("stACLevelCCodes"))
                $vACLevelCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("vACLevelCCodes"))
                $lACLevelCCodes: List() from collect (String() from 
$rule.findVariableAsListFromCommaSeparatedString("lACLevelCCodes"))
                $created_object:
                        CreatedObjects() from
                        CreatedObjects.createdObjects($rule)
                Optional($st_level_sr: ((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumStLevel($ac, GeneralConstants.Sr, $st.stCode + 
GeneralConstants.Sr, $created_object.blPrBlList))
                Optional($p_a_c_sr_level_balances: 
((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumPACTaxOrSrs($ac, $st, $pACLevelCCodes, 
GeneralConstants.Sr, $created_object.blPrBlList))
                Optional($p_non_owned_employee_sr_level_balances: 
((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumPNonOwnedEmployeesTaxOrSrs($ac, $st, 
$pNonOwnedEmployeeCLevelCCodes, GeneralConstants.Sr, 
$created_object.blPrBlList))
                Optional($p_non_owned_volunteer_sr_level_balances: 
((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumPNonOwnedVoluteersTaxOrSrs($ac, $st, 
$pNonOwnedVolunteerCLevelCCodes, GeneralConstants.Sr, 
$created_object.blPrBlList))
                Optional($p_doc_c_sr_level_balances: 
((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumPDocCTaxOrSrs($ac, $st, $pDocCLevelCCodes, 
GeneralConstants.Sr, $created_object.blPrBlList))
                Optional($p_a_misc_c_sr_level_balances: 
((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumAMiscellaneousCTaxOrSrs($ac, $st, 
$pAMiscellaneousCLevelCCodes, GeneralConstants.Sr, $created_object.blPrBlList))
                Optional($p_h_a_c_sr_level_balances: 
((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumhACTaxOrSrs($ac, $st, $pHACLevelCCodes, 
GeneralConstants.Sr, $created_object.blPrBlList))
                Optional($st_a_c_sr_level_balances: 
((BigDecimal)this.orElse(null))) from 
Optional.ofNullable(PrBlUtils.sumStACTaxOrSrs($st, $stACLevelCCodes, 
GeneralConstants.Sr, $created_object.blPrBlList))
                Optional($v_pr_sr_level_balances: 
((BigDecimal)this.orElse(null))) from Optional.ofNullable(PrBlUtils.sumvAC($st, 
$vACLevelCCodes, GeneralConstants.Sr, $created_object.blPrBlList))
                Optional($l_a_c_sr_level_balances: 
((BigDecimal)this.orElse(null)), OperatorOverride.DoesNotEqual($st_level_sr, 
MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus($p_a_c_sr_level_balances,
 $v_pr_sr_level_balances), $p_non_owned_employee_sr_level_balances), 
$p_non_owned_volunteer_sr_level_balances), $l_a_c_sr_level_balances), 
$p_doc_c_sr_level_balances), $p_a_misc_c_sr_level_balances), 
$p_h_a_c_sr_level_balances), $st_a_c_sr_level_balances))) from 
Optional.ofNullable(PrBlUtils.sumlAC($st, $lACLevelCCodes, GeneralConstants.Sr, 
$created_object.blPrBlList))
        then
                for(PrBl var$_$0 : $created_object.getBlPrBlList()){
                        $created_object.addToValidationParameters(
                                        ValidationParameter.create(var$_$0,
                                        new NVPType[]{
                                                
NVPType.createNewNVPType("blAmount", var$_$0.getBlAmount())
                                        }));
                      }         
                      Outcome.generate($response, $p, $rule, 
(ValidationParameter[])$created_object.getValidationParameters().toArray(
                                new 
ValidationParameter[$created_object.getValidationParameters().size()]),
                        new RuleParameter[]{
                                RuleParameter.create("sumPACLevelSrs", 
$p_a_c_sr_level_balances),
                                RuleParameter.create("sumvLevelSrs", 
$v_pr_sr_level_balances),
                                
RuleParameter.create("sumPNonOwnedEmployeeLevelSrs", 
$p_non_owned_employee_sr_level_balances),
                                
RuleParameter.create("sumPNonOwnedVolunteerLevelSrs", 
$p_non_owned_volunteer_sr_level_balances),
                                RuleParameter.create("sumlACLevelSrs", 
$l_a_c_sr_level_balances),
                                RuleParameter.create("sumPDocCLevelSrs", 
$p_doc_c_sr_level_balances),
                                RuleParameter.create("sumAMiscCLevelSrs", 
$p_a_misc_c_sr_level_balances),
                                RuleParameter.create("sumPHACLevelSrs", 
$p_h_a_c_sr_level_balances),
                                RuleParameter.create("sumStACLevelSrs", 
$st_a_c_sr_level_balances),
                                RuleParameter.create("sumStLevelSrs", "St Sr 
Total", $st_level_sr),
                                RuleParameter.create("pACLevelCCodes", 
(String[])$pACLevelCCodes.toArray(
                                        new String[$pACLevelCCodes.size()])),
                                RuleParameter.create("vACLevelCCodes", 
(String[])$vACLevelCCodes.toArray(
                                        new String[$vACLevelCCodes.size()])),
                                
RuleParameter.create("pNonOwnedEmployeeCLevelCCodes", 
(String[])$pNonOwnedEmployeeCLevelCCodes.toArray(
                                        new 
String[$pNonOwnedEmployeeCLevelCCodes.size()])),
                                
RuleParameter.create("pNonOwnedVolunteerCLevelCCodes", 
(String[])$pNonOwnedVolunteerCLevelCCodes.toArray(
                                        new 
String[$pNonOwnedVolunteerCLevelCCodes.size()])),
                                RuleParameter.create("lACLevelCCodes", 
(String[])$lACLevelCCodes.toArray(
                                        new String[$lACLevelCCodes.size()])),
                                RuleParameter.create("pDocCLevelCCodes", 
(String[])$pDocCLevelCCodes.toArray(
                                        new String[$pDocCLevelCCodes.size()])),
                                
RuleParameter.create("pAMiscellaneousCLevelCCodes", 
(String[])$pAMiscellaneousCLevelCCodes.toArray(
                                        new 
String[$pAMiscellaneousCLevelCCodes.size()])),
                                RuleParameter.create("pHACLevelCCodes", 
(String[])$pHACLevelCCodes.toArray(
                                        new String[$pHACLevelCCodes.size()])),
                                RuleParameter.create("stACLevelCCodes", 
(String[])$stACLevelCCodes.toArray(
                                        new String[$stACLevelCCodes.size()])),
                                RuleParameter.create("St.stcode", "st code", 
$st.getStCode()),
                                RuleParameter.create("assessment", 
$st.getStCode() + GeneralConstants.Sr()),
                                RuleParameter.create("Ac.primaryRiskSt", 
"primary risk st", $ac.getPrimaryRiskSt()),
                                RuleParameter.create("Sr sums", "SOC Sr Total", 
MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus(MathUtils.plus($p_a_c_sr_level_balances,
 $v_pr_sr_level_balances), $p_non_owned_employee_sr_level_balances), 
$p_non_owned_volunteer_sr_level_balances), $l_a_c_sr_level_balances), 
$p_doc_c_sr_level_balances), $p_a_misc_c_sr_level_balances), 
$p_h_a_c_sr_level_balances), $st_a_c_sr_level_balances))
                        });
   end
   ```
   
   This rules ends up with two problems. It generates a broken from provider 
and a Consequence that is unable to execute
   ```
   final org.drools.model.Variable<java.util.Optional> 
var_GENERATED_$pattern_Optional$962$ = D.declarationOf(java.util.Optional.class,
                 
DomainClassesMetadata63a2c5657ba94a49b9854eb2f46f3c7e.java_util_Optional_Metadata_INSTANCE,
                 "GENERATED_$pattern_Optional$962$",
                 D.from(var_$st,
                        var_$created_object,
                        var_$ac,
                        (rules.xom.St _this, 
                        rules.xom.Ac $ac,
                         rules.xom.utilities.CreatedObjects $created_object) -> 
Optional.ofNullable(PrBlUtils.sumStLevel($ac,
                                                                                
                                                               
GeneralConstants.Sr(),
                                                                                
                                                               
_this.getStCode() + GeneralConstants.Sr(),
                                                                                
                                                               
$created_object.getBlPrBlList()))));
   ```
   The above format was edited to fit better here
   The problem above is the order of parameters `var_$st, var_$created_object, 
var_$ac` does not follow the order of parameters expected by the lambda which 
is `var_$st, var_$ac, var_$created_object` so it throws a compilation error.
   
   ```
   D.on(var_$p_doc_c_sr_level_balances,
          var_$st_level_sr,
          var_$pDocCLevelCCodes,
          var_$l_a_c_sr_level_balances,
          var_$pACLevelCCodes,
          var_$stACLevelCCodes,
          var_$pHACLevelCCodes,
          var_$rule,
          var_$p_non_owned_employee_sr_level_balances,
          var_$st,
          var_$pNonOwnedVolunteerCLevelCCodes,
          var_$p,
          var_$p_a_c_sr_level_balances,
          var_$p_a_misc_c_sr_level_balances,
          var_$pAMiscellaneousCLevelCCodes,
          var_$v_pr_sr_level_balances,
          var_$pNonOwnedEmployeeCLevelCCodes,
          var_$vACLevelCCodes,
          var_$lACLevelCCodes,
          var_$response,
          var_$ac,
          var_$p_non_owned_volunteer_sr_level_balances,
          var_$created_object,
          var_$st_a_c_sr_level_balances,
       
var_$p_h_a_c_sr_level_balances).execute(rules.PD2.LambdaConsequenceD263DEBC42CB8BDA168C5ACC18919448.INSTANCE));
   ```
   The `execute` method call above doesn't exist so it throws a compilation 
error. For these many arguments it generates a `ConsequenceBuilder._N` which 
only has an `executeScript` method. Similar to the problem above, even if I 
were to implement  something higher than `ConsequenceBuilder._24` (which is the 
highest implementation, one short of the number of parameters above), I have no 
way to inject that implementation into the process. 
   


-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to