karno/StarryEyes — pull request #69 by takeshik (2014-03-09 23:55:28+00:00)
Title: Improve query

## 概要

* クエリ機能の拡充
* 任意のタブを参照するフィルタ
* 大小文字を区別する文字列比較
* その他

## 詳細

* `local` フィルタに省略可能引数を追加: タブ名を指定して検索
* ex) `from local:"mention" where text contains "http://"`
* 検索ボックスからタブを指定してさらに絞り込みしたりする用途を想定
* クエリをコンパイルする際に `TargetInvocationException` を受けると不親切なエラー メッセージとなっていたのを修正
* `from conv:"invalid_arg"` で簡単に再現可能
* 新規タブのデフォルトの名前を `(empty)` から `(untitled)` に変更
* デフォルトのクエリで降ってくる内容が実際のところ空じゃないので
* case-sensitive な文字列比較の実装
* `caseful` 単項演算子の追加: String 値に前置することで、大小文字を区別することを示す
* ex) `where text contains "linq" & !(caseful text contains "LinQ")`
* caseful は右辺と左辺どちらに付けても動作は同じです
* LIKE 演算での大小文字区別を実現するために `PRAGMA case_sensitive_like=True` を接続文字列に足してます
* 大小文字区別しないときは `LOWER` 関数を適用することで大小文字区別させなくしています
* `=` 演算子の String 同士の比較が case-sensitive になっていたのを修正
* 他の文字列比較演算子の挙動と矛盾する
* `conv` フィルタを含んだタブを保存すると文字列化の過程でクエリが破壊されるバグの修正
* ついでに `talk` よりも `conv` の方が一般的な記述と思われるのでそちらに合わせておきました
* その他、コード内にタブ文字が混じっててフォーマットが崩れてるのを修正

## その他

* 機能として成立することを確認する程度にはテストしました
* タブ参照はきちんと動くことは動きますが、タブ内でクエリを書くときの循環参照の検知精度が微妙です
* 循環参照を起こす残念な人はそういないでしょうし、少なくとも落ちたりはしないことを確認済みです
* 大小文字区別するクエリは動作を確認してますが、ローカル キャッシュ内で動作してるのは明らかですが、DB 側問い合わせで想定する通りの動作になってるか確認できたか怪しいです
* とはいえクエリの妥当性は自分で SQL 発行して確認済みなので、まあ大丈夫なのではないかと…

### 今後の予定

今回の修正で LinQ 弾けるようになったのでクエリ周り弄るのも飽きたし、次はバックステージから target user / tweet の閲覧へ遷移できないのを軽く手を入れる予定です (というか、現状だいたい動いてる)