Drools - Найдите минимальную локальную дату Java 8

Я пытаюсь найти минимальную дату из списка дат (Java 8), используя функцию накопления в Drools.

Это мое правило:

rule "Print minimum Service Date from Bill Lines"
when
  accumulate ( 
    $lineItem : LineLevelData($dateOfService : dateOfService) , 
    $epochDay : min($dateOfService.toEpochDay())  
  )
  $minServiceDate : LocalDate() from LocalDate.ofEpochDay($epochDay)
then
  System.err.println("Min. Service Date used in rules calculation : " + $minServiceDate);
end

Это исключение, которое я получаю:

Unable to Analyse Expression LocalDate.ofEpochDay($epochDay):
[Error: unable to resolve method using strict-mode: java.time.LocalDate.ofEpochDay(java.lang.Comparable)]
[Near : {... LocalDate.ofEpochDay($epochDay) ....}]
                       ^ : [Rule name='Print minimum Service Date from Bill Lines']

Очевидно, мне не хватает некоторых основ. Может ли кто-нибудь помочь мне исправить это?

Версия дроола: 7.5.0

ПОЖО:

public class LineLevelData{

LocalDate dateofService;
}

Обновление:

rule "Print minimum Service Date from Bill Lines"

    when
                    accumulate ( $lineItem : LineLevelData (  $dateOfService : dateOfService   ) , 
                                                              $epochDay : min($dateOfService.toEpochDay())  )
                    $epochLong : Number (longValue  > 0 ) from $epochDay
                    $minServiceDate : LocalDate(  ) from LocalDate.ofEpochDay($epochLong)
            then

            System.err.println("Min. Service Date used in rules calculation : " + $minServiceDate);

end

После добавления приведения к Long эпоха преобразуется в локальную дату. Добавление этого на случай, если это поможет кому-то искать это.


person Suresh    schedule 14.06.2018    source источник


Ответы (1)


Я предполагаю, что проблема в том, что Drools не сохраняет тип возвращаемой функции min и обрабатывает его как Comparable, а не как long.

Есть 3 способа решить эту проблему:

Обходной путь:

rule "Print minimum Service Date from Bill Lines"
when
  $c: Comparable() from accumulate ( 
    LineLevelData($dateOfService : dateOfService) , 
    min($dateOfService)  
  )
  $minServiceDate: LocalDate() from $c
then
 System.err.println("Min. Service Date used in rules calculation : " + 
   $minServiceDate);
end

Надеюсь, поможет,

person Esteban Aliverti    schedule 15.06.2018
comment
Как всегда, ваш быстрый ответ на проблему Drools очень полезен. Я выбираю либо вариант 1, либо вариант 3, так как он больше подходит для нашей кодовой базы. Спасибо за помощь в решении этой проблемы. Я добавил актерский состав к своему первоначальному вопросу, и он тоже работает. - person Suresh; 15.06.2018