Drools example with spreadsheets tutorial
This is an industrial strength extension to Drools with Decision tables (Excel spreadsheet).
The drool file: @{variable_name} read from spreadsheet values. Others are from Java classes and objects.
//read from an excel spreadsheet
template header
rules
group
inCashTransactionNm
inAnalysisCd
inTransactionTypeCd
inTransactionSubTypeCd
transactionTypeCd
transactionSubTypeCd
incomeSubTypeCd
analysisCd
audAmount
fxGainAndLoss
package com.myapp.calc;
//...
global DroolsHelper droolsHelper;
global BankAccountService bankAccountService;
global StockTransactionService stockTransactionService;
template "CashTransaction"
rule "@{rules}_@{row.rowNumber}"
activation-group "@{group}"
salience -@{row.rowNumber}
when
cashTransaction : CashTransaction(true
,cashTransactionNm in (@{inCashTransactionNm})
,analysisCd in (@{inAnalysisCd})
)
bankAccount : BankAccount() from bankAccountService.getBankAccount(cashTransaction.getBankAccountId())
stockTransaction : StockTransaction(getTransactionTypeCd() != null, transactionTypeCd.getTypeCode() in (@{inTransactionTypeCd}), transactionSubTypeCd.getTypeCode() in (@{inTransactionSubTypeCd})) from stockTransactionService.findByPortfolio(cashTransaction.portfolioId, cashTransaction.sourceTransactionId)
then
Transaction transaction = new Transaction(); // create a new object
transactionsExtract.add(transaction);
transaction.setRuleActivated("@{rules}_@{row.rowNumber}");
transaction.setAssetCode(bankAccount.getAccountCd());
transaction.setTransactionId(Long.valueOf(cashTransaction.getSourceTransactionId()));
transaction.setTransactionDtTm(cashTransaction.getAccountingDt());
transaction.setValueAud(droolsHelper.@{audAmount}(cashTransaction));
deTransaction.setForeignExchangeGainsAndLosses(@{fxGainAndLoss}(cashTransaction));
end
end template
Define the method that invokes the rules.
//....
public List<Transaction> calcCash(int accountId)
{
LOG.info(String.format("Calculating : calcCash"));
List<Transaction> transactions = new ArrayList<Transaction>();
//read cash transactions from the database
List<CashTransaction> cashTransactions = cashTransactionService.findByAccountId(accountId);
for (CashTransaction cashTransaction : cashTransactions)
{
if (cashTransaction.getAnalysisCd() != null)
{
@SuppressWarnings("rawtypes")
List<Command> cmds = new ArrayList<Command>();
//make things available to drools file defined above
cmds.add(CommandFactory.newSetGlobal("transactionsExtract", new ArrayList<Transaction>(), true));
cmds.add(CommandFactory.newSetGlobal("bankAccountService", bankAccountService));
cmds.add(CommandFactory.newSetGlobal("stockTransactionService", stockTransactionService));
cmds.add(CommandFactory.newSetGlobal("droolsHelper", DroolsHelper));
cmds.add(CommandFactory.newInsert(cashTransaction));
//execute drools rules
ExecutionResults results = ksession.execute(CommandFactory.newBatchExecution(cmds));
List<Transaction> trans = (List<Transaction>) results.getValue("transactionsExtract");
transactions.addAll(trans);
}
}
Finally, if the value of audAmount = "cash" the DroolsHelper static method invoked will be as shown below
public static BigDecimal cash(CashTransaction transaction)
{
return cashTransaction.getCashValuePortfolio();
}
Labels: Drools tutorial

0 Comments:
Post a Comment
Subscribe to Post Comments [Atom]
<< Home