如何在 Drools 中访问嵌套的 class

How to access nested class in Drools

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

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

   case class InnerClass (int childValue ) {
   }
}

我需要创建一个 Drools 规则来检查 parents 与 parentValue = 1,并且至少有一个 child 与 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

但我收到以下错误:"Unable to resolve ObjectType '$parent.InnerClass'"

如何在 Drools 中访问嵌套的 class?

你快成功了!

您要找的规则是这样的:

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

如你所见,parent和child的关系在from的右边。

这条规则的问题在于,它会被执行的次数与 children 的值 == 2 和 OuterClass object 的执行次数一样多。如果您只想检查是否存在 至少一个 child 且值为 ==2,那么您可以尝试这样的操作:

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

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

如果您需要获取有关 InnerClass object/s 匹配模式的信息,但您仍然希望只执行一次规则,一个策略可以是收集所有 InnerClass objects 在一个集合中:

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

希望对您有所帮助,