Query查询
首先,我们先来看一下query的语法结构图:
Query语法提供了一种查询working memory中符合约束条件的FACT对象的简单方法。它仅包含规则文件中的LHS部分,不用指定“when”和“then”部分。Query有一个可选参数集合,每一个参数都有可选的类型。如果没有指定类型,则默认为Object类型。引擎会尝试强转为需要的类型。对于KieBase来说,query的名字是全局性的,因此不要向同一RuleBase 的不同包添加相同名称的query。
使用ksession.getQueryResults(“name”)方法可以获得查询的结果,其中name为query的名称,方法的返回结果一个列表,从中可以获取匹配查询到的对象。
下面是具体的实例:
package com.rules import com.secbro.drools.model.Person; rule "query-test" agenda-group "query-test-group1" when $person : Person() then System.out.println("The rule query-test fired!"); end query "query-1" $person : Person(age > 30) end query "query-2"(String nameParam) $person : Person(age > 30,name == nameParam) end
测试代码一:
@Test public void queryTest() { KieSession kieSession = this.getKieSession("query-test-group1"); Person p1 = new Person(); p1.setAge(29); Person p2 = new Person(); p2.setAge(40); kieSession.insert(p1); kieSession.insert(p2); int count = kieSession.fireAllRules(); System.out.println("Fire " +count + " rule(s)!"); QueryResults results = kieSession.getQueryResults("query-1"); System.out.println("results size is " + results.size()); for(QueryResultsRow row : results){ Person person = (Person) row.get("$person"); System.out.println("Person from WM, age : " + person.getAge()); } kieSession.dispose(); }
执行测试代码一打印结果:
The rule query-test fired!
The rule query-test fired!
Fire 2 rule(s)!
results size is 1
Person from WM, age : 40
通过执行结果可以看到,我们拿到了WM中的符合条件的结果。在测试代码中也展示了如何获取结果列表及从结果列表中获得对象的方法。
测试代码二:
@Test public void queryWithParamTest() { KieSession kieSession = this.getKieSession("query-test-group1"); Person p1 = new Person(); p1.setAge(29); p1.setName("Ross"); Person p2 = new Person(); p2.setAge(40); p2.setName("Tom"); kieSession.insert(p1); kieSession.insert(p2); int count = kieSession.fireAllRules(); System.out.println("Fire " +count + " rule(s)!"); QueryResults results = kieSession.getQueryResults("query-2","Tom"); System.out.println("results size is " + results.size()); for(QueryResultsRow row : results){ Person person = (Person) row.get("$person"); System.out.println("Person from WM, age : " + person.getAge() + "; name :" + person.getName()); } kieSession.dispose(); }
此段代码执行的结果如下:
The rule query-test fired!
The rule query-test fired!
Fire 2 rule(s)!
results size is 1
Person from WM, age : 40; name :Tom
这段代码中我们添加了参数,通过参数可以进一步过滤结果。Query支持多参数,通过逗号分隔具体的参数。具体的使用方法参考上面的代码。