如何在Drools中访问嵌套类

时间:2018-02-02 10:52:55

标签: scala drools

我是Drools的初学者。 我在scala中有这个模型:

case class OuterClass (int parentValue ) {
   lazy val childs: Seq[InnerClass] = getChilds()

   case class InnerClass (int childValue ) {
   }
}

我需要创建一个Drools规则来检查parentValue = 1的父项,并且至少有一个childValue = 2的子项

我创建了这条规则:

dialect "mvel"
import com.models.OuterClass
rule "1"
when
 $parent: OuterClass($pv: parentValue, $c: childs, $pv == 1)
 $parent.InnerClass($cv: childValue, $cv == 2) from $c
then
 "do something"
end

但我收到以下错误:"无法解析ObjectType' $ parent.InnerClass'"

如何在Drools中访问嵌套类?

1 个答案:

答案 0 :(得分:1)

你几乎得到了它!

您正在寻找的规则是这样的:

rule "1"
when
  $parent: OuterClass($pv: parentValue == 1)
  $inner: InnerClass($cv: childValue == 2) from $parent.childs
then
  "do something"
end

如您所见,父母与子女之间的关系在from的右侧说明。

此规则的问题在于,对于具有值== 2和OuterClass对象的子项,将执行多次。如果您只是想检查是否存在值<=> 2的至少一个子项,那么您可以尝试这样的事情:

rule "1"
when
  $parent: OuterClass($pv: parentValue == 1)
  exists( InnerClass(childValue == 2)) from $parent.childs
then
  "do something"
end

请注意,在这种情况下,您无法将变量绑定到第二个模式,因为您不知道它将是哪个变量。

如果您需要获取有关与模式匹配的InnerClass对象的信息,但您仍希望仅执行一次规则,则策略可能是收集所有InnerClass个对象集合:

rule "1"
when
  $parent: OuterClass($pv: parentValue == 1)
  $list: List(size > 0) from collect( 
    InnerClass(childValue == 2) from $parent.childs
  )
then
  "do something"
end  

希望它有所帮助,