Jiemamy inside 1

56
Jiemamyインサイド for contributors ~第一回 地豆の会~ 都元ダイスケ 2008.05.21 (Wed)

Transcript of Jiemamy inside 1

Page 1: Jiemamy inside 1

Jiemamyインサイドfor contributors

~第一回 地豆の会~

都元ダイスケ2008.05.21 (Wed)

Page 2: Jiemamy inside 1

今日は地豆な話• JiemamyはEPLで公開されるOSS。

• AmaterasERDの派生ソフトウェア扱い。

• コミット時点で以下に同意として扱う。• OSSとして公開されること。• 著作者人格権の不行使。• 著作権(財産権)の譲渡。

• 著作権は、NPO等の代表となる権利主体を用意できない為、私が管理します。

• 杞憂だとは思いますが、関係者が増えると色々なので。

Page 3: Jiemamy inside 1

必修科目

• Jiemamy概論

• オーバービュー

• モデル構造解説

• J-core/*.core.model

• Mavenプラグイン概論

オードブル

Page 4: Jiemamy inside 1

Jiemamyの構成

•まず、repositoryに置いてあるプロジェクトをざっと見てみますか。

Page 5: Jiemamy inside 1

• jp.xet.jiemamy.core• jp.xet.jiemamy.dialect• jp.xet.jiemamy.porter• jp.xet.jiemamy.eclipse• jp.xet.jiemamy.eclipse.helper• jp.xet.jiemamy.porter.ui• jiemamy-maven-plugin• jp.xet.jiemamy.eclipse.feature• jp.xet.jiemamy.release• jp.xet.jiemamy.site• jiemamy-tutorial• jp.xet.jiemamy.converter• jp.xet.jiemamy.ant

Eclipse非依存の本当にcore部分

Eclipse UI部分

Eclipse プラグインリリース作業関係

チュートリアルや実験中プロジェクト等

Maven プラグイン部分

Page 6: Jiemamy inside 1

コンポーネント略称定義

• jp.xet.jiemamy.core•って毎度書くのはアレなので。•こいつは「J-core」って呼びます。

• jp.xet.jiemamy部分を「J-」にします。•J-eclipseHelper = jp.xet.jiemamy.eclipse.helper

•その他例外的なのもあるけど空気読んでw

Page 7: Jiemamy inside 1

• J-core内の、特にmodelの話

• あと、軽くJ-mavenの話をしまーす。

今日は

Page 8: Jiemamy inside 1

中心機能部分

• J-core•モデルの定義•dialectやporterのinterface定義

• J-dialect•各SQL方言の実装

• J-porter•各インポート/エクスポート機能の実装

Page 9: Jiemamy inside 1

簡単な構成

モデル・その他中心機能(J-core, dialect, porter)

Eclipse API Maven API

maven-jiemamy-plugin

(J-maven)

Jiemamy Eclipseプラグイン(J-eclipse等)

同じ機能(インターフェイス)を、Eclipse側とMaven側から利用しているだけ。

Page 10: Jiemamy inside 1

言葉で説明すると•モデル等の中心機能があって、このinterfaceを使って、• Eclipseプラグイン部分と、• Mavenプラグイン部分が各々、• モデルの編集や、• 別表現からモデルへの入力(import)、• モデルから別表現への出力(export)等

• を行う訳です。

Page 11: Jiemamy inside 1

中心機能は特殊な環境に非依存

•だから、同じモデルと機能をEclipse / Maven両者から使える。

• 中心機能を操作する別のインターフェイスを作れば、別の使い方だってできる。

• ここまでで何か質問ありますかー?

Page 12: Jiemamy inside 1

必修科目

• Jiemamy概論

• オーバービュー

• モデル構造解説

• jp.xet.jiemamy.core/*.core.model

• Mavenプラグイン概論本日のメイン

Page 13: Jiemamy inside 1

AbstractModel

• 全てのModelはこのクラスを親に持つ。

• 永続化の為にSerializableを実装。

• newされた時に、long型のidが乱数で生成され、equals識別に使用される。

• ObserverパターンのSubject(監視対象)となる。(リスナ登録が可能)

• 変更時にPropertyChangeEvent発生

Page 14: Jiemamy inside 1

PropertyChangeListener◆Request for comment◆

• java.beansパッケージの標準API• JavaBeansのプロパティ変更を監視• Subjectが保持するListが変更された時は?• 現状、Subjectがイベントを発生

• Subjectが破棄(削除)された時は?• 現状、やはりSubjectがイベント発生• ホントは親がイベント発生させるべき。

Page 15: Jiemamy inside 1

RootModel• その名の通り、全ての根になるモデル。

• 直接のシリアライズ対象。

• DatabaseModelのリストを持つ。

• かつて血迷った結果w

• 複数のDBモデルを持つ可能性を考えてた。要らないかもしれない。

• 現状、Listだけど1つしか保持しない。

Page 16: Jiemamy inside 1

DatabaseModel

• 一枚のER図を表現するモデル。

Page 17: Jiemamy inside 1

Collectionを持つモデルのaccessor◆Request for comment◆

• モデルにCollectionが多く含まれている。• スマートな作り方は無いだろうか。class DB { // host側 private List<Table> tables; public void addTable(Table table) { tables.add(table); } ...}---- clientからdb.addTable(table);

class DB { // host側 private List<Table> tables; public List<Table> getTables() { return tables; }}

---- clientからdb.getTables().add(table);

host側にmethodが増え複雑に見える原因

client側が非直感的Event発生できない

Page 18: Jiemamy inside 1

ダイアグラム系モデル

•ダイアグラム = Node + Connection

• ERダイアグラム = Entity + Relation

extends extends extends

Page 19: Jiemamy inside 1

Node系モデルダイアグラム上に表示される

全てのノード(DBに直接関係するとは限らない)

DBに直接関係する要素のモデル付箋

Page 20: Jiemamy inside 1

AbstractNodeModel• ダイアグラム上の表示される”■”一般。

■→■(source)→(target)

Page 21: Jiemamy inside 1

StickyModel ~ 付箋

•内容文とそのaccessorメソッド。

• 超簡単。

Page 22: Jiemamy inside 1

AbstractEntityModel

• Nodeの中でも、特にEntity

• 全部Stringだ。難しくない。

Page 23: Jiemamy inside 1

ViewModel ~ ビュー

• StickyModelと似たり寄ったり。• ここでSQLパーサが欲しい → 簡易実装定義文から以下の情報を取得したい。• このViewが持つカラム• 依存(参照)しているTable

• J-dialectも絡んで来る。

Page 24: Jiemamy inside 1

TableModel ~ テーブル

•複雑に見えるかもしれないけど、冷静に見れば簡単なはず。

Page 25: Jiemamy inside 1

Node系モデルまとめ

Page 26: Jiemamy inside 1

ColumnModel (1)

• ColumnModel extends DefinitionModel

• ほとんど実装はDefinitionModel内にある。

• すまん、この辺が一番複雑なんだ。

• なので、まずはDefinitionModelいくよ。

Page 27: Jiemamy inside 1

DefinitionModel (1)• 型ってあるよね。INTとかVARCHARとか。• そいつらは、DataTypeという型。• この型は、オプションと名前がつくよね。foo VARCHAR(16) とか。

• これがDefinitionModel

Page 28: Jiemamy inside 1

DefinitionModel (2)

• ColumnModelとDomainModelは、どちらも、型に名前やオプションをつけた「定義」なんだ。だからDefinition。

Page 29: Jiemamy inside 1

DomainModel ~ ドメイン

•ドメインは「定義」かつ、VARCHAR等と対等な「データ型」なのだ。

Page 30: Jiemamy inside 1

ColumnModel (2) • で、やっとColumnModel。

• Definitionに「所属するテーブル」が追加されただけ。

Page 31: Jiemamy inside 1

InheritanceColumnModel

• 継承により親から引き継いだカラム。

• この辺複雑なので、スライドに書きにくい。

Page 32: Jiemamy inside 1

Definition系モデルまとめ

Page 33: Jiemamy inside 1

めっっっさ、混乱してるはずです。

•だって俺も難しいもん。

•ここら辺で、質問を受け付けておきますw

Page 34: Jiemamy inside 1

Connection系モデルダイアグラム上に表示される

全てのコネクション(DBに直接関係するとは限らない)

DBに直接関係するコネクションの

モデル

まだ存在

しないけど、

付箋とTableを繋ぐ

説明用のコネクション

Page 35: Jiemamy inside 1

AbstractConnectionModel

• ダイアグラム上の表示される”→”一般。

■→■(source)→(target)

Page 36: Jiemamy inside 1

ベンドポイント

Page 37: Jiemamy inside 1

AbstractRelationModelとInheritanceModel

• 中身は、ほぼカラっぽ。

• 接続元と先があって、bendpointsがあるだけだからね。

• 特別な機能が無いから。

Page 38: Jiemamy inside 1

ForeignKeyModel

• マッピング(後述)

• あとは物理名とか論理名とか。簡単。

• matchTypeとinitiallyCheckTimeは、enumにすべきだな、と今思ったw

Page 39: Jiemamy inside 1

ForeignKeyMapping (1)

• FKはEntity同士を繋ぐタダの「線」

• 外部キー = targetの主キーカラムがsourceの「あるカラム」に制約を付与。

• targetが複合キーの場合、制約は複数。

• だからFKは、これのListを持つ。

Page 40: Jiemamy inside 1

ForeignKeyMapping (2)

• 制約を受けるカラム & 参照先カラム。

Page 41: Jiemamy inside 1

Connection系モデルまとめ

Page 42: Jiemamy inside 1

あとは雑多 (1)

• 峠は越えましたよ。

• これらのクラスは、EclipseAPIにもあるが、依存させない為に、自前で用意してある。

Page 43: Jiemamy inside 1

あとは雑多 (2)

• 物理データベース(実際のDB)

Page 44: Jiemamy inside 1

あとは雑多 (3)

• アウトライン用のモデルをまとめるフォルダみたいなもの。

こいつら

Page 45: Jiemamy inside 1

以上、モデル解説でした。

• indexとかrecordとかを飛ばしたし、

• その他小さいクラスはあるんですが、

• ここまで把握できれば、

• Javadoc見ながら読めます。多分...

Page 46: Jiemamy inside 1

モデルの構造◆Request for comment◆

• SerializeにはXStreamを使用している。• [T1]―(C)→[T2] のserializeの順番は...• RootModel#databases• DatabaseModel#nodes (T1, T2)• TableModel#sourceConnections (C)• ForeignKeyModel#target (T2)

• T1の定義が終わらぬウチにT2の定義が始まってしまう → XMLのネストが深い

Page 47: Jiemamy inside 1

シリアライズ方法◆Request for comment◆

• 現状、全モデルをRootModelから掘り続けて、芋づる式にシリアライズ。

• 1スキーマに1データ(DML)セット

• 複数のデータセットを扱いたい。

• しかし、モデルが更に肥大化する。

Page 48: Jiemamy inside 1

じゃあ、ファイル分ける?◆Request for comment◆

• 単純に分割するだけでは整合性に課題。• ではjarファイルの様に、実はZIP方式?• スキーマ定義ファイル• スキーマプレゼンテーション1, 2, 3...• データセットファイル1, 2, 3...

• データファイルは圧縮されて小さくなるし、扱いやすくなる。

• けど、データファイルがバイナリ化。• コミットしてdiff取れるメリットが...

Page 49: Jiemamy inside 1

必修科目

• Jiemamy概論

• オーバービュー

• モデル構造解説

• jp.xet.jiemamy.core/*.core.model

• Mavenプラグイン概論デザート

Page 50: Jiemamy inside 1

アレコレ言わずにコード嫁FileInputStream inputStream = new FileInputStream(inputFile);

 JiemamySerializer serializer = SerializerFactory.getSerializer(); RootModel rootModel = serializer.deserialize(inputStream);

 Porter porter = (Porter) Class.forName(exporter).newInstance();

 porter.setParameter(parameter); porter.execute(rootModel);

泣いても喚いてもこれだけだ。

Page 51: Jiemamy inside 1

ここで読み取らなければいけないこと。

•モデルの復元(デシリアライズ)方法。

• あとは、Porterのインスタンスに、パラメータとモデルを渡してexecute。

• これで「何かが起こる」。

• 何が起こるかはporter次第。

• この場合は「SQLを吐く」。

Page 52: Jiemamy inside 1

ついでだからPorter見とくか。FileOutputStream sqlFileOs =         new FileOutputStream(sqlFile);OutputStreamWriter sqlWriter =      new OutputStreamWriter(sqlFileOs, "UTF-8");

Dialect dialect = dbModel.getDialect();String sql = dialect.createSQL( dbModel, drop, dml, schemaName);

sqlWriter.write(sql);

こんだけやん。

Page 53: Jiemamy inside 1

ここで読み取らなければいけないこと。

• DatabaseModelは、DBの種類情報、つまりDialectを持ってて、getDialect()できる。

• あとは、Dialect#createSQL() に「モデル」と「少々のオプション(boolean)」を与えれば、SQLが得られる。

Page 54: Jiemamy inside 1

結局

•結構複雑なモデルがあって、

• それをSQLに変換する。

• その変換ロジックはDialect#createSQLメソッドに実装されている。

• さて、その実装内容は...?

Page 55: Jiemamy inside 1

• SQL生成ロジックコース!

• SQL生成ロジック総論

• どんなinterfaceを持ってるの?

• 標準SQLの実装はどうなってるの?

• SQL方言各論

• MySQL, PostgreSQL等

• 個別に見てみようの会!

次回予告!

Page 56: Jiemamy inside 1

ご清聴ありがとう ございました。