2015-05-05 3 views
2

Я оцениваю 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 действительно вставлен.

Почему мой запрос не возвращает ожидаемые результаты? Я реализовал что-то неправильно или я просто не понимаю, как работают запросы?

Спасибо, Джеймс

ответ

1

Порядок, в котором команды добавлены вопросы. Добавление команды запроса является сигналом движку для выполнения этого запроса, поэтому факты вставляются и запрос выполняется до начала процесса.

Реверсирование линий, в которые были добавлены запросы, и процесс был ключевым. Теперь следует читать:

List<Command> commands = new ArrayList<Command>(); 
commands.add(CommandFactory.newInsertElements(request.getAllFacts())); 
commands.add(CommandFactory.newStartProcess("x.y.z.intake"); 
commands.add(CommandFactory.newQuery("$patients", "Intake Results")); 
Смежные вопросы