在Drools右侧创建新的Scala对象

时间:2015-02-04 14:12:28

标签: scala drools

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

我的查询是,在"然后"中定义新Scala案例类对象的语法是什么? Drools规则的一部分?我尝试过类似于下面的语法,我在某个地方看过,但它似乎也没有做到这一点......(即使是像Strings这样的标准类型)

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

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

(仅供参考,我已经阅读了以下问题,而且查询不一样......我的对象不是全球性的:Drools Expert output object in Scala

下面的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 个答案:

答案 0 :(得分:1)

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

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

解决这个问题的方法是编写将在Java中使用的DRL中的任何类,您可以在其中明确定义静态方法。 Scala编译器很乐意与Scala类一起编译它们。