Я оцениваю Drools 6 в доказательстве применения концепции. Я либо неправильно понимаю, как работают запросы в Drools, либо я не реализовал что-то должным образом. Может кто-нибудь объяснить это поведение мне:Drools Queries. Как они оцениваются и выполняются?
У меня есть правило, которое, как предполагается, действует на проверенных записях, как это:
rule "Patient Intake: Valid new Patients without a Medical History require a Review"
ruleflow-group "Patient Intake"
when
$patient : Patient(status == PatientStatus.NEW)
not Invalid(value == $patient)
then
modify($patient){
setStatus(PatientStatus.PENDING_REVIEW)
};
insert(new Valid($patient));
end
query "Intake Results"
Valid($patients : value)
end
Допустимых/инвалидные объектов используется как можно было бы использовать признак, однако документация указала, что функция признака все еще экспериментальна/подвержена изменениям, поэтому я выбрал эту альтернативу в настоящее время. Думаю, запрос достаточно прост. Я использую сессию без учета состояния и вызывая механизм как службу принятия решений. Следующий фрагмент кода показывает, как вызывается двигатель (некоторые значения зашиты в данный момент):
StatelessKieSession kSession = kContainer.newStatelessKieSession("TestKSession");
KieRuntimeLogger auditLog = KieServices.Factory.get().getLoggers().newFileLogger(kSession, "audit");
kSession.setGlobal("logger", logger);
List<Command> commands = new ArrayList<Command>();
commands.add(CommandFactory.newInsertElements(request.getAllFacts()));
commands.add(CommandFactory.newQuery("$patients", "Intake Results"));
commands.add(CommandFactory.newStartProcess("x.y.z.intake");
ExecutionResults results = kSession.execute(CommandFactory.newBatchExecution(commands));
auditLog.close();
И обрабатывать результаты, как это:
private void processResults(ExecutionResults results) {
QueryResults qr = (QueryResults) results.getValue("$patients");
for (QueryResultsRow row : qr) {
// ... this code is never executed
}
}
В консоли я вижу Println что размер QueryResult равен 0. Однако, если я изменяю запрос, чтобы просто собрать $ пациентов: Object(), размер QueryResult - это количество объектов, вставленных через CommandFactory, и не включает объекты, вставленные как часть RHS править. Когда я проверяю журнал аудита, я вижу, что объект типа Valid действительно вставлен.
Почему мой запрос не возвращает ожидаемые результаты? Я реализовал что-то неправильно или я просто не понимаю, как работают запросы?
Спасибо, Джеймс