類型聲明結構:
元數據結構:
兩種用途html
一個新fact的定義能夠不須要元數據,可是必需要包含屬性或者字段。
下面是在DRL中定義了一個新的fact類型 Personjava
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
Person中有三個屬性,_name_,_dateOfBirth_ 是java提供的類型 address 是咱們本身定義的類型
爲了不使用全路徑名,可使用import語句導入進來,以下:segmentfault
import java.util.Date declare Person name : String dateOfBirth : Date address : Address end
當你在drl文件中定義了這樣的一個類型時,drools engine在編譯的時候會生成以下的java類,和定義的
這個類型一一對應:session
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` }
理解了這個,以後你就能夠像使用普通的fact那樣在規則中使用它:數據結構
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 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
和java中的繼承也基本一致spa
元數據其實就是對數據作解釋和下定義的數據。code
import java.util.Date declare Person @author( Bob ) @dateOfCreation( 01-Feb-2009 ) name : String @key @maxLength( 30 ) dateOfBirth : Date address : Address end
上面例子中的元數據 @author( Bob ) 定義了這個類的做者是BOb @dateOfCreation( 01-Feb-2009 ) 定義了建立時間
@key 定義name做爲構造函數的字段,@maxLength( 30 ) 定義了這個字段的最大長度是30
介紹一下下面的幾個元數據標籤:
先聲明一個要使用的java類:htm
public class VoiceCall { private String originNumber; private String destinationNumber; private Date callDateTime; private long callDuration; // in milliseconds // Constructors, getters, and setters }
@role( fact | event )
聲明爲eventblog
declare VoiceCall @role( event ) end
@timestamp:在drools engine中的每個event時間字段,默認是session的時間
使用:
@timestamp( <attributeName> )
時間字段爲callDateTime
declare VoiceCall @role( event ) @timestamp( callDateTime ) end
@duration
declare VoiceCall @role( event ) @timestamp( callDateTime ) @duration( callDuration ) end
@typesafe
declare VoiceCall @role( fact ) @typesafe( false ) end
@serialVersionUID
declare VoiceCall @serialVersionUID( 42 ) end
@key重點講一下這個
<attributeDefinition> @key
這個 @key主要是在構造函數那裏使用例如:
declare Person firstName : String @key lastName : String @key age : int end
生成的java類就會是這個樣子:
Person() // Empty constructor Person( String firstName, String lastName ) Person( String firstName, String lastName, int age )
實例化的時候:
Person person = new Person( "John", "Doe" );
@position :定義屬性和參數的位置
<attributeDefinition> @position ( <integer> )
例如:
declare Person firstName : String @position( 1 ) lastName : String @position( 0 ) age : int @position( 2 ) occupation: String end
那麼實際上屬性的位置就是按照以下順序
lastName firstName age occupation
這個在寫規則源碼的時候會很是重要,對應某個屬性對應什麼值
Person( "Doe", "John", $a; ) Person( "Doe", "John"; $a : age ) Person( "Doe"; firstName == "John", $a : age ) Person( lastName == "Doe"; firstName == "John", $a : age )
在繼承中如何生效:
declare Person firstName : String @position( 1 ) lastName : String @position( 0 ) age : int @position( 2 ) occupation: String end declare Student extends Person degree : String @position( 1 ) school : String @position( 0 ) graduationDate : Date end
實際的順序就是:
lastName (position 0 in the parent type) school (position 0 in the subtype) firstName (position 1 in the parent type) degree (position 1 in the subtype) age (position 2 in the parent type) occupation (first field with no position annotation) graduationDate (second field with no position annotation)
更多解釋參考官方文檔:https://docs.jboss.org/drools...