Skip to content
Hayato Fujita edited this page Jun 14, 2021 · 2 revisions

filter

リソースを取得する際の条件を抽象化したもの。簡単に言うとSQLのwhere句を簡便に抽象化したもの。

実態はAST(抽象構文木)である。

これの良いところは、フィルター条件の記法がinfra層に依らないところである。すなわちdomain層に記述出来、EventRepisitoryなどの操作を記述するインターフェイスが簡潔のままに保てる。

具体的なフィルターの実装はinfra層の責務であるが、少なくともSQLであれば比較的簡単に実装出来る。

parsing

このfilterという概念がある理由は、iCal配信するイベント(ユーザーのカレンダーに登録されるイベント)をユーザーが自由に選別出来るようにしたいという欲求からである。

これの愚直な解決策は、ユーザーにSQLを書かせることであるが、これはSQLインジェクションの危険性を孕み、一般に推奨されることではない。従って、安全に対処するためにパーサーを用意した。文法は以下のようになっている。

top : ε | expr, expr : term ( ( "||" | "&&" ) term)*
term : cmp | "(" expr ")"
cmp : Attr ( "==" | "!=" ) UUID
Attr : "event" | "user" | "group" | "tag"

この文法は単純にorandだけで結合されたものではないことに注意が必要である。group=={{groupID}}||(tag=={{tagID}}&&event!={{eventID}})のように強い表現能力を持つ。

これはASTにパースされて、処理される。

Clone this wiki locally