今回より、エンティティの状態機械の操作について見ていきます。
今回は、エンティティをデータベースに保存、管理する方法について説明します。
モデル
前回、エンティティsalesorderを定義し、状態機械の設定も行いました。
今回はこの定義をそのまま使います。
* event event=[{ name="confirm" },{ name="reject" },{ name="delivered" },{ name="cancel" },{ name="suspend" },{ name="resume" }] * entity ** salesorder *** features table=salesorder *** attributes | Name | Type | Multiplicity | |-------+-------+--------------| | id | token | 1 | | price | int | 1 | *** statemachines **** status state=[{ name=INIT transition=[{ to=running }] },{ name=canceled transition=[{ to=FINAL }] },{ name=suspended transition=[{ guard=resume to=HISTORY }] }] statemachine=[{ name="running" state=[{ name=applying transition=[{ to=confirming }] },{ name=confirming transition=[{ guard=confirm to=confirmed },{ guard=reject to=rejected }] },{ name=confirmed transition=[{ to=delivering }] },{ name=rejected transition=[{ to=FINAL }] },{ name=delivering transition=[{ guard=delivered to=delivered }] },{ name=delivered transition=[{ to=FINAL }] }] transition=[{ guard=cancel to=canceled },{ guard=suspend to=suspended }] }]
イベント
以下の6つのイベントを定義しています。
- confirm
- 確認OK
- reject
- 確認却下
- delivered
- 配送済み
- cancel
- キャンセル
- suspend
- 保留
- resume
- 再開
前回からの変更点はありません。
エンティティ
エンティティの定義も前回から変更点はありません。
entity節の下にエンティティ「salesorder」を定義しています。
エンティティ「salesorder」の下にfeatures節で特性、attributes節で属性、statemachines節で状態機械を定義しています。
statemachines節の下に状態機械「status」を定義しています。
状態機械
定義したモデルの状態機械図は前回と同じ以下となります。
実行
それでは実行してみましょう。
エンティティのテーブル作成
まずエンティティを格納するデータベースのテーブルを作成します。
最初はデータベースのテーブルは作成されていません。
このため以下のようにstore-select関数の実行はエラーとなります。
kaleidox> store-select 'salesorder Error[org.h2.jdbc.JdbcSQLSyntaxErrorException: テーブル "SALESORDER" が見つかりません[NL]Table "SALESORDER" not found; SQL statement:[NL]SELECT * FROM salesorder WHERE 1 = 1 LIMIT 10 [42102-199]]
entity-create-collection関数でエンティティを格納するデータベースの作成を行うことができます。
デフォルトでは以下の設定が行われているため、H2のメモリデータベースを使用することができます。
db.default.driver="org.h2.Driver" db.default.url="jdbc:h2:mem:"
以下のようにentity-create-collection関数を実行します。
kaleidox> entity-create-collection 'salesorder true
store-select関数を用いてデータベースにエンティティsalesorderを格納するためのテーブルsalesorderが作成されていることを確認します。
kaleidox> store-select 'salesorder Table[0x0]
実行の結果、テーブルは作成されておりデータが0件であることが確認できました。
entity-select関数を使ってエンティティsalesorderの一覧としても確認してみます。
kaleidox> entity-select 'salesorder Table[3x0]
こちらも0件のンティティ・コレクションが作成されていることが確認できました。
エンティティの作成
データベースのテーブルが作成できたので、次はエンティティの作成を行います。
エンティティの作成はentity-create関数で行うことができます。第1引数にエンティティのクラス名、第2引数にプロパティをレコード形式で指定します。
kaleidox> entity-create 'salesorder price=100 id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming kaleidox> :show:pretty ┏━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┓ ┃Name │Value ┃ ┣━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━┫ ┃id │51QK2CqGdgVLTqddOFdn6n┃ ┃price │100 ┃ ┃status│confirming ┃ ┗━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┛
entity-create関数実行の結果、オブジェクトID「51QK2CqGdgVLTqddOFdn6n」のエンティティが作成されました。
状態機械statusは初期状態の「confirm」になっています。
エンティティの取得
entity-get関数を用いて、作成したエンティティの取得を行います。
kaleidox> entity-get 'salesorder "51QK2CqGdgVLTqddOFdn6n" id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming kaleidox> :show:pretty ┏━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┓ ┃Name │Value ┃ ┣━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━┫ ┃id │51QK2CqGdgVLTqddOFdn6n┃ ┃price │100 ┃ ┃status│confirming ┃ ┗━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┛
先程、作成したエンティティを取得することができました。
エンティティの検索
次はエンティティの検索を行ってみます。
まず、データベースのテーブルを直接検索するstore-select関数で検索を行います。検索条件を指定していないので全件検索になります。
以下のようにテーブルの内容を取得することができました。状態機械statusはデータベース上では数値102として格納されています。
kaleidox> store-select 'salesorder Table[3x1] kaleidox> :show:pretty ┏━━━━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━━━┓ ┃ID │PRICE│STATUS┃ ┣━━━━━━━━━━━━━━━━━━━━━━┿━━━━━┿━━━━━━┫ ┃51QK2CqGdgVLTqddOFdn6n│100 │102 ┃ ┗━━━━━━━━━━━━━━━━━━━━━━┷━━━━━┷━━━━━━┛
次はentity-select関数を用いて、エンティティsalesorderの一覧としても確認してみます。
以下のようにエンティティの内容を取得することができました。状態機械statusはconfirmingとして表示されています。
kaleidox> entity-select 'salesorder Table[3x1] kaleidox> :show:pretty ┏━━━━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━━━━━━━┓ ┃id │price│status ┃ ┣━━━━━━━━━━━━━━━━━━━━━━┿━━━━━┿━━━━━━━━━━┫ ┃51QK2CqGdgVLTqddOFdn6n│100 │confirming┃ ┗━━━━━━━━━━━━━━━━━━━━━━┷━━━━━┷━━━━━━━━━━┛
entity-select関数は、エンティティに対する検索を行い検索結果をテーブル形式で取得します。
entity-query関数は、エンティティに対する検索を行い、検索結果をエンティティのシーケンスとして取得します。
こちらもエンティティの内容を取得することができました。
kaleidox> entity-query 'salesorder [id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming] kaleidox> .head id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming kaleidox> :show:pretty ┏━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┓ ┃Name │Value ┃ ┣━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━┫ ┃id │51QK2CqGdgVLTqddOFdn6n┃ ┃price │100 ┃ ┃status│confirming ┃ ┗━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┛
まとめ
今回は状態機械を持っているエンティティをデータベースに格納して管理する方法について説明しました。
次回はイベントに対するエンティティの振る舞いについて検証します。
諸元
- Kaleidox
- 0.3.3