如何在drools中访问自定义对象的地图

时间:2014-04-21 09:58:30

标签: java drools rule-engine

我有以下Drools规则文件,我向其发送填充了Custom对象(NodeElement)的地图,map是一个全局变量,因为它必须被所有规则访问,有另一个全局变量错误,当规则失败时填充。我已经使用了eval并且能够成功执行它。经过一些研究,发现eval有一些性能问题?

我的问题是......

1)性能问题可以忽略不计吗?

2)使用eval是一种很好的做法吗?

3)如果我必须重写这些规则?这是最好的方法吗?

import java.util.Map;
import com.infodev.pojo.NodeElement;
import com.main.Errors;
import com.validation.DateValidation;

global java.util.Map map;
global com.main.Errors errors;


rule "Fixed / Floating ccy rule"

    when
        eval(!((NodeElement)map.get("FixedCurrency")).getValue().equals(((NodeElement)map.get("FloatingCurrency")).getValue()))
    then 
        errors.addError( "Currency", "Fixed currency should be same as Floating currency" );
end

rule "Payment / Settlement date rule"

    when
        eval(!(DateValidation.paymentDateValidation(((NodeElement)map.get("tradeDate")).getValue(),((NodeElement)map.get("paymentDate")).getValue())))

    then 
        errors.addError(map.get("paymentDate").toString(), "Payment date should be after trade date" );

end

地图是:

Map<String, NodeElement> map = new HashMap<String, NodeElement>();
    map.put("FixedCurrency", new NodeElement("FixedCurrency", "USD"));
    map.put("FloatingCurrency", new NodeElement("FloatingCurrency", "UD"));
    map.put("tradeDate", new NodeElement("tradeDate", "2012-01-22"));
    map.put("paymentDate",new NodeElement("paymentDate", "2012-01-2"));

2 个答案:

答案 0 :(得分:1)

鉴于NodeElement可以使用您用作Map的键的相同String来识别,为什么不直接将NodeElements插入到会话中?通过这样做,您可以像这样重写规则:

rule "Fixed / Floating ccy rule"
when
    $n1: NodeElement( id == "FixedCurrency")
    $n2: NodeElement( id == "FloatingCurrency", value != $n1.value)
then
    errors.addError( "Currency", "Fixed currency should be same as Floating currency" );
end

rule "Payment / Settlement date rule"
when
    $n1: NodeElement( id == "tradeDate")
    $n2: NodeElement( id == "paymentDate", value != $n1.value)
    eval(!(DateValidation.paymentDateValidation($n1.value, $n2.value)))
then
    errors.addError($n2.value.toString(), "Payment date should be after trade date" );
end

我不能告诉你是否通过重写这样的规则会增加你的表现。这也取决于其他事情。你认为通过这种新方法获得的一件事是可读性。

希望它有所帮助,

答案 1 :(得分:-1)

您没有规则,您有if语句(伪装成规则)处理Map对象和其他静态对象中的值。 (为什么不在添加到地图后运行这些检查?)

我的规则中没有eval

如果您需要eval,则必须使用eval,如果可以避免,请避免使用。