2016-07-19 6 views
1

мои правила так же, как это:MVEL или Drools не могут решить, что его тип - это карта <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 

ответ

0

.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 

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

$p : Patient($labtestItem : labtests, 
       labtests.get("calcitonin") != null) 
+0

Большое спасибо! Это помогает мне много –

+0

еще один вопрос.if $ labtestItem.get ("calcitonin") return null, как я могу решить эту проблему? –