-
Notifications
You must be signed in to change notification settings - Fork 3
filter
Hayato Fujita edited this page Jun 14, 2021
·
2 revisions
リソースを取得する際の条件を抽象化したもの。簡単に言うとSQLのwhere句を簡便に抽象化したもの。
実態はAST(抽象構文木)である。
これの良いところは、フィルター条件の記法がinfra層に依らないところである。すなわちdomain層に記述出来、EventRepisitory
などの操作を記述するインターフェイスが簡潔のままに保てる。
具体的なフィルターの実装はinfra層の責務であるが、少なくともSQLであれば比較的簡単に実装出来る。
このfilterという概念がある理由は、iCal配信するイベント(ユーザーのカレンダーに登録されるイベント)をユーザーが自由に選別出来るようにしたいという欲求からである。
これの愚直な解決策は、ユーザーにSQLを書かせることであるが、これはSQLインジェクションの危険性を孕み、一般に推奨されることではない。従って、安全に対処するためにパーサーを用意した。文法は以下のようになっている。
top : ε | expr, expr : term ( ( "||" | "&&" ) term)*
term : cmp | "(" expr ")"
cmp : Attr ( "==" | "!=" ) UUID
Attr : "event" | "user" | "group" | "tag"
この文法は単純にor
やand
だけで結合されたものではないことに注意が必要である。group=={{groupID}}||(tag=={{tagID}}&&event!={{eventID}})
のように強い表現能力を持つ。
これはASTにパースされて、処理される。