欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

规则引擎Drools使用 第九篇 Drools 的高级语法之query使用

程序员文章站 2022-05-28 11:17:53
...

       query查询提供了一种查询working memory中符合约束条件的Fact对象的简单方法。它仅包含规则文件中的LHS部分,不用指定“when”和“then”部分并且以end结束。具体语法结构如下:

query 查询的名称(可选参数)  
    LHS
end

写规则文件/resources/rules/query.drl:

package testquery
import com.drools.entity.Student
/*
    此规则文件用于测试query查询
*/
​
//不带参数的查询
//当前query用于查询Working Memory中age>10的Student对象
query "query_1"
    $student:Student(age > 10)
end
​
//带有参数的查询
//当前query用于查询Working Memory中age>10同时name需要和传递的参数name相同的Student对象
query "query_2"(String sname)
    $student:Student(age > 20 && name == sname)
end

 编写单元测试

KieServices kieServices = KieServices.Factory.get();
KieContainer kieClasspathContainer = kieServices.getKieClasspathContainer();
KieSession kieSession = kieClasspathContainer.newKieSession();
​
Student student1 = new Student();
student1.setName("张三");
student1.setAge(12);
​
Student student2 = new Student();
student2.setName("李四");
student2.setAge(8);
​
Student student3 = new Student();
student3.setName("王五");
student3.setAge(22);
​
//将对象插入Working Memory中
kieSession.insert(student1);
kieSession.insert(student2);
kieSession.insert(student3);
​
//调用规则文件中的查询
QueryResults results1 = kieSession.getQueryResults("query_1");
int size = results1.size();
System.out.println("size=" + size);
for (QueryResultsRow row : results1) {
    Student student = (Student) row.get("$student");
    System.out.println(student);
}
​
//调用规则文件中的查询
QueryResults results2 = kieSession.getQueryResults("query_2","王五");
size = results2.size();
System.out.println("size=" + size);
for (QueryResultsRow row : results2) {
    Student student = (Student) row.get("$student");
    System.out.println(student);
}
//kieSession.fireAllRules();
kieSession.dispose();

使用query查询,在规则编写上他给我们优化了很多,但是它的使用局限性也很明显,它通常使用在查询内存中的数据。

相关标签: 规则引擎 drools