Есть ли способ вызвать запрос из правила в файле DRL?

У меня есть требование связать правило окна с правилом окна. Мой вариант использования:

Если появление температуры> 50 в 5-минутном окне больше 10, тогда найдите максимальную (среднюю) температуру в этой рамке окна или любое другое цепное правило для этих данных окна.

Я попробовал следующий подход:

query getFactFromMemory(long time)
   $fact : Fact(timepoing < (drools.getWorkingMemory().getSessionClock().getCurrentTime() + time))
end

rule "window rule"
when
   //condition
then
   //action
end

rule "chain rule"
when
   //condition
then
  getFactFromMemory(1000L)
 //loop over facts and then perform some action
end

Я получаю ошибки при вызове запроса. Я попытался вызвать запрос в части when и назначить его переменной, но это также дало ошибку (Query's must use positional or bindings, not field constraints:1000L и Query binding is not supported by non-abductive queries : $variable).

Может ли кто-нибудь помочь мне решить эту ошибку или предложить какой-либо другой подход к проблеме?


person Prog_G    schedule 09.05.2019    source источник


Ответы (1)


Мы можем получить объект времени выполнения drools внутри drl, вызвав drools.getKieRuntime(). Итак, рабочее правило для вопроса:

query getFactFromMemory(long time)
   $fact : Fact(timepoing < (drools.getWorkingMemory().getSessionClock().getCurrentTime() + time))
end

rule "window rule"
when
   //condition
then
   //action
end

rule "chain rule"
when
   //condition
then
  getFactFromMemory(1000L)
 //loop over facts and then perform some action
end
person Prog_G    schedule 16.12.2019