在drools中的规则(drl文件的when子句)中返回查询结果

时间:2015-12-13 06:17:07

标签: drools

我需要帮助在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文件本身中执行此操作。

非常感谢帮助!

2 个答案:

答案 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将没有值,并且由于统一机制,它将由查询设置。

希望它有所帮助,