一、規則檔案
標準的規則檔案以”.drl”結尾。
一套完整的規則檔案內容如下:
- package:包名,只限於邏輯上的管理,若自定義的查詢或函式位於同一包名,不管物理位置如何,都可以直接呼叫。
- import:規則引用問題,匯入類或靜態方法。
- global:全域性變數,使用時需要單獨定義變數型別
- function:自定義函式,可以理解為Java靜態方法的一種變形,與JavaScript函式定義相似。
- queried:查詢。
- rule end:規則內容中的規則體,是進行業務規則判斷、處理業務結果的部分。
二、規則體語法結構
一個規則體包含三個部分,唯有attributes部分是可選,其他關鍵字都是必填資訊。屬性可選並不表示沒有,屬性是有預設值的,如規則預設是被啟用的。
規則體語法結構如下:
- rule:規則開始,引數是規則的唯一名稱
- attributes:規則屬性,是rule與when之間的引數,為可選項
- when:規則條件部分,預設為true
- then:規則結果部分
- end:當前規則結束
三、匹配模式
LHS部分由一個或多個條件組成,條件又稱pattern。多個pattern之間既可以使用and或or連線,又可以使用小括號確定pattern的優先順序,預設條件是true。
pattern的”繫結變數名”是可選的,當前規則的RHS部分需要操作pattern匹配的引數,若要用到某些物件,則可以通過為該物件設定一個繫結變數名來實現對它的操作。對於繫結變數的命名,通常是為其新增一個”$”符號作為字首,與物件的命名方法相同;繫結變數不僅可以用在物件上,也可以用在物件的屬性上,作用是方便RHS部分的操作,同時也避免與Fact物件屬性的使用相混淆。
“Field約束”是指當前物件中屬性或方法的使用,如新增條件限制”name==’YC’,age==24”.
規則體中LHS部分繫結變數基本上有兩種形式:一種是整個Fact變數的繫結,另一種是約束條件屬性變數的繫結。
四、運算子
運算子是在程式中最常用的計算方法,一般的運算子包括”+、-、*、/、%”等,優先順序與Java相同。
五、約束連線
匹配模式中有多種約束符的連線,常用的有”&&”(and)、”||”(or)、”,”(and)。這3個連線符號如果沒有用括號來顯示定義的優先順序,那麼”&&”優先順序大於”||”優先順序。
Drools自帶的約束,共有6種比較操作符。
1.contains比較操作符
contains是用來檢查一個Fact物件的某個屬性值是否包含一個指定的物件值。其語法格式為:
Object[field[Collection/Array] contains | not contains value]
2.not contains 比較運算子
not contains的作用與contains相反,它是用來判斷一個Fact物件的某個欄位不包含一個指定的物件。
3.memberOf比較運算子
memberOf用來判斷某個Fact物件的某個欄位是否在一個或多個集合中。其語法格式為:
Object(fieldName memberOf | not memberOf value[Collection/Array])
4.not memberOf比較運算子
not memberOf與memberOf的作用相反,是用來判斷Fact物件中某個欄位不在某個集合中。
5.matches比較運算子
matches用來對某個Fact物件的欄位與標準的Java正規表示式進行相似匹配,被比較的字串可以是一個標準的Java正規表示式。但需要注意的是,正規表示式字串中不用考慮”\”的轉義問題,其語法為:
Object(fieldName matches | not matches "正規表示式")
6.not matches 比較運算子
not matches的作用與matches相反,是用來將某個Fact物件的欄位與一個Java標準正規表示式進行匹配,若與正規表示式不匹配,則規則成立。
7.soundlike比較運算子
soundlike用來檢查單詞是否具有與給定值幾乎相同的聲音(使用英語發音)。基於Soundex演算法的語法為:
Object(fieldName soundlike 'value')
8.str比較運算子
str不僅檢查String欄位是否以某一值開頭/結尾,還可以判斷字串長度,其語法為:
Object(fieldName str[startWith|endWith|length] "String"|1)
六、語法擴充套件
主要指List、Set、Map等元素操作。