dbfluteで大文字小文字の区別をなしにしたLIKE検索

// new LikeSearchOption().toLowerCase() --> 小文字に変換して比較
// new LikeSearchOption().toUpperCase() --> 大文字に変換して比較

これって、
HOGE LIKE LOWER('%PARAM%')

なのね・・・
理想は
LOWER(HOGE) LIKE LOWER('%PARAM%')
なんだけど・・・
もしくは、ignoreCaseみたいなメソッドによって上記動作が可能とか。

・・・これだけの為に外出しか!?
もうちょい調査。
かんたんだったらdbfluteでつくったソースを上書き。(exパッケージでどうにかなるなら・・・ね)

追加

やはり出来ないようだ。
それで、修正だが、そうかんたんには出来なかった・・・・


一応以下追加で私の検索が想定どおり動くのを確認。
JOINした場合で子テーブルに対してのLikeなどで、
不具合起こったりするかも知れないけど、
まぁ自分環境では問題ないのでいいや。


結果として、以下のようなSQLとなる。
where LOWER(dflocal.NAME) like '%param%' escape '|'


本来であれば、
where LOWER(dflocal.NAME) like LOWER('%pARam%') escape '|'
の方がよさげなんだけど・・・


というかそもそも
generate.bat
実行されたらうわがかれてしまうんだけどねぇ・・・


それがいやなら、vmを上書きで。
共通部分なので、上書きは決して難しくはない。(すべて固定文字だしね。)
・・・が保証の限りではない。
(もっとも保証出来る記述なんて一切ないんだが・・・)


一応そんな理由もあり、ignoreCaseなんてオプションを追加するのをやめて、
簡単に修正できそうな、toUpper toLowerの挙動を変えるという方向で修正してみた。

修正箇所

vmの修正もほぼ同様です。
しつこいようだが、二次的な副作用が出るかも知れません。

allcommon/cbean/ckey/ConditionKeyLikeSearch.java

doAddWhereClause(line66付近)

       final LikeSearchOption myOption = (LikeSearchOption)option;
       //add start
       columnName = myOption.getColNameWithConvert(columnName);
       //add end
       conditionList.add(buildBindClauseWithRearOption(columnName, value.getLikeSearchLocation(), myOption.getRearOption()));

allcommon/cbean/coption/parts/ToUpperLowerCaseOptionParts.java

method 追加
値に関するクラスなので、微妙だけど・・・・

   //add start
   public String generateColName(String colName) {
       if (colName == null) {
           return colName;
       }

       // To Upper/Lower Case
        if (_toUpperCase) {
        	colName = (colName != null ? "UPPER(" + colName + ")" : colName);
        }
        if (_toLowerCase) {
        	colName = (colName != null ? "LOWER(" + colName + ")" : colName);
        }
       return colName;
   }
   //add end

20088624一部記述に誤りがあり、修正しました。
UPPER()等でくくるところを、
colName.toUpperCase()
等にしていた。簡単なコピペ間違いだったんですが、
なんかそれっぽいだけにチェック漏れました・・・

allcommon/cbean/coption/LikeSearchOption.java

   //add start
   public String getColNameWithConvert(String colName) {
       if(_toUpperLowerCaseOptionParts != null) {
               colName = _toUpperLowerCaseOptionParts.generateColName(colName);
       }
       return colName;
   }
   //add end