Слюни, употребляемые изнутри, накапливаются из

В слюнях я могу сделать что-то вроде этого

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

    then
end
class Order {
   private String areaCode;
   private Customer customer;
}

class Customer {
  private String id;
}

Я хочу, чтобы правило определяло, есть ли более 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

Могу ли я получить доступ к customer.id способом, который я использую в rule 1 внутри из накопления?


person Dogukan Evcil    schedule 26.01.2021    source источник


Ответы (1)


Я немного не уверен в том, что именно вы пытаетесь сделать в своем примере rule3, но в целом да, вы можете иметь предложение from внутри скопления.

Вот пример. Предположим, что эти модели (геттеры и сеттеры подразумеваются, но опущены для краткости):

class Student {
  private String name;
  private List<Course> courses;
}

class Course {
  private Double currentGrade; // [0.0, 100.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

В своем накоплении вы можете использовать предложение «от», чтобы указать источник объектов, которые вы накапливаете. В моем случае это список, но вы также можете использовать оконные или временные операции.

person Roddy of the Frozen Peas    schedule 26.01.2021
comment
Спасибо за ответ, но мой случай немного отличается, но это было неясно. Я отредактировал вопрос, теперь он должен быть ясен. - person Dogukan Evcil; 27.01.2021
comment
Возможно, теперь это еще менее ясно. Ограничения в вашем объектном сопоставителе в аккумуляции в значительной степени следуют тем же правилам, что и за пределами аккумулирования. - person Roddy of the Frozen Peas; 27.01.2021
comment
@RoddyoftheFrozenPeas ОП пытается избежать использования определенного типа синтаксиса: customer.id. Ищем способ получить доступ к customer.id из объекта Order без вложенной нотации customer.id, но как в первом примере с использованием Customer($customerId : id) from $customer. - person Hasan Can Saral; 03.02.2021