karno/StarryEyes — pull request #61 by takeshik (2014-02-24 21:26:02+00:00)
Title: Add user set literal in KQL

## 変更点

現状:

```
from local where user = @alice | user = @bob | user = @charlie | user = #12345678
```

上のクエリを、こう書けるようにした:

```
from local where user in [@alice, @bob, @charlie, #12345678]
```

`user.following` を指定するのと同じように、普通に `WHERE … IN …` クエリに展開されているはず。

## 効果

* 複数ユーザを対象とする際に読みやすく、書きやすくなる
* numeric や string にはリテラルがあるのに set にリテラルがない不整合の解決。
* or で繋げるより SQL 長が抑えられ、性能が向上する [要出典]。

## その他

* 面倒なので `[` ～ `]` を区切るカンマ `,` は最後の一個が余計でも動くようにしてます (ex: `[ @foo, @bar, ]`)。
* 一応 (`from local` で) 期待する動作を満たすことをテスト済ですが、不十分かも。
* `text contains` とかでも set literal 使えるようにしたいけど、そもそも SQL 的に無理な気がしてきたので今回は見送り。
* トークン名で `(` `)` が `OpenBracket` `CloseBracket` となっていたが、`()` は parenthesis で `[]` が bracket なのが一般的かとは思われる…が、変更を最小限にするために今回は `[]` に SquareBracket の名称を当てました。問題があるなら別途変更ください。