提供されたファクトにユーザーが提供したint値が含まれるdroolsルールを作成しようとしています。ファクトには、期待されるint値を持つオブジェクトのリストもあります。ユーザーが指定した値が個々のオブジェクトの期待値の合計よりも小さいかどうかを確認する必要があります。これが私のサンプルファクトクラスです-
public class Order {
private int orderId;
private List<OrderItem> orderItems;
private int usersIntegrationFee;
}
ファクトクラスに含まれるOrderItemクラスは-
public class OrderItem {
private int orderItemId;
private Product prod;
}
そして、ProductクラスはproductIntegrationFeeフィールドを持つクラスです-
public class Product {
private String mktProdId;
private String prodName;
private int productIntegrationFee;
}
Order.usersIntegrationFeeがすべてのOrder.OrderItem.Product.productIntegrationFeeの合計よりも小さいかどうかを確認したいと思います。よだれでこれを行う方法はありますか?どんな助けでも大歓迎です。
使用する必要があるのは、と呼ばれるdrools組み込みユーティリティaccumulate
です。このユーティリティを使用すると、ある種の変数値を「蓄積」しながら、右側のオブジェクトのコレクションを反復処理できます。いくつかの一般的なユースケースには、合計、平均、カウントなどが含まれます。基本的に、構成はコレクション内の各アイテムをループし、各アイテムに対して定義されたアクションを実行します。
独自のカスタムアキュムレート関数を定義できますが、Droolsはいくつかの組み込みアキュムレート関数をサポートしていますsum
。そのうちの1つはです。この組み込み関数は、特定のユースケースに必要なものです。
の一般的な形式accumulate
は次のとおりaccumulate( <source pattern>; <functions> [;<constraints>] )
です。ルールは次のようになります(このコンピューターにはDroolsがないため、擬似コード。構文は厳密または正確である必要がありますが、タイプミスが存在する可能性があります)。
rule "Integration fee is less than sum of product fees"
when
// extract the variables from the Order
Order( $userFee: usersIntegrationFee,
$items: orderItems)
// use the accumulate function to sum up the product fees
$productFees: Integer( this > $userFee ) from
accumulate( OrderItem( $product: prod ) from $items,
Product( $fee: productIntegrationFee ) from $product;
sum($fee) )
then
// do something
end
注意すべき点がいくつかあります。1accumulate
つで、合計、平均など、複数のことを実行できます。ただし、ここのように1つの累積関数のみを呼び出す場合は、私が示した構文を使用できます(Integer( conditions ) from accumulate( ... )
。)。複数の関数がある場合は、出力を直接割り当てる必要があります(たとえば$sum: sum($fee)
、など)。
最後にaccumulate
、ユースケースが非常に単純で必要ないため、省略した3番目のオプションのパラメーターがあります。3番目のパラメーターは、フィルタリング(「制約」と呼ばれる)を適用して、累積関数がこの基準を満たさないアイテムをスキップするようにします。たとえば、次のように負のproductIntegrationFee値を無視する制約を追加できます$fee > 0
。
このルールで選択した構文に関する最後の注意。ユースケースは「usersIntegrationFeeが合計よりも小さい場合にルールをトリガーする」であったため、比較を直接に入れましたInteger( ... ) from accumulate
。もちろん、たとえば、好きな、Integer( $productFees > this ) from $userFee
または他の形式の比較など、個別に比較を行うこともできます。この方法は最も簡単に思えました。
Droolsのドキュメントは、このユーティリティの詳細情報を持っています。'when'句の要素について説明しているセクションにリンクしました。少し下にスクロールして、直接蓄積するためのドキュメントを表示します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加