赞
踩
DRL文件结构:
package import function // Optional query // Optional declare // Optional global // Optional rule "rule name" // Attributes when // Conditions then // Actions end rule "rule2 name" ...
和java的package概念类似,唯一的命名空间。一个规则库可以包含很多的package,但通常将一个package下的所有规则放在一个文件中。
drools提倡package和文件的路径相同。
package必须在rule文件的第一行,但是其他的内容的顺序可以变化。
引入其他package的对象。
格式:packageName.objectName
可以在rule文件中定义函数。
在规则下的then之中调用function。
也可以import其他package的function。
实例:
function String hello(String applicantName) {
return "Hello " + applicantName + "!";
}
rule "Using a function"
when
// Empty
then
System.out.println( hello( "James" ) );
end
import function my.package.applicant.hello;
rule "Using a function"
when
// Empty
then
System.out.println( hello( "James" ) );
end
DRL文件中的Query在Drools引擎的工作内存中搜索与DRL文件中的规则相关的event。在DRL中定义Query,在java中调用query获得数据。
Query是全系统唯一的,必须保证在整个KIE中名称唯一。
实例:
DRL文件中的示例查询定义
query "people under the age of 21"
$person : Person( age < 21 )
end
获取查询结果的示例应用程序代码
QueryResults results = ksession.getQueryResults( "people under the age of 21" );
System.out.println( "we have " + results.size() + " people under the age of 21" );
查询结果的遍历方式:
QueryResults results = ksession.getQueryResults( "people under the age of 21" );
System.out.println( "we have " + results.size() + " people under the age of 21" );
System.out.println( "These people are under the age of 21:" );
for ( QueryResultsRow row : results ) {
Person person = ( Person ) row.get( "person" );
System.out.println( person.getName() + "\n" );
}
类型声明中声明的类型顺序与参数位置匹配。
如下实例,Location(x, y;)代替Location( thing == x, location == y):
declare Location
thing : String
location : String
end
query isContainedIn( String x, String y )
Location(x, y;)
or
( Location(z, y;) and ?isContainedIn(x, z;) )
end
主意:这里的“ z”将始终是“输出”变量。’?’ 符号表示查询仅是拉式查询。
可以使用@position重新定义顺序。
declare Cheese
name : String @position(1)
shop : String @position(2)
price : int @position(0)
end
org.drools.definition.type包中的@Position 可用于java的原始pojo。
DRL文件中的规则使用的event类型是新定义的类型或元数据:
declare Person
name : String
dateOfBirth : java.util.Date
address : Address
end
rule "Using a declared type"
when
$p : Person( name == "James" )
then // Insert Mark, who is a customer of James.
Person mark = new Person();
mark.setName( "Mark" );
insert( mark );
end
每个属性的类型都可以是任何有效的Java类型,包括您创建的另一个类或先前声明的事实类型。为了避免在每次声明类时都写出全限定名,可以将全称定义为import子句的一部分:
import java.util.Date
declare Person
name : String
dateOfBirth : Date
address : Address
end
Drools引擎会在编译时生成declare的类型的Java类。上面的Person对应的java类为:
public class Person implements Serializable { private String name; private java.util.Date dateOfBirth; private Address address; // Empty constructor public Person() {...} // Constructor with all fields public Person( String name, Date dateOfBirth, Address address ) {...} // If keys are defined, constructor with keys public Person( ...keys... ) {...} // Getters and setters // `equals` and `hashCode` // `toString` }
在规则文件中就可以直接使用Person类型了,如下:
rule "Using a declared type"
when
$p : Person( name == "James" )
then // Insert Mark, who is a customer of James.
Person mark = new Person();
mark.setName( "Mark" );
insert( mark );
end
定义方式:
declare enum <factType>
declare enum DaysOfWeek
SUN("Sunday"),MON("Monday"),TUE("Tuesday"),WED("Wednesday"),THU("Thursday"),FRI("Friday"),SAT("Saturday");
fullName : String
end
rule "Using a declared Enum"
when
$emp : Employee( dayOff == DaysOfWeek.MONDAY )
then
...
end
也就是java中的继承。
import org.people.Person
declare Person end
declare Student extends Person
school : String
end
declare LongTermStudent extends Student
years : int
course : String
end
元数据可用于类型以及类型的属性。
import java.util.Date
declare Person
@author( Bob )
@dateOfCreation( 01-Feb-2009 )
name : String @key @maxLength( 30 )
dateOfBirth : Date
address : Address
end
可以用于import的数据类型或者declare的数据类型:
import org.drools.examples.Person
declare Person
@author( Bob )
@dateOfCreation( 01-Feb-2009 )
end
declare org.drools.examples.Person
@author( Bob )
@dateOfCreation( 01-Feb-2009 )
end
元数据标签列表:
declare VoiceCall
@role( event )
end
declare VoiceCall
@role( event )
@timestamp( callDateTime )
end
declare VoiceCall
@role( event )
@timestamp( callDateTime )
@duration( callDuration )
end
declare VoiceCall
@role( event )
@timestamp( callDateTime )
@duration( callDuration )
@expires( 1h35m )
end
declare Person
firstName : String @key
lastName : String @key
age : int
end
对于此示例,Drools引擎检查firstName和lastName属性以确定两个的实例是否Person彼此相等,但不检查该age属性。Drools引擎还隐式生成了三个构造函数:一个没有参数,一个带有@key字段,一个带有所有字段的构造器:
Person() // Empty constructor
Person( String firstName, String lastName )
Person( String firstName, String lastName, int age )
declare Person
firstName : String @position( 1 )
lastName : String @position( 0 )
age : int @position( 2 )
occupation: String
end
在此示例中,按以下顺序在位置参数中对属性进行优先级排序:
1 lastName
2 firstName
3 age
4 occupation
在位置参数中,无需指定字段名称,因为位置映射到已知的命名字段。例如,参数Person( lastName == “Doe” )与相同Person( “Doe”
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。