2017-02-07 20 views
0

У меня есть следующий POJO:В каком объекте данных я должен создать сеанс Drools/Kie?

public class Transaction { 

    @Id 
    private long id; 

    private String organisationId; 

    private String resposibleName; 

    private DateTime transactionTime; 

    private BigDecimal amount; 

    ... 

} 

, что я хотел бы применить свои правила. Например, правило образца может быть на его сумме:

rule "SampleRule" 
    when 
     $transaction : Transaction(amount > 10) 
    then 
     $transaction.setStatus(Status.INVALID); 
end 

, и я также хочу, чтобы применить некоторые более сложные правила, такие как:

  1. WHEN сумма сумму полей транзакции в том же organisationId в на прошлой неделе (на основе transactionTime) является углубляло чем x, THEN$transaction.setStatus(Status.INVALID);
  2. WHEN есть прошлая сделка с такими же responsibleName как Curr лор сделка оценивается, но отличается organisationId, чем текущая, THEN$transaction.setStatus(Status.INVALID);

Когда есть запрос делается на RESTful конечную точку:

  1. Я создаю новый KieSession
  2. Добавление одного Transaction объект для сеанса,
  3. Добавление дополнительных объектов транзакций, которые могут быть связаны с текущим с помощью другого POJO (например, скажем PastTransaction как точная копия с теми же полями с Transaction, я добавляю несколько транзакций, сделанных тем же organisationId с PastTransaction POJO, чтобы я мог аккумулировать количество полей на них, имея возможность применять более элементарные правила для моего объекта Transaction.
  4. Точно так же, я добавляю все операции, которые производятся по той же responsibleName с ResponsibleNameTransaction POJO и написать правило, чтобы проверить, если какой-либо из них не совпадает с одной из моих одного Transaction объекта в KieSession.

мне было интересно, если там может быть проще/более оптимальный способ добиться того, что я делаю, и оптимизации на какой объект я формируя свои KieSession с для. У меня есть метод написания моих Transaction POJO и попадания в db в рамках выполнения правила (например, напишите метод getAllTransactionsByTheResponsibleName, который возвращает список, а затем проверьте, есть ли объект с разными organisationId). Таким же образом я могу добавить связанные транзакции как список в KieSession, а затем запросить список в правиле, что может по крайней мере спасти меня от использования того же POJO под разными именами.

Update:

прорабатывались далее на основе замечаний, это будет возможно держать около миллиарда Transaction с в рабочей памяти (сеанс для всех сделок)? Или, альтернативно, я могу поместить транзакции на ответственную/организацию в KieSession (сеанс на ответственную/организацию). Затем как я могу применить некоторые правила исключительно к полям последней транзакции, которая оценивается (или даже задает для нее поле), когда в сеансе есть несколько транзакций (например, $transaction.setStatus(Status.INVALID);, когда № 1 является истинным, $transaction является тем, который в настоящее время оценивается)?

+0

Если у вас есть Транзакция, вы можете выбрать другие транзакции в соответствии с № 1 и второй набор в соответствии с № 2, вам больше не понадобятся правила: вы можете вычислить желаемый результат из этих двух коллекций. - Как правило, все транзакции загружаются в рабочую память - возможно, даже в реальном времени - и правила находят транзакции и наборы согласно # 1 и # 2 и оценивают все динамически. Конечно, это зависит от того, как далеко назад вам нужно идти, чтобы обнаружить конфликт в соответствии с № 2. # 1 ограничено на неделю, поэтому вы должны знать, чего ожидать. – laune

+0

Вы имеете в виду методы транзакции, которая возвращает транзакции на основе organisationId и responsibeName? Что вы имеете в виду, мне больше не нужны правила? Я использую Drools по многим причинам, один из которых - для нетехнических людей, которые могут редактировать правила через workbench. Кроме того, у меня есть 10 млн транзакций в день, что может сделать невозможным сохранить все транзакции в памяти в любое время. –

+0

Если выборка соответствующих наборов данных (транзакции) из БД зависит от правила (как предлагает ваше «более сложное» правило), вы не сможете позволить своим нетехническим людям писать это только через верстак. - Рассмотрите № 1: пока вы забираете, вы можете добавить и проверить; однажды вы можете остановить. Рассмотрим № 2: имеет ли смысл получать все T с равным ответственным именем, когда у вас есть положительный результат при встрече с первым? - Правила работают хорошо, если данные находятся в WM, и нет необходимости использовать разные имена классов для написания таких правил. – laune

ответ

1

Возможно, не удастся полностью избавиться от неспециалистов. Полное обсуждение того, что вам нужно добавить, потребует полного знания всех правил, которых у меня нет. Однако # 1 и # 2 от вашего Q можно обрабатывать даже с миллиардами транзакций, проходящих через вашу рабочую память.

Пример использования 1: Проверка порогового значения для учетной записи в интервале времени может быть выполнена путем сохранения вспомогательного факта («AccountSums») на одну учетную запись с n ежедневными суммами. При любой новой транзакции либо обновляйте последнюю сумму, либо «сдвигайте» суммы, добавляя 0 сумм и задайте последнюю сумму, или создайте новые учетные записи; сохранить в общей сложности в прошлом п sums- технарей может выписать чек, основываясь лишь на AccountSums (или в сочетании с (последней), соответствующей сделки.

rule "check 7 days limit" 
when 
    $t: Transaction($orgId: organisationId, 
        $transT: transactionTime, 
        amount > 0, status == Status.VALID) 
    AccountSums(organisationId == $orgId, 
       lastTransactionTime == $transT, 
       runningWeeklySum > 1000000) 
then 
    modify($t){ setStatus(Status.INVALId) } 
end 

rule "create AccountSums" 
when 
    $t: Transaction($orgId: organisationId, 
        amount > 0) 
    not AccountSums(organisationId == $orgId) 
then 
    insert(new AccountSums($orgId)); 
end 

Вы будете нуждаться по крайней мере, одно дополнительное правило для «сдвига» сумм и т. д.

Вариант использования 2: Ведение вспомогательного факта («NameId») с экземплярами, содержащими ответственное имя и организационное удостоверение (или один экземпляр, содержащий карту). Если прибывает другая транзакция, создайте новый NameId (или ввод карты) или сравнить для равных и не равных Идентификаторов.

История должна быть сокращена, если объем ваших данных как вы указываете. Возможно, пусть буффы пишут простые правила оценки, но разработка шаблонов правил по строкам, которые я изложил здесь, - это, по крайней мере, для уплотнения метаданных, а не то, что вы можете оставить у маглов.

+0

Благодарим вас, не могли бы вы добавить примерное правило только для проверки суммы вновь добавленной транзакции? Когда запрос, сделанный в какой-либо конечной точке в моем API, я добавлю его в сеанс и хотел бы применить очень основное правило исключительно к его полям и установить на нем поле. Благодаря! –

+0

Как [это] (http://stackoverflow.com/questions/12090295/drools-get-the-3-most-recent-events)? –

+1

Я набросал несколько правил. Без гарантии. Это требует некоторой осмотрительности w.r.t. время, когда нужно удалить «устаревшие» учетные записи и другие данные. Но вы должны получить идею ... – laune