DBFluteランタイム-0.9.4.1-RC1 公開

@DBFlute, Java
DBFluteランタイム-0.9.4.1-RC1を公開しました。
今までとちょっと違うのは、「ランタイムだけ公開」です。
DBFluteモジュールはそのまま(0.9.4のまま)です。

DBFluteモジュール:0.9.4
DBFluteランタイム:0.9.4.1-RC1

で動作します。
JARファイルのDownloadはこちら
Maven2を利用している方はバージョンを「0.9.4.1-RC1」で。

実際に0.9.4.1を正式リリースするときは、DBFluteモジュールも
0.9.4.1にする可能性がありますが、ひとまず今回のRC1公開では
DBFluteランタイムだけの公開となります。
ひとつ大きな課題を修正しました。

外だしSQL(OutsideSql)のパラメータコメントで、
BEGINコメントの「and」調整で、最初のIFコメントの中の
ネストしたIFコメントの「and」も削除されてしまうという
課題がありました。
/*BEGIN*/where
  /*IF false*/AAA = 1/*END*/
  /*IF true*/and BBB = 2/*IF true*/and CCC = 3/*END*//*END*/
/*END*/
「IF false」や「IF true」は実際はParameterBeanの
プロパティの値がnullなのかどうかでの判定になります。
今は説明のために固定のBoolean値にしています。
(AAAの条件が無効になって、BBBの方が有効になることを想定)

AAAはfalseで固定で消えます。
なので、BBBの前のandは消えるべきで、その通り消えます。
CCCのandは消えるべきではありません。BBBが生きているから。
しかし、今までのDBFluteだとこれが消えてしまいます。
結果「where BBB = 2 CCC = 3」となってしまいます。
本来「where BBB = 2 and CCC = 3」となるべきです。

「あまりそういう使い方することがないのでは?」
というのも一理ありますが、一つ明らかに使うそうなパターン
があります。exists句とそのサブクエリ内の条件のIFです。
/*BEGIN*/where
  /*IF false*/AAA = 1/*END*/
  /*IF true*/and exists (
    select BAR_ID
      from BAR
     where BAR.FOO_ID = FOO.FOO_ID
       /*IF true*/and BBB = 3/*END*/
       /*IF true*/and CCC = 3/*END*/
  /*END*/
/*END*/
どんなときでもBBBとCCCのandは消えてはいけません。
これがちゃんと消えないように修正したの今回のRC1です。

ただ、本当にこの問題で困ることは稀でしょう。
exists句の前の条件が一個でも有効であれば発生しません。
で、なんとなくですが習慣的にexists句よりもわかりやすい条件
や絞り込みの多い条件を先に書くことが多いかと思います。
それらの条件が全て無効化されてexistsだけで絞るってのも
あまり現実的じゃないパターンが多いかと思います。
そういう意味でよくこれ発覚したなぁというところです。
(フィードバックしてくれたid:taktosさんありがとう!)
一つのBEGINの中でandのすっ飛ばしを一回だけやるように
すればというところですが、それだけではダメです。
もともとexists句がwhere句の最初に定義されてて、
そもそもandをすっ飛ばさない場合があります。

ネストしたIFでandは除去しないようにすればと思って
しまいますが、それはダメです。
「/*IF true*//*IF true*/and BBB = 3 ...」
というような利用の仕方をしている場合があるからです。
ただ、この利用方法自体はBEGINで囲むときにBEGINが
正常に動作しない可能性があるためNGな利用方法です。
OGNLを使って一つのIFコメントにまとめるべきです。
「/*IF true && true*/」

とにもかくにも、他の部分に影響のないように
考えたロジック的は:

一つのBEGINの中でandのすっ飛ばしを一回だけやる
 もしくは
既にIFコメントで囲まれた文字列で空文字じゃない文字列が
評価されたらもうそのBEGINではandのすっ飛ばしはしない

という感じになります。
これでようやく必要な場面においてだけandが調整されます。
SqlAnalyzerTestにてじゃんじゃんテストしています。
とはいえ、大事な修正をしたので早めにRCを公開して、
皆様のもとへ届ける方が良いと考えました。
なので、ひとまずDBFluteランタイムだけで公開しました。
バージョンアップしない方でも、ローカルだけで適用して
外だしSQLの動作を確認して頂けると助かります。
「コメントで特に問題ないですよー」と一言頂けると助かります。
(もし、何かおかしい挙動をしたときは詳細頂ければと)