drools規則語言指南(二)在DRL中類型和元數據定義

在DRL中類型和元數據定義

結構

類型聲明結構:
image
元數據結構:
image
兩種用途html

  1. new一個新的fact
  2. 使用元數據@key(value)這種方式,關聯新的或已存在的fact

不帶有元數據的類型聲明:

一個新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

DRL中定義枚舉類型:

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中極其類似函數

DRL中類型繼承

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
}
  1. @role:定義這個fact是一個常規的fact仍是一個event(在drools engine 復瑣事件處理的時候),默認值是fact
@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...

相關文章
相關標籤/搜索