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

在Drools右侧创建新的Scala对象

裴昊阳
2023-03-14

由于我在Drools中使用Scala不可变对象,为了更新事实,我需要创建一个新对象来替换它。我已经为要调用的规则编写了一个Scala方法,它只返回这样一个对象。

我的问题是,在Drools规则的“然后”部分中定义新的Scala case类对象的语法是什么?我尝试过类似于以下我在某处看到的语法,但它似乎也没有起到作用...(即使对于标准类型,如字符串)

then
    MyObject t = returnNewMyObject($a, $b)

目前对Drools Scala的支持和文档似乎相当有限。有什么想法吗?

(仅供参考,我已经阅读了以下问题,但它不是同一个查询……我的对象不是全局对象:Scala中的Drools专家输出对象)

DRL文件如下:

package resources

import function drools.RuleFunctions.*
import order.Cart
import order.CartLine
import generic.Amount

import scala.*
import scala.Option
import org.kie.api.runtime.KieRuntime
import java.math.BigDecimal


    dialect  "mvel"


    rule "Eval Cart Line"  
        agenda-group "init"
        auto-focus true
        dialect  "mvel"
        lock-on-active true
        salience 1000
        when
             $cart: Cart($line: lines(), amount == null) //If Cart found with lines, but with no cart amount set
             $o : CartLine($id : ref, $qty: quantity) from $line
        then
            Cart $newB = updateLineAmount($cart, $id, $qty, kcontext.getKieRuntime())
            update(kcontext.getKieRuntime().getFactHandle($cart),$newB) 
    end

    rule "Product 20% Discount"
        agenda-group "LineDiscount"
        auto-focus true
        dialect  "mvel"
        lock-on-active true
        salience 900
        when
            $cart: Cart($line : lines, amount == null)
            $o : CartLine(ref == "1234", amount != null ) from $line
        then
            Cart $newB = addLineDiscount($cart, $o, 20.0, kcontext.KieRuntime())
            update(kcontext.getKieRuntime().getFactHandle($cart), $newB)
        end

更新

object RuleFunctions {

  def updateLineAmount(cart: Cart, id: String, qty: Int, krt: KieRuntime): Cart= {...}

  def addLineDiscount(cart: Cart, bLine : CartLine, discPerc: Double, krt: KieRuntime): Cart= {...}
}

共有1个答案

曹波鸿
2023-03-14

从Scala对象类型导入方法在Drools中可能会出现问题。原因很简单,与Java相比,Scala中不存在静态方法。这是因为Scala对纯面向对象语言的含义有更严格的解释。

这意味着每当您尝试使用Drools导入函数语法时,它都找不到任何要导入的静态方法。因此,Drools编译器会抱怨对Scala单例对象类型中包含的方法的任何引用。

解决这一问题的一个方法是编写任何将在Java中的DRL中使用的类,在这些类中可以显式定义静态方法。Scala编译器会很高兴地将它们与Scala类一起编译。

 类似资料:
  • 问题内容: 我开始使用pl / sql开发Oracle运算符。指南中有一些示例,但现在我继续介绍。 在我所看到的所有示例中,始终都是这样的: 我们在子句中这样使用它: 是否可以创建一个像左侧和右侧一样使用的运算符? 在这种情况下: 谢谢你的帮助。 编辑:我知道它可以与PostgreSQL,但没有找到Oracle http://www.postgresql.org/docs/current/stat

  • 场景: 根据少数规则奖励学生。在这里,每个学生都有资格获得多项奖励,如成绩为80分的学生可以同时获得award\u 65和award\u 75。因此,在评估结果后,我想要一份学生有资格获得的奖项列表 这个用例有点不切实际,但我尝试将其与我的问题进行类比(无法发布,因为它包含敏感信息) 示例规则如下: 如果一个学生有80分,那么根据当前的分数(即没有元数据相关行),我可以在结果列表中获得两个对象 D

  • 问题内容: 我正在尝试kafka.utils.ZKStringSerializer用clojure创建一个scala对象。(在org.apache.kafka/kafka_2.10 “0.8.0”) 由于我对scala知之甚少,所以我不知道如何调用它的构造函数。我这样尝试过: 并得到一个错误: 我尝试使用来查看其方法,但是只有一些静态方法。并告诉我这是一类,而不是我想要的实例。 该对象的实现如下:

  • 问题内容: 我搜索了许多帖子,发现支持HTML。所以我可以做 得到多行。上面的代码将导致 但是,我想要的是 仅在窗口不可调整大小(并且非常愚蠢)时,才可以在“按:”之前添加空格。谁能告诉我如何修改此代码以使其按我的意愿工作? 问题答案: HTML比@MadProgrammer的答案略简单:

  • 我正在使用SWRevealViewController库在swift中制作一个滑出菜单,但我很难将这个菜单放在右侧。我在图书馆的描述上看到了这个注释 但我对目标C不熟悉,我无法在SWIFT上做到这一点。这是我的默认(左)菜单代码的一部分: 并且从SWRevealViewController库调用revealViewController

  • 我有一个带有类属性。我无法改变这一点。 我试图在它的右边浮动一个较小的div,但是,它总是出现在父div的下面。我必须如何标记CSS?