jiemamy inside 2

41
Jiemamyインサイド for contributors ~第二回 地豆の会~ 都元ダイスケ 2008.07.03 (Thu)

Upload: -

Post on 24-May-2015

784 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Jiemamy inside 2

Jiemamyインサイドfor contributors~第二回 地豆の会~

都元ダイスケ2008.07.03 (Thu)

Page 2: Jiemamy inside 2

ようこそ二回目。

•正直、またこんなに人が来てくれるとは思ってなかったでデスよ。

• 第一回で絶望したんでないかとw

• だってモデリング好きじゃいと、途方も無くつまんないネタだったもんね。

Page 3: Jiemamy inside 2

Jiemamy Project

• http://jiemamy.org が動き出しました。• 豪華な開発インフラ(笑)• Repos → 従来通りSourceForge.JP• ITS → JIRA• Wiki等 → Google Apps• 投票 → JiemamyPolls (地豆謹製w)

Page 4: Jiemamy inside 2

現在までの動き(1)• 旧コードベース:Bacchus(バッカス)• プロトタイプ• 新コードベース:Artemis(アルテミス)• 品質向上・コミュニティの理解

• 現在、再モデリングがひとまず落ち着いて来たかな、という辺り。

Page 5: Jiemamy inside 2

現在までの動き(2)• DIコンテナ(Seasar2)導入• イベント処理• 独自Collectionクラス• ModelIdManager

• プロジェクト分割• bacchus core = artemis(core + serializer)• dxoを上手く利用

• モデルのinterface検討中

Page 6: Jiemamy inside 2

さて、今日はロジック。

•とはいっても、SQL生成に関してはすっごいベタベタな実装です。

• ずーーーっとStringBuilderのターン• Template Method Patternのターン

• 前半は、また退屈かもしんない><

Page 7: Jiemamy inside 2

Agenda

• Dialectの標準実装を見てみよう。

• MySQLDialectの実装を見てみよう。

• インフォメーションスキーマについて。• 今回のスライドはちょっと手抜きかもw

• Bacchusを完全理解するよりも、Artemisの参考にできる程度の知識を目指す!(言い訳)

Page 8: Jiemamy inside 2

前回の復習

•今日の前半は、この中身。

• Dialect#createSQL() の実装。

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

Page 9: Jiemamy inside 2

Dialectの仕事• DatabaseModelをSQLに変換する。

• 実DBの情報(Information Schema)を読み出して、モデル化する。

• 今、コードを見て、上記2責務のメソッド粒度ちげぇと反省した。Artemisで何とかする。

• DataTypeやドライバの管理

• その他

Page 10: Jiemamy inside 2

で、結構責務が大きい。

•けど、1方言1インターフェイスにしたいな、と思ったんですよ…。

• → 委譲クラスの定義• SQLDialect : Model → SQL

• InformationSchemaDialect : DB → Model

Page 11: Jiemamy inside 2

そのクラス図

Page 12: Jiemamy inside 2

この委譲って、アリ?◆Request for comment◆

• この方針は正解だったんだろうか?• 初心者時の思いつきでこうしたんだけど• 良い気もするし、見通し悪い気もする。• 他にスマートな方法ありますか?• やっぱし、インターフェイスを分割すべきなんだろうか?

Page 13: Jiemamy inside 2

createSQL(DB, ...)• こんだけ。

Page 14: Jiemamy inside 2

createSQL(Entity, ...)

普通にoverloadしたいのだが、Table, View共にEntityだから再帰しちゃうんだよねw

Page 15: Jiemamy inside 2

VIEW

Page 16: Jiemamy inside 2

もう大体分かったっしょ。

Page 17: Jiemamy inside 2

もう読めそうじゃね?

Page 18: Jiemamy inside 2

こんなのもある。

•もう、オーバーライドしてくださいと言わんばかりのメソッドwww

• お気づきかもしれませんが、今までのメソッドは、ほとんどprotectedです。

Page 19: Jiemamy inside 2

メソッド命名規則•命名には結構困るので、BNFを参考に。• Clause = 句:WHERE句、とか• Bacchusは完全準拠ではないが、Artemisでは準拠させたいな~。

• 標準SQL規格(SQL99)のBNFhttp://savage.net.au/SQL/sql-99.bnf.html

• ArtemisはSQL2003も見た方がいいかなぁ?http://savage.net.au/SQL/sql-2003-2.bnf.html

Page 20: Jiemamy inside 2

BNFの例

• createTableDefinition• createColumnDefinition• createDefaultClause   等

Page 21: Jiemamy inside 2

結局

• BNFに従うことで、BNF準拠のSQLは何でも吐ける。

• さらに、Dialectでは特定の句等を生成するメソッドをオーバーライド。

• 各メソッドは、coreのモデルを単純に読んで、StringBuilderで構築してるだけ。

Page 22: Jiemamy inside 2

MySQLDialect

Page 23: Jiemamy inside 2

型と予約語の登録

Page 24: Jiemamy inside 2

登録と呼び出し

Page 25: Jiemamy inside 2

DB固有オプション

•基底クラスのListに登録している。

Page 26: Jiemamy inside 2

MySQLのENGINE指定

•先ほどのoverrideして下さいメソッド。• tableModelにEngineオプションが指定されていたら、ENGINE=xx を吐く。

Page 27: Jiemamy inside 2

その他微調整等

Page 28: Jiemamy inside 2

その他微調整等

Page 29: Jiemamy inside 2

次にInformation Schema

• 情報スキーマとも言われる。

• DBのメタ情報を取り出せるentity群。

• table一覧や、column一覧など。

• ANSI SQL 2003 で標準化されている。

• JavaのAPIで抽象化されている。

Page 30: Jiemamy inside 2

存在するEntityのList

見やすい様、try~catch等は省略(以後、同様)

Page 31: Jiemamy inside 2

Javadoc : getTables()

Page 32: Jiemamy inside 2

テーブルのカラム情報(1)

Page 33: Jiemamy inside 2

テーブルのカラム情報(2)

Page 34: Jiemamy inside 2

テーブルのカラム情報(3)

Page 35: Jiemamy inside 2

Javadoc : getColumns()

Page 36: Jiemamy inside 2

Javadoc : getPrimaryKeys()

Page 37: Jiemamy inside 2

Javadoc : getImportedKeys()

Page 38: Jiemamy inside 2

DBImporterの実装

Page 39: Jiemamy inside 2

こんな感じで

•モデルをSQLに変換する方法。

• 生DBからモデルを生成する方法。

Page 40: Jiemamy inside 2

• お待ちかね、Eclipseプラグインコース!• 大まかなプラグインの種類• action, view, wizard,preference, editor 等

• SWTの基礎• GEF (Graphical Editing Framework)• MVCアーキテクチャ• イベント通知モデル

次回予告!

Page 41: Jiemamy inside 2

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