シェルスクリプトマガジン

レッドハットのプロダクト(Vol.65記載)

筆者:松田 絵里奈

「Red Hat Decision Manager」は、OSSの「Drools」がベースのルールエンジンです。同製品で業務ロジックを実装することで、アプリから業務ロジックを分離でき、メンテナンスが容易になります。また、複雑なロジックでも簡単で分かりやすい形式で記述できます。

シェルスクリプトマガジン Vol.65は以下のリンク先でご購入できます。

図11 pom.xml(抜粋)

(略)
    <dependencies>
        <dependency>
          <groupId>org.kie</groupId>
          <artifactId>kie-api</artifactId>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-core</artifactId>
        </dependency>
        <dependency>
          <groupId>org.drools</groupId>
          <artifactId>drools-decisiontables</artifactId>
        </dependency>
    </dependencies>
(略)

図12 過去利用状況ファクト(過去利用状況.java)

package com.example.rhdm;

public class 過去利用状況 {

    private String ユーザーID;
    private int 過去利用回数;
    private int 過去利用額計;
    public String get ユーザーID() {
        return ユーザーID;
    }
    public void set ユーザーID(String ユーザーid) {
        ユーザーID = ユーザーid;
    }
    public int get 過去利用回数() {
        return 過去利用回数;
    }
    public void set 過去利用回数(int 過去利用回数) {
        this.過去利用回数 = 過去利用回数;
    }
    public int get 過去利用額計() {
        return 過去利用額計;
    }
    public void set 過去利用額計(int 過去利用額計) {
        this.過去利用額計 = 過去利用額計;
    }
}

図13 今回利用ファクト(今回利用.java)

package com.example.rhdm;

public class 今回利用 {

    private String ユーザーID;
    private int 利用額;
    private String 割引ランク;
    private int 割引率;
    
    public String get ユーザーID() {
        return ユーザーID;
    }
    public void set ユーザーID(String ユーザーid) {
        ユーザーID = ユーザーid;
    }
    public int get 利用額() {
        return 利用額;
    }
    public void set 利用額(int 利用額) {
        this.利用額 = 利用額;
    }
    public String get 割引ランク() {
        return 割引ランク;
    }
    public void set 割引ランク(String 割引ランク) {
        this.割引ランク = 割引ランク;
    }
    public int get 割引率() {
        return 割引率;
    }
    public void set 割引率(int 割引率) {
        this.割引率 = 割引率;
    }
}

図14 最初の/src/main/resources/割引決定.drlファイル

package com.example.rhdm

import com.example.rhdm.*

dialect "java"

rule "利用回数2回未満、利用額1万未満"
    when
        $過去利用:過去利用状況(過去利用回数 < 2, 過去利用額計 < 10000)
        $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID)
    then        
//      modify($今回利用) {set 割引ランク("X")}
        $今回利用.set 割引ランク("X");
        System.out.println($今回利用.get ユーザーID() + "の割引ランクは" + $今回利用.get 割引ランク() + "です");
 end

図16 ルールを動かすためのJavaクラス

package com.example.rhdm;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

public class DrlTest {

    public static final void main(String[] args) {
        try {
        KieServices ks = KieServices.Factory.get();
            KieContainer kContainer = ks.getKieClasspathContainer();
            // 実行対象ルールを指定
KieSession kSession = kContainer.newKieSession("ksession-rules");
            // ファクトを生成
             過去利用状況 fact1 = new 過去利用状況();
            fact1.setユーザーID("A001");
            fact1.set過去利用回数(1);
            fact1.set過去利用額計(5000);
            今回利用 fact2 = new 今回利用();
            fact2.setユーザーID("A001");
            // ルールエンジンにファクトをインサート
            kSession.insert(fact1);
            kSession.insert(fact2);
            // ルール実行
kSession.fireAllRules();
        } catch (Throwable t) {
            t.printStackTrace();
        }
    }
}

図17 追加するルール

rule "利用回数2回未満、利用額1万以上"
    when
        $過去利用:過去利用状況(過去利用回数 < 2, 過去利用額計 >= 10000)
        $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID)
    then
        $今回利用.set割引ランク("E");
        System.out.println($今回利用.getユーザーID() + "の割引ランクは"+ $今回利用.get割引ランク() + "です");
end

rule "利用回数2回以上5回未満、利用額1万未満"
    when
        $過去利用:過去利用状況(過去利用回数 >= 2, 過去利用回数 < 5, 過去利用額計 < 10000)
        $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID)
    then
        $今回利用.set割引ランク("E");
        System.out.println($今回利用.getユーザーID() + "の割引ランクは"+ $今回利用.get割引ランク() + "です");
end

rule "利用回数2回以上5回未満、利用額1万以上"
    when
        $過去利用:過去利用状況(過去利用回数 >= 2, 過去利用回数 < 5, 過去利用額計 >= 10000)
        $今回利用:今回利用(ユーザーID == $過去利用.ユーザーID)
    then
        $今回利用.set割引ランク("D");
        System.out.println($今回利用.getユーザーID() + "の割引ランクは"+ $今回利用.get割引ランク() + "です");
end

図18 さらに追加するルール

rule "割引ランクX割引率設定"
    when
        $今回利用:今回利用(割引ランク == "X")
    then
        $今回利用.set割引率(0);
        System.out.println($今回利用.getユーザーID() + "の割引率は"+ $今回利用.get割引率() + "です");
end

rule "割引ランクE割引率設定"
    when
        $今回利用:今回利用(割引ランク == "E")
    then
        $今回利用.set割引率(3);
        System.out.println($今回利用.getユーザーID() + "の割引率は"+ $今回利用.get割引率() + "です");
end

rule "割引ランクD割引率設定"
    when
        $今回利用:今回利用(割引ランク == "D")
    then
        $今回利用.set割引率(5);
        System.out.println($今回利用.getユーザーID() + "の割引率は"+ $今回利用.get割引率() + "です");
end