[英]Generic classes within Drools-WorkBench
我目前正在開展一個項目,該項目要求輸入 Drools-Workbench 進行驗證,是通用的。
所以本質上應該發生的是以下情況;
我有以下ruleSet
,其中input
是“通用部分”,並且規則集應指定應從 Drools-WB 實例中使用哪個規則表。
public class InputObject {
private Integer primaryKey;
private Integer sessionId;
private Integer transactionId;
private String ruleSet;
private Map<String, Object> input;
private List<ValidationResult> validationResults;
public void addValidationResult(ValidationResult validationResult) {
this.validationResults.add(validationResult);
}
// [...]
}
這是使用KieServicesClient
for JAVA 提交到我的 Drools-WB 實例,使用以下命令:
KieCommands commandFactory = kieServices.getCommands();
commands.add(commandFactory.newInsert(inputObject, "ValRes"));
commands.add(commandFactory.newFireAllRules());
BatchExecutionCommand batchExecutionCommand = commandFactory.newBatchExecution(commands, conf.getKieSession());
ServiceResponse<ExecutionResults> response = this.createRulesClient()
.executeCommandsWithResults(inputObject.getRuleSet(), batchExecutionCommand);
ExecutionResults singleRes = response.getResult();
規則在.xlsx 文件中指定,因此“非技術”人員應該可以“更輕松”地提交規則。 目前適用以下規則; 盡管使用此配置,始終會拋出 null 異常,但無論我如何將值分配給input
變量。
除此之外,我試圖簡單地從 LinkedHashMap 繼承一個新的 object,就像這樣;
public class DroolsObject extends LinkedHashMap<String, Object> {
public void addValidationResult(ValidationResult validationResult) {
if (!this.containsKey("validationResult"))
this.put("validationResult", new LinkedList<ValidationResult>());
((List<ValidationResult>) this.get("validationResult")).add(validationResult);
}
}
其中input
只是這個DroolsObject
class 的一個實例。 使用此配置,可以在 Drools.xlsx 表中使用關鍵字this
,如下所示;
但是使用這種配置,規則只是被執行,無論 DyrAlder 的值如何,規則都不會被觸發。
我知道 function addValidationResult
在這種情況下有效,因為當我創建一個 class 時,我設法收到了結果,其中測試的變量是 pr。 默認。
所以我的問題是這樣的; 我還沒有真正找到任何與概括 Drools class 相關的東西,所以如果我是 SOL 使用這種方法,或者如果有另一種方法可以做到這一點,我希望能得到一些答案? 也許有一個我要發送到 Drools-WB 的 HashMap,然后只覆蓋 class,以便它可以使用存儲庫中指定的特定 class。
無論如何,節日快樂,並提前感謝您抽出寶貴時間回答這個問題!
只有當我在沒有正確初始化的情況下插入對象時,我才能為第一個示例重現 NullPointerException。 對於第二種情況,確實this["DyrAlder"] < $param
不起作用,但是this.get("DyrAlder") < $param
, this.DyrAlder < $param
甚至DyrAlder < $param
適合我。
根據您的描述,我使用所需的ruleSet
參數將您的規則復雜化,以獲得滿足您要求的工作 POC。 在插入的 10 個對象中,只有 5 個符合條件DyrAlder < 5
,只有 1 個符合ruseSet == "set3"
,因此您只觸發了一次規則。
測試 1(輸入對象)
@DroolsSession(resources = "draft/inputObjectExample.xlsx",
builderProperties = "drools.dump.dir = target/dump",
showStateTransitionPopup = true)
public class PlaygroundTest extends DroolsAssert {
@RegisterExtension
public DroolsAssert droolsAssert = this;
@Test
@TestRules(expectedCount = { "1", "Check_DyrAlder" })
public void testInputObjectExample() {
KieCommands commandFactory = KieServices.get().getCommands();
List<Command<?>> commands = new ArrayList<>();
for (int i = 0; i < 10; i++) {
InputObject inputObject = new InputObject();
inputObject.setTransactionId(i);
inputObject.setRuleSet("set" + i);
inputObject.setInput(ImmutableMap.of("DyrAlder", i));
inputObject.setValidationResults(new ArrayList<>());
commands.add(commandFactory.newInsert(inputObject, "ValRes"));
commands.add(commandFactory.newFireAllRules());
}
commands.forEach(c -> getSession().execute(c));
}
}
決策表
生成的規則
package draft;
//generated from Decision Table
import draft.InputObject;
import draft.ValidationResult;
// rule values at A9, header at A4
rule "Check_DyrAlder"
when
animal:InputObject(ruleSet == "set3", input["DyrAlder"] < 5)
then
animal.addValidationResult(new ValidationResult("HDY-08277", "message"));
end
Model
public class InputObject {
private Integer primaryKey;
private Integer sessionId;
private Integer transactionId;
private String ruleSet;
private Map<String, Object> input;
private List<ValidationResult> validationResults;
// getters/setters
測試 2 (DroolsObject)
@DroolsSession(resources = "draft/droolsObjectExample.xlsx",
builderProperties = "drools.dump.dir = target/dump",
showStateTransitionPopup = true)
public class PlaygroundTest extends DroolsAssert {
@RegisterExtension
public DroolsAssert droolsAssert = this;
@Test
@TestRules(expectedCount = { "1", "Check_DyrAlder" })
public void testDroolsObjectExample() {
KieCommands commandFactory = KieServices.get().getCommands();
List<Command<?>> commands = new ArrayList<>();
for (int i = 0; i < 10; i++) {
DroolsObject inputObject = new DroolsObject();
inputObject.put("ruleSet", "set" + i);
inputObject.put("DyrAlder", i);
commands.add(commandFactory.newInsert(inputObject, "ValRes"));
commands.add(commandFactory.newFireAllRules());
}
commands.forEach(c -> getSession().execute(c));
}
}
決策表
生成的規則
package draft;
//generated from Decision Table
import draft.DroolsObject;
import draft.ValidationResult;
// rule values at A9, header at A4
rule "Check_DyrAlder"
when
animal:DroolsObject(ruleSet == "set3", DyrAlder < 5)
then
animal.addValidationResult(new ValidationResult("HDY-08277", "message"));
end
Model
public class DroolsObject extends LinkedHashMap<String, Object> {
public void addValidationResult(ValidationResult validationResult) {
if (!this.containsKey("validationResult"))
this.put("validationResult", new LinkedList<ValidationResult>());
((List<ValidationResult>) this.get("validationResult")).add(validationResult);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.