规则引擎 Drools(八):运行时组件 Query

Query 利用了 Drools 强大的模式匹配特性,从会话中获取信息。结构上,Query 只有 LHS 没有 RHS,支持使用参数来控制 LHS 条件。

Query 提供了两种查询方式:

  • 按需查询
  • 实时查询

示例

数据模型 Java 代码:

public class Person {

    private String name;

    private String sex;

    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

DRL:

query "girls" (Integer $age)  
    $girl: Person(sex == "female", age > $age)
end  

按需查询 Java 代码:

QueryResults queryResults = ksession.getQueryResults("girls", 18);  
for (QueryResultsRow row: queryResults) {  
    Person girl = (Person) row.get("$girl");
    System.out.println(girl.getName());
}

实时查询 Java 代码:

ksession.openLiveQuery("girls", new Object[]{18}, new ViewChangedEventListener() {  
    public void rowInserted(Row row) {
        Person girl = (Person) row.get("$girl");
        System.out.println(girl.getName());
    }

    public void rowDeleted(Row row) {}

    public void rowUpdated(Row row) {}
});

ksession.fireAllRules();