Jiemamy inside 2
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アーキテクチャ• イベント通知モデル
次回予告!
ご清聴ありがとう ございました。