Excelファイルのルールを使用した作業

Excelファイルのルールを使用したよだれ

1. 概要

[.s1]#https://www.drools.org/[Drools] has support for managing business rules in a spreadsheet format. #

この記事では、Droolsを使用してExcelファイルを使用してビジネスルールを管理する簡単な例を紹介します。

2. Mavenの依存関係

必要なDrools依存関係をアプリケーションに追加しましょう。


    org.kie
    kie-ci
    7.1.0.Beta2


    org.drools
    drools-decisiontables
    7.1.0.Beta2

これらの依存関係の最新バージョンは、kie-ciおよびdrools-decisiontablesにあります。

3. Excelでルールを定義する

この例では、顧客のタイプと顧客としての年数に基づいて割引を決定するルールを定義しましょう。

  • 3年を超える個人のお客様には15%の割引が適用されます

  • 3年未満の個人のお客様には5%の割引が適用されます

  • すべての企業顧客は20%の割引を受けます

3.1. Excelファイル

Droolsに必要な特定の構造とキーワードに従ってexcel fileを作成することから始めましょう。

image

 

簡単な例では、最も関連性の高いキーワードセットを使用しました。

  • RuleSet –デシジョンテーブルの開始を示します

  • Import –ルールで使用されるJavaクラス

  • RuleTable –一連のルールの始まりを示します

  • Name –ルールの名前

  • CONDITION –入力データに対してチェックされる条件のコードスニペット。 ルールには少なくとも1つの条件を含める必要があります

  • ACTION –ルールの条件が満たされた場合に実行されるアクションのコードスニペット。 ルールには少なくとも1つのアクションを含める必要があります。 この例では、CustomerオブジェクトでsetDiscountを呼び出しています。

さらに、ExcelファイルでCustomerクラスを使用しました。 それでは、今それを作成しましょう。

3.2. Customerクラス

エクセルシートのCONDITIONSとACTIONからわかるように、入力データ(typeyears)にCustomerクラスのオブジェクトを使用し、結果( discount)。

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を使用して、KieFileSystemKieBuilder、およびKieContainerの新しいインスタンスを作成します。

4.2. KieFileSystem

KieFileSystemは仮想ファイルシステムです。 Excelスプレッドシートを追加しましょう。

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

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

4.3. KieBuilder

ここで、KieBuilderに渡すことにより、KieFileSystemのコンテンツを作成します。

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

正常にビルドされると、kmodule.xmlを含むKieModule (any Maven生成jarが作成されます(KieModule)。

4.4. KieRepository

フレームワークは、KieModule(ビルドの結果)をKieRepositoryに自動的に追加します。

KieRepository kieRepository = kieServices.getRepository();

4.5. KieContainer

ReleaseIdを使用して、このKieModuleで新しいKieContainerを作成できるようになりました。 この場合、KieはデフォルトのReleaseId:を割り当てます

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

4.6. KieSession

これで、KieContainerからKieSessionを取得できます。 このアプリケーションは、ランタイムデータを格納および実行する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/example/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/example/drools/rules/Discount.xls",
      getClass());

DecisionTableProviderImpl decisionTableProvider
  = new DecisionTableProviderImpl();

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

8. 結論

この記事では、Droolsを使用してExcelスプレッドシートのビジネスルールを管理する簡単な例を見てきました。 Excelファイルでルールを定義する際に使用される構造と最小限のキーワードセットを見てきました。 次に、Kieコンポーネントを使用してルールを読み取り、実行しました。 最後に、結果を検証するテストケースを作成しました。

いつものように、この記事で使用されている例はthe Github projectにあります。