【问题标题】:Drools 'LIKE' condition - does it exist?流口水'LIKE'条件 - 它存在吗?
【发布时间】:2017-10-24 15:23:15
【问题描述】:

我是 drools 的新手,我尝试搜索 API 文档,但找不到关于比较关键字“LIKE”的任何信息。我已经成功地使用 、=、==、!= 创建了规则,但现在我正在尝试使用“LIKE”关键字创建规则。前辈告诉我,它应该像 SQL like 关键字一样工作。以下是我在 drl 文件中的规则,但我在规则 5495Y 中收到有关输入“LIKE”不匹配的错误

使用流口水 5.6.0

**From DRL File:**
rule "5495Y"
agenda-group "1"
date-effective "04-Sep-2017"
when
JournalEntry : JournalEntry( (ledgerCd=="COMN") && accountNumber LIKE 1234 
&& entryTypeCode == "Y" );
DroolsUtil : DroolsUtil(  );
then
JournalEntry.addConsequence("rejectReason","kk like test");
JournalEntry.addConsequence("sendToLedger","N");
DroolsUtil.reclassEntry(JournalEntry,"NOCHG", "5495Y");
end

**Exact Error I am getting:**
[38583,71]: [ERR 102] Line 38583:71 mismatched input 'LIKE' in rule "5495R"
[38596,71]: [ERR 102] Line 38596:71 mismatched input 'LIKE' in rule "5495Y"
[0,0]: Parser returned a null Package

11:09:17,118 ERROR main ReclassAccountingRuleJob:132 - java.lang.Exception: Know
ledgeBuilder has errors. DRL File parsing error
java.lang.Exception: KnowledgeBuilder has errors. DRL File parsing error

【问题讨论】:

  • 你希望它做什么? “喜欢1234”应该是什么意思? - SQL "like" 做模式匹配,Drools 手册会告诉你有一个 "matches" 运算符用于模式匹配。
  • 可能是“like 1234*”或“like 1234%”应该表示以 1234 开头的任何内容。我确信语法正确。

标签: drools


【解决方案1】:

Drools 支持字符串类型属性的正则表达式匹配(比 SQL 中的LIKE 运算符强大得多):

rule "5495Y"
when
    JournalEntry : JournalEntry(
        ledgerCd == "COMN",
        accountNumber matches ".*1234.*", //accountNumber must be of type String. Otherwise, you will need to convert it first.
        entryTypeCode == "Y" 
    )
    DroolsUtil : DroolsUtil(  )
then
    ...
end

有关matches 运算符的更多信息,您可以阅读文档中的this section

希望对你有帮助,

【讨论】:

  • 太棒了!非常感谢埃斯特班。非常感谢。
  • 它成功了,请务必将问题标记为已回答。
  • 我尝试创建一个 accountNumber 匹配“1234.*”的规则,但它与以 1234 开头的帐号不匹配。
  • accountNumber 属性的类型是什么?
  • 它是一个字符串,我也尝试了一些其他的字母数字属性,但它仍然不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-03-21
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
相关资源
最近更新 更多