2021年10月31日日曜日

Kaleidox状態機械/エンティティ・ストア

今回より、エンティティの状態機械の操作について見ていきます。

今回は、エンティティをデータベースに保存、管理する方法について説明します。

モデル

前回、エンティティsalesorderを定義し、状態機械の設定も行いました。

今回はこの定義をそのまま使います。

  1. * event  
  2. event=[{  
  3.     name="confirm"  
  4.   },{  
  5.     name="reject"  
  6.   },{  
  7.     name="delivered"  
  8.   },{  
  9.     name="cancel"  
  10.   },{  
  11.     name="suspend"  
  12.   },{  
  13.     name="resume"  
  14. }]  
  15. * entity  
  16. ** salesorder  
  17. *** features  
  18. table=salesorder  
  19. *** attributes  
  20. | Name  | Type  | Multiplicity |  
  21. |-------+-------+--------------|  
  22. | id    | token |            1 |  
  23. | price | int   |            1 |  
  24. *** statemachines  
  25. **** status  
  26. state=[{  
  27.   name=INIT  
  28.   transition=[{  
  29.     to=running  
  30.   }]  
  31. },{  
  32.   name=canceled  
  33.   transition=[{  
  34.     to=FINAL  
  35.   }]  
  36. },{  
  37.   name=suspended  
  38.   transition=[{  
  39.     guard=resume  
  40.     to=HISTORY  
  41.   }]  
  42. }]  
  43. statemachine=[{  
  44.   name="running"  
  45.   state=[{  
  46.     name=applying  
  47.     transition=[{  
  48.       to=confirming  
  49.     }]  
  50.   },{  
  51.     name=confirming  
  52.     transition=[{  
  53.       guard=confirm  
  54.       to=confirmed  
  55.     },{  
  56.       guard=reject  
  57.       to=rejected  
  58.     }]  
  59.   },{  
  60.     name=confirmed  
  61.     transition=[{  
  62.       to=delivering  
  63.     }]  
  64.   },{  
  65.     name=rejected  
  66.     transition=[{  
  67.       to=FINAL  
  68.     }]  
  69.   },{  
  70.    name=delivering  
  71.     transition=[{  
  72.       guard=delivered  
  73.       to=delivered  
  74.     }]  
  75.   },{  
  76.     name=delivered  
  77.     transition=[{  
  78.       to=FINAL  
  79.     }]  
  80.   }]  
  81.   transition=[{  
  82.     guard=cancel  
  83.     to=canceled  
  84.   },{  
  85.     guard=suspend  
  86.     to=suspended  
  87.   }]  
  88. }]  

イベント

以下の6つのイベントを定義しています。

confirm
確認OK
reject
確認却下
delivered
配送済み
cancel
キャンセル
suspend
保留
resume
再開

前回からの変更点はありません。

エンティティ

エンティティの定義も前回から変更点はありません。

entity節の下にエンティティ「salesorder」を定義しています。

エンティティ「salesorder」の下にfeatures節で特性、attributes節で属性、statemachines節で状態機械を定義しています。

statemachines節の下に状態機械「status」を定義しています。

状態機械

定義したモデルの状態機械図は前回と同じ以下となります。

実行

それでは実行してみましょう。

エンティティのテーブル作成

まずエンティティを格納するデータベースのテーブルを作成します。

最初はデータベースのテーブルは作成されていません。

このため以下のようにstore-select関数の実行はエラーとなります。

  1. kaleidox> store-select 'salesorder  
  2. 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のメモリデータベースを使用することができます。

  1. db.default.driver="org.h2.Driver"  
  2. db.default.url="jdbc:h2:mem:"  

以下のようにentity-create-collection関数を実行します。

  1. kaleidox> entity-create-collection 'salesorder  
  2. true  

store-select関数を用いてデータベースにエンティティsalesorderを格納するためのテーブルsalesorderが作成されていることを確認します。

  1. kaleidox> store-select 'salesorder  
  2. Table[0x0]  

実行の結果、テーブルは作成されておりデータが0件であることが確認できました。

entity-select関数を使ってエンティティsalesorderの一覧としても確認してみます。

  1. kaleidox> entity-select 'salesorder  
  2. Table[3x0]  

こちらも0件のンティティ・コレクションが作成されていることが確認できました。

エンティティの作成

