今回より、エンティティの状態機械の操作について見ていきます。
今回は、エンティティをデータベースに保存、管理する方法について説明します。
モデル
前回、エンティティ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