我需要帮助在drools中的drl
文件的when子句中检索查询结果。
具有查询的示例规则文件:
query getUsersForCard (Long ipCardNumber)
$listOfUsers : UsersList()
$listOfUserCards : User(cardNumber == ipCardNumber, $cardNum : cardNumber) from $listOfUsers.user_list
end
rule "matchUser"
when
getUsersForCard("4444333322221112L";)
then
System.out.println( "$$$card number in VisaMessage matched with card number in UsersList$$$" );
end
如何在$cardNum
查询调用后获取getUsersForCard
以便打印then子句?我不想从工作内存中检索Java代码中的$cardNum
,而应该能够在drl
文件本身中执行此操作。
非常感谢帮助!
答案 0 :(得分:0)
您无法以我认为可以完成的方式检索when子句中的查询结果。但是没有必要这样做,只需将规则写为
rule "match card number"
when
$listOfUsers: UsersList()
$user: User(cardNumber == "4444333322221112L") from $listOfUsers
then ... end
假设println的文本表明你真正想做什么,你可以使用
rule "match card number"
when
VisaMessage( $cardNo: cardNumber )
$listOfUsers: UsersList()
$user: User(cardNumber == $cardNo) from $listOfUsers
then ... end
答案 1 :(得分:0)
回到最初的问题:“可以从规则的LHS查询结果吗?”,答案是:“是的,使用统一(Sections 8.8.3.3.6 and 8.9)”。
Drools中的查询可以有输入和输出参数。输入参数是在调用查询时具有值(已绑定)的参数。那些没有值(未绑定)的参数被视为输出参数。
要做的第一件事是使用统一来重写您的查询:
query getUsersForCard (Long ipCardNumber, Long $cardNum)
$listOfUsers : UsersList()
$listOfUserCards : User(
cardNumber == ipCardNumber,
$cardNum := cardNumber
) from $listOfUsers.user_list
end
需要注意的重要事项是使用:= (统一)标志。这个操作符基本上是这样说:“如果变量有一个值,那么我将充当 == 运算符。否则我将充当变量绑定。
从规则调用查询时,需要确保不为查询中的第二个参数提供任何值。鉴于您已经在使用位置参数,这很容易做到:
rule "matchUser"
when
getUsersForCard("4444333322221112L", $cardNum;)
then
System.out.println( "$$$card number in VisaMessage matched with card number in UsersList$$$: "+$cardNum );
端
调用查询时,$cardNum
将没有值,并且由于统一机制,它将由查询设置。
希望它有所帮助,