データベースのテーブルが作成できたので、次はエンティティの作成を行います。

エンティティの作成はentity-create関数で行うことができます。第1引数にエンティティのクラス名、第2引数にプロパティをレコード形式で指定します。

  1. kaleidox> entity-create 'salesorder price=100  
  2. id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming  
  3. kaleidox> :show:pretty  
  4. ┏━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┓  
  5. ┃Name  │Value                 ┃  
  6. ┣━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━┫  
  7. ┃id    │51QK2CqGdgVLTqddOFdn6n┃  
  8. ┃price │100                   ┃  
  9. ┃status│confirming            ┃  
  10. ┗━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┛  

entity-create関数実行の結果、オブジェクトID「51QK2CqGdgVLTqddOFdn6n」のエンティティが作成されました。

状態機械statusは初期状態の「confirm」になっています。

エンティティの取得

entity-get関数を用いて、作成したエンティティの取得を行います。

  1. kaleidox> entity-get 'salesorder "51QK2CqGdgVLTqddOFdn6n"  
  2. id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming  
  3. kaleidox> :show:pretty  
  4. ┏━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┓  
  5. ┃Name  │Value                 ┃  
  6. ┣━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━┫  
  7. ┃id    │51QK2CqGdgVLTqddOFdn6n┃  
  8. ┃price │100                   ┃  
  9. ┃status│confirming            ┃  
  10. ┗━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┛  

先程、作成したエンティティを取得することができました。

エンティティの検索

次はエンティティの検索を行ってみます。

まず、データベースのテーブルを直接検索するstore-select関数で検索を行います。検索条件を指定していないので全件検索になります。

以下のようにテーブルの内容を取得することができました。状態機械statusはデータベース上では数値102として格納されています。

  1. kaleidox> store-select 'salesorder  
  2. Table[3x1]  
  3. kaleidox> :show:pretty  
  4. ┏━━━━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━━━┓  
  5. ┃ID                    │PRICE│STATUS┃  
  6. ┣━━━━━━━━━━━━━━━━━━━━━━┿━━━━━┿━━━━━━┫  
  7. ┃51QK2CqGdgVLTqddOFdn6n│100  │102   ┃  
  8. ┗━━━━━━━━━━━━━━━━━━━━━━┷━━━━━┷━━━━━━┛  

次はentity-select関数を用いて、エンティティsalesorderの一覧としても確認してみます。

以下のようにエンティティの内容を取得することができました。状態機械statusはconfirmingとして表示されています。

  1. kaleidox> entity-select 'salesorder  
  2. Table[3x1]  
  3. kaleidox> :show:pretty  
  4. ┏━━━━━━━━━━━━━━━━━━━━━━┯━━━━━┯━━━━━━━━━━┓  
  5. ┃id                    │price│status    ┃  
  6. ┣━━━━━━━━━━━━━━━━━━━━━━┿━━━━━┿━━━━━━━━━━┫  
  7. ┃51QK2CqGdgVLTqddOFdn6n│100  │confirming┃  
  8. ┗━━━━━━━━━━━━━━━━━━━━━━┷━━━━━┷━━━━━━━━━━┛  

entity-select関数は、エンティティに対する検索を行い検索結果をテーブル形式で取得します。

entity-query関数は、エンティティに対する検索を行い、検索結果をエンティティのシーケンスとして取得します。

こちらもエンティティの内容を取得することができました。

  1. kaleidox> entity-query 'salesorder  
  2. [id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming]  
  3. kaleidox> .head  
  4. id:51QK2CqGdgVLTqddOFdn6n;price:100;status:confirming  
  5. kaleidox> :show:pretty  
  6. ┏━━━━━━┯━━━━━━━━━━━━━━━━━━━━━━┓  
  7. ┃Name  │Value                 ┃  
  8. ┣━━━━━━┿━━━━━━━━━━━━━━━━━━━━━━┫  
  9. ┃id    │51QK2CqGdgVLTqddOFdn6n┃  
  10. ┃price │100                   ┃  
  11. ┃status│confirming            ┃  
  12. ┗━━━━━━┷━━━━━━━━━━━━━━━━━━━━━━┛  

まとめ

今回は状態機械を持っているエンティティをデータベースに格納して管理する方法について説明しました。

次回はイベントに対するエンティティの振る舞いについて検証します。

諸元

Kaleidox
0.3.3