-
Notifications
You must be signed in to change notification settings - Fork 0
QueryString
クエリ入力欄に入力された文字列の形式によって異なる方法で検索を行います。
入力された文字列がSQL文として認識できた場合、SQL文としてライブラリから検索を行います。
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モードで動くため,!^や!$もよしなに動きます。
H2k6で使用できるものと全く同一のクエリが使用できます。
主キーであるfile_nameカラムのみ選択すればOKですが,面倒ならばSELECT *でよいです。
例:
SELECT * FROM list WHERE rating = 50;
SELECT file_name FROM allTags WHERE migemo('hoge' , text);
独自SQL関数として以下のものが使用できます。
現在のUnix epochタイムスタンプ(秒)を返す
lastplayed
, modify
との差をとって使用するパターンが多いと思います。
例:
SELECT * FROM list WHERE current_timestamp64() - lastplayed <= 604800;
表記ゆれを吸収するために変換した文字列を返す。LCMapUpper("あ") == LCMapUpper("ア")
となるなど。
patternで表わされる正規表現にmatch文字列がマッチすれば1,しなければ0を返す。
例:
SELECT * FROM list WHERE regexp('/GRe+N/', tagArtist);
SELECT * FROM list WHERE tagArtist regexp '/GRe+N/';
migemoによってpatternで表わされる文字列にmatch文字列がマッチすれば1,しなければ0を返す。
例:
SELECT * FROM list WHERE migemo('sakura', tagArtist);
valueをMultipleValueとして考え,valuesのいずれかを含んで入れば1,いずれも含まなければ0を返す。
SELECT * FROM list WHERE any(tagArtist, 'UR@N', 'AiRI');
valueをMultipleValueとして考え,valuesの全てを含んで入れば1,いずれかを含まなければ0を返す。
例:
SELECT * FROM list WHERE every(tagArtist, '小倉唯', '石原夏織');
なお、検索クエリはデータベースをロックした状態で発行されるため、UPDATE等を含むクエリを実行することはできません。
入力された文字列が/~/という形式になっている場合、正規表現として検索を行います。
マッチ対象はtagTitle, tagAlbum, tagArtist, tagCommentです。
正規表現の仕様は、re2が対応する正規表現となります。
/~/i とすることで大文字・小文字を無視した検索ができます。
例:
/^門脇舞以?$/
/\d{4}/
入力された文字列がSQLでも正規表現リテラルでもない場合、migemoを使用してあいまい検索を行います。
マッチ対象はtagTitle, tagAlbum, tagArtist, tagCommentです。
スペース区切りで複数フレーズのAND検索ができます。
フレーズの前に-を付けるとNOT条件となります。
migemoがロードできなかった場合、SQLのLIKE演算子による検索を行います。
例:
sakura
siinaRingo // 先頭大文字で文節区切り(migemo)
あいまい検索で余計なトラックがヒットしすぎる場合、/~/で囲い正規表現検索とすることで ほぼ 単語検索となり項目を絞り込むことができます。