Drools:涉及从String到Object的Map的规则

时间:2016-04-13 05:57:05

标签: java drools kie

我需要帮助编写Drools规则。我有两个名为Context和CreditReport的类。

在触发规则之前,将Context作为事实插入到知识会话中。

我需要写一个打印出来的规则' Excellent'当信用评分超过800时,在控制台上。

理想情况下,我会将CreditReport直接插入会话,但不幸的是我没有这个选项。

我写的规则看起来并不好:

  1. 然后部分有 if语句
  2. 我是对CreditReport
  3. 的类型转换对象

    感谢您的帮助!

    // Context.java

    public class Context {
        private Map<String, Object> data = Maps.newHashMap();
    
        public <T> T getData(final String key, final Class<T> clazz) {
            return clazz.cast(data.get(key));
        }
    
        public void putData(final String key, final Object value) {
            this.data.put(key, value);
        }
    }
    

    // CreditReport.java

    public class CreditReport {
        private final String name;
        private final int creditScore;
    
        public String getName() {
            return this.name;
        }
    
        public int getCreditScore() {
            return this.creditScore;
        }
    
    }
    

    //主要方法

    context.put("creditReport", new CreditReport("John", 810));
    session.insert(Arrays.asList(context));
    session.fireAllRules();
    

    //规则

    rule "Excellent_Score"
    when Context($creditReportObject : getData("creditReport"))
    then
        final CreditReport creditReport = (CreditReport) $creditReportObject;
        if (creditReport.getCreditScore() >= 800) {
           System.out.println("Excellent");
        }
    end 
    

1 个答案:

答案 0 :(得分:1)

是什么让您插入包含单个Context对象的List<Context>? Java代码应该

context.put("creditReport", new CreditReport("John", 810));
session.insert( context );
session.fireAllRules();

规则现在可以写成

rule "Excellent_Score"
when 
   Context( $creditReportObject : getData("creditReport") )
   CreditReport( creditScore > 800 ) from $creditReportObject 
then
   System.out.println("Excellent");
end

当然,您可以从Context获取并插入CreditReport。 - 我怀疑你所表现的更复杂,但是#34;我没有这个选择&#34;无论如何都是代码味道。

修改单个规则有多种原因可供打印&#34;优秀&#34;可以写成如下所示,虽然这不比两个规则好得多,考虑到你可以将RHS包装成方法或DRL函数。

rule "Excellent_Score_2"
when 
   Context( $creditReport : getData("creditReport"),
            $account: getData("account") )
   ( CreditReport( creditScore > 800 ) from $creditReport
     or
     Account( balance >= 5000 ) from $account )
then
   System.out.println("Excellent");
end