Drools 从内流口水,从外流口水

Drools 从内流口水,从外流口水,drools,drools-fusion,Drools,Drools Fusion,在口水中,我可以做这样的事情 rule "rule1" dialect "java" no-loop true when $order: Order( $cust: customer ) Customer(id == "213123") from $cust then end 我希望规则能够确定一个小时内是否有超过3个不同的客户从同一区号订购。假设一个新订单进来了

在口水中,我可以做这样的事情

rule "rule1"
    dialect "java"
    no-loop true
    
    when
       $order: Order( $cust: customer )
       Customer(id == "213123") from $cust

    then
end
我希望规则能够确定一个小时内是否有超过3个不同的客户从同一区号订购。假设一个新订单进来了,我想检查一个小时内是否有3个或更多来自不同客户的订单到达同一地区

rule "rule2"
    dialect "java"
    no-loop true
    
    when
        $order: Order( $cust: customer, $areaCode: areaCode)
        Customer( $custId: id) from $cust       
        Set( size >= 3 ) from accumulate ( 
            Order( $id: id, areaCode == $areaCode, customer.id != $custId ) over window:time( 1h ),
            collectSet( $id ) )

    then
end

我可以用我在规则1中使用的方式从累积中访问
customer.id
吗?

我有点不确定您在示例“rule3”中到底想做什么,但通常是的,您可以在累积中包含一个“from”子句

这里有一个例子。假设这些模型(隐含了getter和setter,但为了简洁起见省略了它们):

班级学生{
私有字符串名称;
私人名单课程;
}
班级课程{
专用双电流等级;//[0.0100.0]
}
假设我们想写一条规则,在这里我们可以识别出有3个或更多班级的学生的成绩<70.0

rule "Students with three or more classes with less than a 70"
when
  $student: Student($courses: courses != null)
  $failingCourses: List( size >= 3 ) from accumulate (
    $course: Course( currentGrade < 70.0 ) from $courses,
    collectList( $course )
  )
then
  System.out.println("Student '" + $student.getName() + "' is failing " + $failingCourses.size() + " courses.");
end
规则“三个或三个以上班级成绩低于70分的学生”
什么时候
$student:student($courses:courses!=null)
$failingCourses:累积中的列表(大小>=3)(
$course:课程(当前等级<70.0)从$courses开始,
收集名单(课程)
)
然后
System.out.println(“Student'+$Student.getName()+“'不及格”+$failingCourses.size()+“courses”);
结束

在累积中,可以使用“from”子句来指示正在累积的对象的来源。在我的例子中,它是一个列表,但您也可以使用窗口或临时操作。

谢谢您的回答,但我的例子有点不同,但不清楚。我编辑了这个问题,它现在一定很清楚了。可以说,现在更不清楚了。在accumulate中,对象匹配器中的约束与accumulate外部的约束几乎遵循相同的规则。@RoddyOfFrozenPeas OP试图避免使用某些特定类型的语法:
customer.id
。正在寻找从
Order
对象访问
customer.id
的方法,该方法不使用嵌套的
customer.id
符号,但与第一个示例中使用$customer的
customer($customerId:id)类似。
class Student {
  private String name;
  private List<Course> courses;
}

class Course {
  private Double currentGrade; // [0.0, 100.0]
}
rule "Students with three or more classes with less than a 70"
when
  $student: Student($courses: courses != null)
  $failingCourses: List( size >= 3 ) from accumulate (
    $course: Course( currentGrade < 70.0 ) from $courses,
    collectList( $course )
  )
then
  System.out.println("Student '" + $student.getName() + "' is failing " + $failingCourses.size() + " courses.");
end