DMDLとThunderGateの連携¶
Asakusa Framework 0.2では、ThunderGateが利用している データベースのテーブル定義情報や、ビューの定義情報などから 対応するDMDLスクリプトを生成できるようになっています。 このため、0.1で提供していたモデルジェネレータは非推奨となりました。
0.2以降では、ThunderGateが利用しているMySQLの メタデータを分析し、対応するデータモデルをDMDLの形式で 生成する「DMDLジェネレータ」を提供しています。
MySQLのメタデータからDMDLを生成する¶
DMDLジェネレータはMySQLに登録されたテーブル定義やビュー定義から、 DMDLのレコードモデル、結合モデル、集計モデルをそれぞれ生成します。
なお、DMDLジェネレータはインフォメーションスキーマ [1] を利用してメタデータを分析しています。
[1] | https://dev.mysql.com/doc/refman/5.1/ja/information-schema.html |
テーブル定義 (レコードモデル)¶
MySQLに定義されたテーブルごとに、DMDLのレコードモデルを生成します。 また、テーブルのカラムごとにプロパティが定義されます。
それぞれの名前は、次のような規則でDMDLでの名前に変換されます。
- 名前の先頭と末尾にくる全てのアンダースコアを取り除く
- 2つ以上連続するアンダースコアを単一のアンダースコアに読み替える
- 全ての文字を小文字にする
たとえば、テーブル _TX__HELLO_WORLD
からは、レコードモデル tx_hello_world
を生成します。
Caution
上記の変換によってDMDLでの名前が重複してしまう場合、エラーとなります。
カラムに指定できる型と、DMDLでの表現は以下の通りです。
MySQLでのデータ型 | 対応するDMDLの型 |
---|---|
TINYINT | BYTE |
SMALLINT | SHORT |
INT | INT |
BIGINT | LONG |
DECIMAL | DECIMAL |
FLOAT | FLOAT |
DOUBLE | DOUBLE |
DATE | DATE |
DATETIME | DATETIME |
TIMESTAMP | DATETIME |
CHAR | TEXT |
VARCHAR | TEXT |
TINYTEXT | TEXT |
TEXT | TEXT |
MEDIUMTEXT | TEXT |
LONGTEXT | TEXT |
たとえば、以下のようなテーブルについて考えます。
CREATE TABLE TABLE_EXAMPLE (
SID BIGINT PRIMARY KEY AUTO_INCREMENT,
VERSION_NO BIGINT,
RGST_DATETIME DATETIME,
UPDT_DATETIME DATETIME,
NAME VARCHAR(255),
VALUE INT
) engine=InnoDB;
上記のテーブルから生成されるレコードモデルの構造は次のような形です。
table_example = {
sid : LONG;
version_no : LONG;
rgst_datetime : DATETIME;
updt_datetime : DATETIME;
name : TEXT;
value : INT;
};
ビュー定義 (結合モデル)¶
2つのテーブルを結合した「結合モデル」を生成するには、MySQLにテーブルやビューの結合を行うようなビューを登録します。
このビューは、次のような文で生成されたものである必要があります。
- 2つのテーブルやビューとで、等価内部結合を行っている
- SELECT句で結合元のカラムを、演算を行わずにそのまま [2] 指定しているおり、それぞれにはテーブル名またはエイリアスが付与されている [3] (t1.SIDなど)
- 等価結合条件以外のWHERE句が存在しない
[2] | ここでは演算を行えません。たとえば、「t1.SID + 1」などのようには書けません |
[3] | 2つの結合元で同じカラム名が存在しない場合は省略できます |
たとえば、以下のような文で作成されたビューから、結合モデルを作成できます。
CREATE VIEW JOIN_EXAMPLE AS
SELECT
t1.SID AS SID1,
t2.SID AS SID2,
t1.VALUE AS VALUE
FROM TABLE_EXAMPLE1 t1, TABLE_EXAMPLE2 t2
WHERE
t1.VALUE = t2.VALUE;
上記のビューから生成される結合モデルの構造は次のような形です。
joined join_example = table_example1 -> {
sid -> sid1;
value -> value;
} % value + table_example2 -> {
sid -> sid2;
value -> value;
} % value;
ビュー定義 (集計モデル)¶
テーブルをグループ化して集計した結果のデータモデル(集計モデル)を生成するには、MySQLにテーブルやビューの集計を行うようなビューを登録します。
このビューは、次のような文で生成されたものである必要があります。
- あらゆる結合を行っていない
- GROUP BY句でグループ化カラムを指定している
- GROUP BY句で指定した全てのカラムは、演算を行わずにSELECT句に指定している
- SELECT句に指定する式は、演算を行わないカラムか、集計のみを行ったカラムのみ
- WHERE句が存在しない
たとえば、以下のような文で作成されたビューから、集計モデルクラスを作成できます。
CREATE VIEW SUMMARIZE_EXAMPLE AS
SELECT
NAME AS NAME,
SUM(VALUE) AS VALUE,
COUNT(SID) AS SIZE
FROM TABLE_EXAMPLE
GROUP BY NAME;
上記のビューから生成される集計モデルの構造は次のような形です。
summarized summarize_example = table_example => {
any name -> name;
sum value -> value;
count sid -> size;
} % name;
DMDLジェネレータの実行¶
MySQLのメタデータからDMDLスクリプトを生成するには、 DMDLジェネレータを利用します。
DMDLの生成¶
DMDLスクリプトからJavaデータモデルクラスを生成する場合、
Asakusa Frameworkの asakusa-thundergate-dmdl-*.jar
の
com.asakusafw.dmdl.thundergate.Main クラスを次の引数で起動します。
-jdbc JDBCの設定情報を記載したプロパティファイル
-output DMDLスクリプトを出力するディレクトリ
-encoding 出力するDMDLスクリプトのエンコーディング (default: UTF-8)
-includes 対象とするテーブル/ビュー名の正規表現パターン (default: 全て)
-excludes 除外とするテーブル/ビュー名の正規表現パターン (default: なし)
また、 -jdbc
の引数には、下記のような情報を含むファイルのパスを指定します。
このファイルはJavaの *.properties
ファイル形式で記述します。
jdbc.driver = <JDBCドライバーのクラス名>
jdbc.url = <接続先のJDBC URL>
jdbc.user = <接続ユーザー名>
jdbc.password = <接続パスワード>
database.name = <接続先データベース名>
キャッシュのサポート¶
ThunderGateのキャッシュ機能をサポートするデータモデルを生成するには、コマンドライン引数に次の内容を追加します。
-sid_column System IDのカラム名
-timestamp_column 最終更新時刻のカラム名
初期設定では、ThunderGateはSystem IDのカラム名に SID
、最終更新時刻のカラム名に UPDT_DATETIME
を利用しています。
そのため、ここでの引数は -sid_column SID -timestamp_column UPDT_DATETIME
となります。
削除フラグのサポート¶
テーブルに定義された削除フラグカラムをキャッシュに利用する場合、コマンドラインの引数に次の内容を追加します。
-delete_flag_column 論理削除フラグのカラム名
-delete_flag_value 論理削除フラグが真(TRUE)となる値
削除フラグのカラムに利用できる型は以下に限られています。 それぞれの値は、整数、ダブルクウォートした文字列、または大文字の論理値で指定します。
型 | 値の例 |
---|---|
CHAR, VARCHAR | "1" , "T" , "D" , など |
TINYINT | 1 , 0 , など |
BOOLEAN | TRUE , FALSE |
上記の情報は、データベースに対して1組のみ指定できます。 テーブルに削除フラグのカラムが定義されていない場合には、それに対応するデータモデルが削除をサポートしません。
Attention
文字列型の値には、かならず文字列をダブルクウォートで括ってやる必要があります。
コマンドラインシェルから文字列型の値を指定する際には '"1"'
のようにさらにシングルクウォートで括るなどしてください。
生成されるデータモデルの属性¶
DMDLジェネレータが生成するDMDLスクリプトには、 ThunderGateが利用する様々な属性が付けられています。
以下は、DMDLジェネレータが単純なテーブルに対して生成した DMDLスクリプトの例です。
"テーブルTGCACHE_SOURCE"
@auto_projection
@namespace(value = table)
@thundergate.name(value = "TGCACHE_SOURCE")
@thundergate.primary_key(value = { sid })
@thundergate.cache_support(
sid = sid,
timestamp = updt_datetime,
delete_flag = delete_flag,
delete_flag_value = "1"
)
tgcache_source = {
"SID"
@thundergate.name(value = "SID")
sid : LONG;
"VERSION_NO"
@thundergate.name(value = "VERSION_NO")
version_no : LONG;
"RGST_DATETIME"
@thundergate.name(value = "RGST_DATETIME")
rgst_datetime : DATETIME;
"UPDT_DATETIME"
@thundergate.name(value = "UPDT_DATETIME")
updt_datetime : DATETIME;
"CATEGORY"
@thundergate.name(value = "CATEGORY")
category : INT;
"DELETE_FLAG"
@thundergate.name(value = "DELETE_FLAG")
delete_flag : TEXT;
};
@thundergate.
から始まる属性は、DMDLジェネレータが独自に拡張している属性です。
そのため、DMDLジェネレータが生成するDMDLスクリプトからプログラムを生成する際には、
DMDLコンパイラのプラグインの指定に asakusa-thundergate-dmdl-*.jar
の指定が必要です。
オリジナル名の属性¶
データモデルの定義に @thundergate.name(value = "<名前>")
を指定すると、
データモデルの元になったテーブル名やビュー名を保持させられます。
これらの情報は、Asakusa DSLからThunderGateを利用する際にも利用されます [4] 。
[4] | DbImporterDescription や DbExporterDescription を利用する際に、
テーブル名やカラム名などを省略していますが、かわりにここで指定した名前を利用しています。 |
主キー属性¶
@thundergate.primary_key(value = {<主キーの一覧>})
を指定すると、
主キーとして取り扱われるプロパティの情報を保持させられます。
この情報は、ThunderGateがエクスポート処理を高速化する際になどに利用しています。
射影モデルの登録¶
DMDLジェネレータが生成するデータモデルには、
自動射影の属性 @auto_projection
が付けられています。
このため、独自に射影モデルを定義して、DMDLジェネレータが生成した データモデルと併せてDMDLコンパイラに渡すと、 射影モデルを自動的に登録させられます。
自動射影や射影モデルについては、 DMDLユーザーガイド も参考にしてください。