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

后语

此系列课程持续更新中,QQ群:593177274,欢迎大家加入讨论。目前国内第一套关于Drools(7)的入门教程《Drools 7 规则引擎入门教程》正在火热录制中,其他更多关于Drools的系列教程也在筹划中,希望大家多多支持。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏性能与架构

认识一下 Java 11

可能很多人现在 Java8 的新特性还没用熟呢,Java 11 就已经来了,下面一起来看下 Java 11 的几个新特性:

1362
来自专栏BY的专栏

Swift 4 新特性

2869
来自专栏jessetalks

由浅入深表达式树(一)创建表达式树

  为什么要学习表达式树?表达式树是将我们原来可以直接由代码编写的逻辑以表达式的方式存储在树状的结构里,从而可以在运行时去解析这个树,然后执行,实现动态的编辑和...

3284
来自专栏小樱的经验随笔

Codeforces Round #434 (Div. 2, based on Technocup 2018 Elimination Round 1)&&Codeforces 861C Did yo

C. Did you mean... time limit per test:1 second memory limit per test:256 megaby...

2755
来自专栏跟着阿笨一起玩NET

一道小小面试题的细节分析

581
来自专栏大内老A

通过实例模拟ASP.NET MVC的Model绑定机制:数组

[续《通过实例模拟ASP.NET MVC的Model绑定机制:简单类型+复杂类型]》]基于数组和集合类型的Model绑定机制比较类似,对于绑定参数类型或者参数类...

2979
来自专栏Golang语言社区

厚土Go学习笔记 | 28. go语言没有类 却可以在结构体或任意类型定义方法

在go语言中没有类。可是,是有方法的。 给结构体定义方法,在对应的 func 和方法名之间,加上方法的接收者就可以了。 比如,我们定义了一个结构体 type V...

3818
来自专栏技术博客

C#泛型委托Predicate、Action、Func

Predicate泛型委托:表示定义一组条件并确定指定对象是否符合这些条件的方法。此委托由 Array 和 List 类的几种方法使用,用于在集合中搜索元素。 ...

1472
来自专栏博客园

.NET Core中延迟单例另一种写法【.NET Core和.NET Framework的beforefieldinit差异】

   前段时间在反编译代码时无意间看到在类中有一个BeforeFieldInit特性,处于好奇的心态查了查这个特性,发现这是一个关于字段初始化时间的特性【提前初...

1854
来自专栏恰童鞋骚年

.NET中那些所谓的新语法之二:匿名类、匿名方法与扩展方法

开篇:在上一篇中,我们了解了自动属性、隐式类型、自动初始化器等所谓的新语法,这一篇我们继续征程,看看匿名类、匿名方法以及常用的扩展方法。虽然,都是很常见的东西,...

1233

扫码关注云+社区

领取腾讯云代金券