Skip to content

QueryString

gageas edited this page Feb 11, 2018 · 1 revision

クエリ文字列について

クエリ入力欄に入力された文字列の形式によって異なる方法で検索を行います。

SQL文を入力

入力された文字列がSQL文として認識できた場合、SQL文としてライブラリから検索を行います。

Luteaのライブラリについて

Luteaのライブラリは,"list"というテーブル名でデータベースに格納されています。 このテーブルの1行が1曲に対応しています。

テーブル"list"には以下の必須のカラムがあります。

file_name(主キー), file_title, file_ext, file_size,
statDuration, statChannels, statSamplingrate, statBitrate, infoCodec_sub,
rating, playcount, lastplayed, modify,
tagTitle(*), tagArtist(*), tagAlbum(*), tagGenre(*), tagDate, tagTracknumber,

また,拡張カラムとしてデフォルトで以下のカラムが定義されています。

tagComment(*), tagAlbumArtist(*), tagPerformer(*)

拡張カラムは,削除したり,新たにカラム(=データベースに格納したいタグ)を追加することができます。

上の必須カラムと拡張カラムのうち,(*)マークがついているものは文字列検索の対象カラムとして指定されています。
これをTextSearchTargetと呼び,下に記した正規表現での検索やあいまい検索(migemo)ではこれらのカラムが対象となります。

クエリを書きやすくするため,TextSearchTargetの内容を連結する"allTags"VIEWを定義しています。カラムは以下の2つのみです。

file_name, text

各タグの内容は改行区切りで連結されていますが,正規表現がmultilineモードで動くため,!^や!$もよしなに動きます。

SQLの書き方

H2k6で使用できるものと全く同一のクエリが使用できます。

主キーであるfile_nameカラムのみ選択すればOKですが,面倒ならばSELECT *でよいです。

例:

SELECT * FROM list WHERE rating = 50;
SELECT file_name FROM allTags WHERE migemo('hoge' , text);

独自SQL関数として以下のものが使用できます。

current_timestamp64()

現在のUnix epochタイムスタンプ(秒)を返す
lastplayed, modifyとの差をとって使用するパターンが多いと思います。

例:

SELECT * FROM list WHERE current_timestamp64() - lastplayed <= 604800;

LCMapUpper(string src)

表記ゆれを吸収するために変換した文字列を返す。LCMapUpper("あ") == LCMapUpper("ア")となるなど。

regexp(string pattern, string match)

patternで表わされる正規表現にmatch文字列がマッチすれば1,しなければ0を返す。

例:

SELECT * FROM list WHERE regexp('/GRe+N/', tagArtist);
SELECT * FROM list WHERE tagArtist regexp '/GRe+N/';

migemo(string pattern, string match)

migemoによってpatternで表わされる文字列にmatch文字列がマッチすれば1,しなければ0を返す。

例:

SELECT * FROM list WHERE migemo('sakura', tagArtist);

any(string value, string values...)

valueをMultipleValueとして考え,valuesのいずれかを含んで入れば1,いずれも含まなければ0を返す。

SELECT * FROM list WHERE any(tagArtist, 'UR@N', 'AiRI');

every(string value, string values...)

valueをMultipleValueとして考え,valuesの全てを含んで入れば1,いずれかを含まなければ0を返す。

例:

SELECT * FROM list WHERE every(tagArtist, '小倉唯', '石原夏織');

なお、検索クエリはデータベースをロックした状態で発行されるため、UPDATE等を含むクエリを実行することはできません。

正規表現を入力

入力された文字列が/~/という形式になっている場合、正規表現として検索を行います。
マッチ対象はtagTitle, tagAlbum, tagArtist, tagCommentです。

正規表現の仕様は、re2が対応する正規表現となります。
/~/i とすることで大文字・小文字を無視した検索ができます。

例:

/^門脇舞以?$/
/\d{4}/

あいまい検索(migemo)

入力された文字列がSQLでも正規表現リテラルでもない場合、migemoを使用してあいまい検索を行います。
マッチ対象はtagTitle, tagAlbum, tagArtist, tagCommentです。

スペース区切りで複数フレーズのAND検索ができます。
フレーズの前に-を付けるとNOT条件となります。

migemoがロードできなかった場合、SQLのLIKE演算子による検索を行います。

例:

sakura
siinaRingo // 先頭大文字で文節区切り(migemo)

Tips

あいまい検索で余計なトラックがヒットしすぎる場合、/~/で囲い正規表現検索とすることで ほぼ 単語検索となり項目を絞り込むことができます。