当前位置: 首页 > 知识库问答 >
问题:

在Drools规则引擎中使用列表

习宸
2023-03-14

我在试着处理drools中的列表。我正在传递一个请求,其中包含一个购买列表。我想做几个规则,包括检查大小是否正确,然后如果所有元素都相同,如果所有购买都经过授权。。。我有以下代码,但在使用列表时遇到了问题。这是正确的方法吗?尤其是在检查尺寸时?

import com.rules.Purchase
import com.rules.PurchaseRequest

dialect  "mvel"

global Boolean eligibleForRefund

rule "Check for list not equal to two elements" salience 10
    when
        PurchaseRequest(getPurchases != null, getPurchases.size() != 2)

    then
        drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end

rule "Check for two purchases" salience 9
    when:
        $purchaseRequest: PurchaseRequest()
        Number(intValue != 2) from accumulate(Purchase(getStatus() == "Approved") from $purchaseRequest.getPurchases(), count(1))

    then
        drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end

rule "Check for the same purchases" salience 8
    when:
        $purchaseRequest: PurchaseRequest()

    then
        firstPurchase = $purchaseRequest.getPurchases().get(0).getCost();
        hasAllElements = true;

        for (Purchase purchase : $purchaseRequest.getPurchases()) {
            if (purchase.getCost() != firstPurchase) {
                hasAllElements = false;
            }
        }

        drools.getKieRuntime().setGlobal("eligibleForRefund", hasAllElements);
end

共有1个答案

张鹏鹍
2023-03-14

假设您的类定义如下所示:

class PurchaseRequest {
  private List<Purchase> purchases;
  
  public List<Purchase> getPurchases() { return this.purchases; }
}

你应该从持有者中取出引用,而不是通过getter不断地与事物交互。在其他项目中,这有助于保持数据的一致性,尤其是与共享资源的一致性。回想一下,如果您有一个名称与格式匹配的getter,您可以简单地将其称为xyz,drools会自动将其映射到getter函数。这允许我们通过PurchaseRequest($purchases:purchases)获取采购,因为采购将映射到getPurchases()。(注意,如果purchases碰巧是一个公共变量,那么它应该首先映射到该变量;但由于它是私有的,所以它依赖于遵循bean命名约定的公共getter。)

其次,您在一个非常简单的场景中使用积累,其中收集可能更合适。通常,您会使用积累来处理更复杂的“获取看起来像这样的东西”的情况;但是对于简单的匹配,集合也同样有效。

第三条规则需要做的工作最多。您不希望在规则的右侧执行这种业务逻辑。有很多方法可以检查所有元素是否相同——如果实现了equals/hashCode,可以将所有元素都放入一个集合中,并确认集合的长度仍然是列表的长度;您可以颠倒规则来检查至少一个不同的项目;您可以使用累积或收集。。。

最后--

  • 避免突显。它们的设计很糟糕。你的规则应该是独立的。这里只需要突显,因为第三条规则设置了true和false。相反,如果您默认为true,然后使用规则将其覆盖为false,则可以完全不使用显著性
rule "Check for list not equal to two elements" 
salience 1
when
  PurchaseRequest($purchases: purchases != null)
  List(size != 2) from $purchases
then
  drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end

rule "Check for two purchases"
salience 1
when:
  PurchaseRequest( $purchases: purchases != null)
  List( size != 2 ) from collect( Purchase(status == "Approved") from $purchases)
then
  drools.getKieRuntime().setGlobal("eligibleForRefund", false);
end

// I've no idea what data type `getCost()` returns; I'm assuming "String"
rule "Check for the same purchases"
when:
  PurchaseRequest($purchases: purchases != null)

  // accumulate all of the costs into a set. if all costs are the same, set size = 1
  $costs: Set() from accumulate( Purchase( $cost: cost ) from $purchases;
                                 collectSet($cost))
then
  drools.getKieRuntime().setGlobal("eligibleForRefund", $costs.size() == 1);
end
 类似资料:
  • 我正在向drools规则引擎插入数据,但我无法理解它是如何处理插入的数据的。插入数据的代码是:

  • 我正在尝试使用drools规则引擎中定义的一组规则对对象列表进行排序。示例对象结构如下 我想要 > 定义一组对对象列表进行排序的规则。 例如:规则1:“使用名称升序对对象进行排序” 定义规则需要执行的顺序 例如:将顺序1设置为规则1 我可以使用drools引擎实现这一点吗 我曾想过使用compareTo()进行排序,但由于排序标准可以在运行时更改,因此逻辑变得复杂且难以维护。 谢谢, Kolith

  • 我有这样的情况,在规则文件中的所有规则必须检查执行。如果我的理解是正确的,文档所说的规则将由引擎任意执行。 我有一个或多个疑问。 > 我在许多地方得到了答案,我必须使用显著性功能来按顺序执行它们。如果我使用显著性,并且我有执行所有规则的要求,它真的会大规模地影响性能吗?如果是,它会如何影响性能,甚至规则引擎也会任意执行所有规则,比如一些随机顺序。 提前谢谢。

  • 我使用Kie Workbench学习口水。我的输入将是opportunityProduct类中的名称,我希望在Opportunity类中的Ip中得到输出。在规则引擎执行之后,我在输出中只得到null值。 Pojo结构: 输入: 输出: 决策表: Drl: 我无法确定我的输入是否错误或决策表中的条件是否错误。

  • 我正在从事这个项目,我的角色是开发使用标准健康保险xml的服务。服务必须在不同的xml字段上进行验证,这涉及将xml数据与数据库表中的数据进行比较。目前,我们假设所有保险公司的验证保持不变。但我怀疑它会保持不变,并且每家公司可能有不同的验证要求。在这种情况下,使用Drools规则引擎并为每家公司开发drl文件并使用规则引擎进行xml验证是个好主意吗

  • 本文向大家介绍Spring Boot+Drools规则引擎整合详解,包括了Spring Boot+Drools规则引擎整合详解的使用技巧和注意事项,需要的朋友参考一下 目的 官方的Drools范例大都是基于纯Java项目或Maven项目,而基于Spring Boot项目的很少。 本文介绍如何在Spring Boot项目上加上Drools规则引擎。 POM依赖 POM文件如下: 其中比较需要注意的是