Слюни - Найти минимальную Java 8 Local Date
Я пытаюсь найти минимальную дату из списка дат (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
POJO:
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
После добавления приведения к Лонгу, эпоха преобразуется в Локальную дату. Добавление это в случае, если это помогает кому-то, ищущему это.
1 ответ
Решение
Я думаю, проблема в том, что Drools не сохраняет тип min
функция возвращается и рассматривает это как Comparable
а не как long
,
Есть 3 способа решить эту проблему:
- Создайте свою собственную функцию накопления, чтобы иметь дело с
LocalDate
- Используйте накопление со встроенным кодом
- Используйте обходной сильфон, чтобы заставить Drools
cast
Comparable
вернуться кLocalDate
,
Временное решение:
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
Надеюсь, поможет,