DBFlute: FullTextSearch向けの機能

@DBFlute-0.9.5-RC1, Java, Tritonn, Ludia, Senna, Oracle Text
http://d.hatena.ne.jp/jflute/20090429/1241006226
こちらの記事のコメント欄で繰り広げられた話題です。
要約すると
「ConditionBeanにFullTextSearch向けのメソッドを追加」
です。

FullTextSearchでは特殊な構文を利用するため、
今までは外だしSQLで実装するしかありませんでしたが、
基本的な検索だけはConditionBeanでも出来るようにしました。
「基本的な」というのは「Where句での検索条件の設定」です。

これらは、完全にそれぞれのDBに依存した機能となります。
「littleAdjustmentMap.dfprop」
の「isAvailableDatabaseDependency」
をtrueに設定することで利用可能です。
(そのDBにおける独自のI/Fのメソッドが生成されます)

想定されたインフラ構成は以下の通りです。

 o MySQL + Tritonn + Senna
 o PostgreSQL + Ludia + Senna
 o Oracle + Oracle Text

DBFluteでこれらの構成を利用する方は
ぜひこの機能をご利用下さい。
{MySQL + Tritonn + Senna}

match構文を使ったSQLが出力できるようになります。
それぞれのConditionQuery(cb.query())
に生成されるmatch()メソッドを利用します。

 第一引数:検索対象のカラム (ColumnInfo)
 第二引数:条件値 (String)
 第三引数:検索モード (ENUM)
MemberCB cb = new MemberCB();
cb.query().match(
    MemberDbm.getInstance().columnMemberName()
    , "foo"
    , WayOfMySQL.FullTextSearchModifier.InBooleanMode);
where
  match(dflocal.MEMBER_NAME)
  against ('foo' IN BOOLEAN MODE)
第一引数が「List」のメソッドもあります。
この場合、複数のカラムを「or」として検索します。
「match(col1, col2)」というように並びます。
指定できるのは「Stringにマッピングされているカラム」、
「該当テーブルに存在するものカラム」に限ります。
第二引数がnull or emptyなら条件は無効(CBの基本仕様)
第三引数の検索モードがnullの場合はモードなしで検索します。

MySQLの仕様に従ってバインド変数を利用せずに
リテラルで条件値がSQLに展開されます。
{PostgreSQL + Ludia + Senna}

「%%」構文を使ったSQLが出力できるようになります。
それぞれのConditionQuery(cb.query())
に生成されるmatch()メソッドを利用します。

 第一引数:検索対象のカラム (ColumnInfo)
 第二引数:条件値 (String)
MemberCB cb = new MemberCB();
cb.query().match(
    MemberDbm.getInstance().columnMemberName()
    , "foo");
where dflocal.MEMBER_NAME %% 'foo'
第一引数が「List」のメソッドもあります。
この場合、複数のカラムを「or」として検索します。
実際に条件を「or」で連結します。
指定できるのは「Stringにマッピングされているカラム」、
「該当テーブルに存在するものカラム」に限ります。
第二引数がnull or emptyなら条件は無効(CBの基本仕様)

条件値はバインド変数として扱われます。
DBFluteConfigで設定することで、古いバージョンの
「@@」構文も利用できます。
{Oracle + Oracle Text}

「contains」構文を使ったSQLが出力できるようになります。
それぞれのConditionQuery(cb.query())
に生成されるmatch()メソッドを利用します。

 第一引数:検索対象のカラム (ColumnInfo)
 第二引数:条件値 (String)
MemberCB cb = new MemberCB();
cb.query().match(
    MemberDbm.getInstance().columnMemberName()
    , "foo");
where contains(dflocal.MEMBER_NAME, 'foo') > 0
第一引数が「List」のメソッドもあります。
この場合、複数のカラムを「or」として検索します。
実際に条件を「or」で連結します。
指定できるのは「Stringにマッピングされているカラム」、
「該当テーブルに存在するものカラム」に限ります。
第二引数がnull or emptyなら条件は無効(CBの基本仕様)

条件値はバインド変数として扱われます。
指定された条件値はメソッド内部で自動的にエスケープされます。
 foo --> {foo}
 f{o}o --> {f{o}}o}