Jiemamy inside 2

Post on 24-May-2015

786 views 0 download

Tags:

Transcript of Jiemamy inside 2

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

都元ダイスケ2008.07.03 (Thu)

ようこそ二回目。

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

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

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

Jiemamy Project

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

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

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

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

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

• モデルのinterface検討中

さて、今日はロジック。

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

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

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

Agenda

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

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

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

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

前回の復習

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

• Dialect#createSQL() の実装。

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

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

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

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

• DataTypeやドライバの管理

• その他

で、結構責務が大きい。

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

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

• InformationSchemaDialect : DB → Model

そのクラス図

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

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

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

createSQL(Entity, ...)

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

VIEW

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

もう読めそうじゃね?

こんなのもある。

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

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

メソッド命名規則•命名には結構困るので、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

BNFの例

• createTableDefinition• createColumnDefinition• createDefaultClause   等

結局

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

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

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

MySQLDialect

型と予約語の登録

登録と呼び出し

DB固有オプション

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

MySQLのENGINE指定

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

その他微調整等

その他微調整等

次にInformation Schema

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

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

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

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

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

存在するEntityのList

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

Javadoc : getTables()

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

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

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

Javadoc : getColumns()

Javadoc : getPrimaryKeys()

Javadoc : getImportedKeys()

DBImporterの実装

こんな感じで

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

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

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

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

次回予告!

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