Разве MVEL или Drools не могут разрешить тот факт, что его тип Map‹String,List‹Object››?

мои правила таковы:

   rule "calcitonin evaluation"
     lock-on-active true
     salience 0
   when
     $p : Patient($labtestItem : labtests.get("calcitonin").get("0"))
     LabTestItem($result : result.substring(1,(result.length)-1), parseFloat($result) > 8.4) from $labtestItem
   then
     $labtestItem.setAbnormalIndicator("high");
     $labtestItem.setAttentionLevel("important");
     modify($p){}
   end

но он всегда строится с ошибкой:

Unable to Analyse Expression labtests.get("calcitonin").get(0):
sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl cannot be cast to java.lang.Class

если я пишу свои правила так, они работают:

   rule "calcitonin evaluation"
     lock-on-active true
     salience 0
   when
     $p : Patient($labtestItem : labtests)
   then
     System.out.println($labtestItem.get("calcitonin"));
     modify($p){}
   end

person Young Harry    schedule 19.07.2016    source источник


Ответы (1)


.get("0") не имеет смысла - List.get ожидает целое число. Но от этого проблема не исчезнет. Вам нужно логическое выражение, если это не простая привязка.

Я бы написал правило так:

rule "calcitonin evaluation"
when
  $p : Patient($labtestItem : labtests)
  $lti: LabTestItem($result : result, parseFloat($result.substring(1,(result.length)-1)) > 8.4) from $labtestItem.get("calcitonin").get(0)
then
  $lti.setAbnormalIndicator("high");
  $lti.setAttentionLevel("important");
  modify($p){}
end

Изменить. Чтобы избежать нулевого результата $labtestItem.get("calcitonin"), добавьте защиту в качестве ограничения:

   $p : Patient($labtestItem : labtests, 
                labtests.get("calcitonin") != null)
person laune    schedule 19.07.2016
comment
Большое спасибо! Мне очень помогает - person Young Harry; 20.07.2016
comment
еще один вопрос. Если $labtestItem.get(calcitonin) возвращает значение null, как я могу решить эту проблему? - person Young Harry; 20.07.2016