2016-08-16 28 views
0

我正在使用Optaplanner 6.2Final版本和一切工作正常,除了匹配運算符。 解釋更多,這是我的規則。Drools規則運算符匹配不適用Optaplanner 6.2Finalinal

rule "TEST REG EXP OPERATOR" 
when 
    $cheese:Cheese($cheese.type matches "(Buffulo)?\\S*Mozarella") 
then 
    scoreHolder.addSoftConstraintMatch(kcontext, 1); 
end 

以下是拋出的異常:

Exception in thread "main" [Error: unable to resolve method: com.app.test.domain.Cheese.$cheese() [arglength=0]] 
[Near : {... $cheese.type ~= "(Buffulo)?\\S*Mozarella" ....}] 

注意:如果我刪除$奶酪。類型前面的聲明,規則沒有問題。這工作正常:

$cheese:Cheese($cheese.type == "Buffulo") 

任何意見,將不勝感激。

UPDATE: 事實證明,以下拋出異常,僅在Drools的核心版本6.2.0.Final和6.3.0.Final我做檢查的所有版本之後。它在其他版本中工作。

$cheese:Cheese($cheese.type matches "(Buffulo)?\\S*Mozarella") 
+0

即使沒有什麼明顯錯誤的代碼,使用您目前的模式的變量來訪問它的屬性之一是不常見的模式(和我不沒有任何優勢)。你試過這個嗎? '$奶酪:奶酪(類型匹配「(Buffulo)?\\ S * Mozarella」)' –

+0

是的,它工作,如果我使用$奶酪:奶酪(類型匹配「(Buffulo)?\\ S * Mozarella」 )。但是,我不明白爲什麼它不能允許使用變量。我們如何才能達到以下條件? $ cheese1:奶酪(類型匹配「Buffulo」)\\ S * Mozarella「) $ cheese2:奶酪($ cheese1.name匹配」A. *「,id> $ cheese1.id) –

+0

如果'name'條件如果關於第一個「奶酪」,然後將其移動到第一個模式:「$ cheese1:奶酪(類型匹配」(Buffulo)?\\ SMozare lla「,名稱匹配」A. *「)$ cheese2:奶酪(id > $ cheese1.id)' –

回答

0

如果你想有這樣的工作:

$cheese1:Cheese(type matches "(Buffulo)?\\SMozare‌​lla") 
    $cheese2:Cheese($che‌​ese1.name matches "A.*", id>$cheese1.id) 

,你將不得不使用方法調用:

$cheese1:Cheese(type matches "(Buffulo)?\\SMozare‌​lla") 
    $cheese2:Cheese($che‌​ese1.getName() matches "A.*", id>$cheese1.getId()) 

這是假設你一直關注JavaBean規範(如您應該)。但是更好的將是使用

$cheese1:Cheese(type matches "(Buffulo)?\\SMozare‌​lla", 
        name matches "A.*", $id1: id) 
    $cheese2:Cheese(id > $id1) 
+0

'$ cheese1:芝士(類型匹配「(Buffulo)?\\ SMozare lla」) $ cheese2:芝士($ che ese1.getName()匹配「A. *」,id > $ cheese1.getId())實際上會拋出相同的異常。也許我的問題不清楚。問題是爲什麼'$ cheese1:Cheese($ cheese1.type matches「(Buffulo)?\\ SMozare lla」)'拋出使用變量的異常,爲什麼以下工作正常? '$ cheese1:奶酪($ cheese1.type ==「Buffulo」)' –

+0

爲了回答這個問題,我們應該知道Drools的版本並且準備了奶酪類的準確(!)代碼。也許你把這個添加到你的問題中。 - 但通常的範例是使用沒有先前綁定變量且沒有括號的字段名稱,而後跟一個點的綁定變量,getter名稱(!)和一對括號。 – laune

+0

感謝您的回答。在我完成其他drools版本檢查後,它似乎正在工作。所以,這是因爲我正在使用6.2.0.Final版本。我更新了這篇文章。 –