《Drools7.0.0.Final规则引擎教程》第4章 Query查询之基础详解编程语言

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支持多参数,通过逗号分隔具体的参数。具体的使用方法参考上面的代码。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/15187.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论