Перейти к основному содержимому

Drools с использованием правил из файлов Excel

· 4 мин. чтения

Задача: Наибольшая подстрока палиндром

Для заданной строки s, верните наибольшую подстроку палиндром входящую в s. Подстрока — это непрерывная непустая последовательность символов внутри строки. Стока является палиндромом, если она читается одинаково в обоих направлениях...

ANDROMEDA 42

1. Обзор

Drools поддерживает управление бизнес-правилами в формате электронной таблицы.

В этой статье мы рассмотрим быстрый пример использования Drools для управления бизнес-правилами с помощью файла Excel.

2. Зависимости Maven

Добавим в наше приложение необходимые зависимости Drools:

<dependency>
<groupId>org.kie</groupId>
<artifactId>kie-ci</artifactId>
<version>7.1.0.Beta2</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-decisiontables</artifactId>
<version>7.1.0.Beta2</version>
</dependency>

Последнюю версию этих зависимостей можно найти по адресу kie-ci и drools-decisiontables .

3. Определение правил в Excel

В нашем примере давайте определим правила для определения скидки на основе типа клиента и количества лет в качестве клиента:

  • Индивидуальные клиенты со стажем более 3 лет получают скидку 15%
  • Индивидуальные клиенты до 3 лет получают скидку 5%
  • Всем корпоративным клиентам скидка 20%

3.1. Файл Excel

Давайте начнем с создания нашего файла Excel в соответствии с определенной структурой и ключевыми словами, необходимыми для Drools:

./cebcc88078f674ff83915dc90058db39.png

Для нашего простого примера мы использовали наиболее релевантный набор ключевых слов:

  • RuleSet — указывает начало таблицы решений
  • Импорт — классы Java, используемые в правилах
  • RuleTable — указывает начало набора правил
  • Имя — название правила.
  • УСЛОВИЕ – фрагмент кода условия, которое будет проверяться на входных данных. Правило должно содержать хотя бы одно условие
  • ДЕЙСТВИЕ — фрагмент кода действия, которое будет выполнено, если выполняются условия правила. Правило должно содержать хотя бы одно действие. В примере мы вызываем setDiscount для объекта Customer .

Кроме того, мы использовали класс Customer в файле Excel. Итак, давайте создадим это сейчас.

3.2. Класс клиентов _

Как видно из УСЛОВИЙ и ДЕЙСТВИЙ на листе Excel, мы используем объект класса Customer для входных данных ( тип и годы ) и для хранения результата ( скидка ).

Класс клиента :

public class Customer {
private CustomerType type;

private int years;

private int discount;

// Standard getters and setters

public enum CustomerType {
INDIVIDUAL,
BUSINESS;
}
}

4. Создание экземпляра механизма правил Drools

Прежде чем мы сможем выполнить определенные нами правила, нам нужно поработать с экземпляром механизма правил Drools. Для этого мы должны использовать основные компоненты Kie.

4.1. KieServices

Класс KieServices предоставляет доступ ко всем средствам сборки и выполнения Kie. Он предоставляет несколько фабрик, сервисов и служебных методов. Итак, давайте сначала получим экземпляр KieServices :

KieServices kieServices = KieServices.Factory.get();

Используя KieServices, мы создадим новые экземпляры KieFileSystem , KieBuilder и KieContainer .

4.2. KieFileSystem

KieFileSystem — это виртуальная файловая система. Добавим к нему нашу таблицу Excel:

Resource dt 
= ResourceFactory
.newClassPathResource("com/foreach/drools/rules/Discount.xls",
getClass());

KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(dt);

4.3. KieBuilder

Теперь создайте содержимое KieFileSystem , передав его KieBuilder :

KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();

В случае успешной сборки он создает KieModule ( любой созданный Maven jar с kmodule.xml в нем является KieModule ).

4.4. KieRepository

Фреймворк автоматически добавляет KieModule (полученный в результате сборки) в KieRepository :

KieRepository kieRepository = kieServices.getRepository();

4.5. КиКонтейнер

Теперь можно создать новый KieContainer с этим KieModule, используя его ReleaseId . В этом случае Kie назначает ReleaseId по умолчанию:

ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
KieContainer kieContainer
= kieServices.newKieContainer(krDefaultReleaseId);

4.6. KieSession

Теперь мы можем получить KieSession из KieContainer . Наше приложение взаимодействует с KieSession , который хранит и выполняет данные во время выполнения:

KieSession kieSession = kieContainer.newKieSession();

5. Выполнение правил

Наконец, пришло время предоставить входные данные и запустить правила:

Customer customer = new Customer(CustomerType.BUSINESS, 2);
kieSession.insert(customer);

kieSession.fireAllRules();

6. Тестовые случаи

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

public class DiscountExcelIntegrationTest {

private KieSession kSession;

@Before
public void setup() {
Resource dt
= ResourceFactory
.newClassPathResource("com/foreach/drools/rules/Discount.xls",
getClass());
kSession = new DroolsBeanFactory().getKieSession(dt);
}

@Test
public void
giveIndvidualLongStanding_whenFireRule_thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.INDIVIDUAL, 5);
kSession.insert(customer);

kSession.fireAllRules();

assertEquals(customer.getDiscount(), 15);
}

@Test
public void
giveIndvidualRecent_whenFireRule_thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
kSession.insert(customer);

kSession.fireAllRules();

assertEquals(customer.getDiscount(), 5);
}

@Test
public void
giveBusinessAny_whenFireRule_thenCorrectDiscount()
throws Exception {
Customer customer = new Customer(CustomerType.BUSINESS, 0);
kSession.insert(customer);

kSession.fireAllRules();

assertEquals(customer.getDiscount(), 20);
}
}

7. Устранение неполадок

Drools преобразует таблицу решений в DRL . Из-за этого работа с ошибками и опечатками в файле Excel может быть затруднена. Часто ошибки относятся к содержимому DRL. Таким образом, для устранения неполадок помогает распечатать и проанализировать DRL:

Resource dt 
= ResourceFactory
.newClassPathResource("com/foreach/drools/rules/Discount.xls",
getClass());

DecisionTableProviderImpl decisionTableProvider
= new DecisionTableProviderImpl();

String drl = decisionTableProvider.loadFromResource(dt, null);

8. Заключение

В этой статье мы рассмотрели быстрый пример использования Drools для управления бизнес-правилами в электронной таблице Excel. Мы рассмотрели структуру и минимальный набор ключевых слов, используемых при определении правил в файле Excel. Затем мы использовали компоненты Kie для чтения и запуска правил. Наконец, мы написали тестовые примеры для проверки результатов.

Как всегда, пример, использованный в этой статье, можно найти в проекте Github .