Drools 6.4 OOPath和多态列表

Drools 6.4 OOPath和多态列表,drools,Drools,我试图找到一个优雅的OOPath表达式来匹配一个对象。我当前的域/规则模型已更改 具有子类型的事件,例如JobEvent(具有属性“jobName”)、ServiceEvent 由一个或多个事件引起的警报(如果类型为列表,则作为属性“原因”存储在警报对象中) 现在,我正在尝试编写一个规则,如果同一个作业之前没有警报存在,则该规则应触发并创建JobEvent的新警报。我试过了 rule "Create Alert for Failed Job" when e : JobEvent(sta

我试图找到一个优雅的OOPath表达式来匹配一个对象。我当前的域/规则模型已更改

  • 具有子类型的事件,例如JobEvent(具有属性“jobName”)、ServiceEvent
  • 由一个或多个事件引起的警报(如果类型为列表,则作为属性“原因”存储在警报对象中)
现在,我正在尝试编写一个规则,如果同一个作业之前没有警报存在,则该规则应触发并创建JobEvent的新警报。我试过了

rule "Create Alert for Failed Job"
when
   e : JobEvent(status == "FAILURE") from entry-point "JobPoller"
   not ( Alert( /causes{jobName == e.jobName} ) )
但很明显,这会导致

[Error: unable to resolve method using strict-mode: ....Event.jobName()
因为列表的类型(来自原因属性)是Event,并且只有子类型JobEvent具有属性jobName

它尝试过这样的事情

not ( Alert( /causes#JobEvent{jobName == e.jobName} ) )
或instanceof的变体,但找不到表达我的OOPath查询的方法


有这样做的选项吗?

为什么不简单地将该方法添加到基类中,在那里抛出UnsupportedMethodException,并在JobEvent子类中重写(即保留现有内容)。感谢Wolfgang,这或多或少是我作为一种解决方法实现的。展平域模型。这是可行的,并且OOPath足够好,可以优雅地处理空值。仍然想知道是否有办法处理这个问题。请看这里的测试示例-#inline cast进入内部。警报(/causes{#JobEvent,jobName==e.jobName}。这意味着原因列表将被迭代,其中一个元素匹配JobEvent的一个实例,然后使用该类型将其应用于其他约束。工作正常,谢谢标记!