Filter_DSL - nomlab/hiyoco GitHub Wiki
フィルタサービスのDSL
- 作成者: 山本瑛治
- 作成日: 2018/11/15
- 最終更新者: 山本瑛治
- 最終更新日: 2018/11/15
はじめに
本文書はhiyocoにおけるフィルタサービスのDSLについて述べた文書である. 既存のクエリの例として,以下のサイトを参考にした.
- https://help.github.com/articles/searching-issues-and-pull-requests/
- https://support.google.com/mail/answer/7190?hl=ja
フィルタサービスの概要
フィルタサービスは,予定をルールに応じて編集し,特定のサービスに公開するサービスである. フィルタサービスは以下の情報をもつ.
- filter: 公開する予定の条件を表す
- action: 予定の編集方法を表す
- outlet: 予定の公開方法を表す
一例として,「予定名に"打合せ"を含む予定を,"仕事"に置換してslackに公開する」といった予定共有を考える.この場合,フィルタのルールは以下のようになる.
- filter: 予定名に"打合せ" を含む予定
- action: 予定名を仕事に置換
- outlet: slackに公開
フィルタサービスでは,上記のfilter, action, outletをDSLによって記述する.DSLの詳細は後半に示す.
フィルタサービスのDSLについて
前提知識
予定を構成する項目として,以下の項目がある.
- SUMMARY: 予定名
- DTSTART: 開始日時
- DTEND: 終了日時
- LOCATION: 場所
- DESCRIPTION: 説明
SUMMARY, LOCATION, DESCRIPTIONには文字列が入る.DTSTART, DTENDは日付が入る. よって,以降では文字列が入る項目の代表としてSUMMARY, 日付が入る項目の代表としてDTSTARTを利用する.
filter
- SUMMARY:str
- SUMMARYにstrを含む(部分一致)
- SUMMARY:str1 AND SUMMARY:str2
- SUMMARYにstr1とstr2を含む
- ORも同様の使い方
- NOT SUMMARY:str
- 論理式の逆転,SUMMARYにstrを含まない
- SUMMARY:str1 AND (SUMMARY:str2 OR SUMMARY:str3)
- 論理式のグループ化, SUMMARYにstr1を含み,かつstr2かstr3のどちらかを含む
- SUMMARY:”str”
- 完全一致,SUMMARYがstrと一致する
- DTSTART:{operator}YYYY-MM-DDTHH:MM:SS
- {operator}: >, <, >=, <=
- >: DTSTARTがYYYY年MM月DD日よりあとの予定
- <: DTSTARTがYYYY年MM月DD日より前の予定
- >=: DTSTARTがYYYY年MM月DD日以降の予定
- <=:DTSTARTがYYYY年MM月DD日以前の予定
- T以降はオプション
- {operator}: >, <, >=, <=
- DTSTART:YYYY-MM-DDTHH:MM:SS .. YYYY-MM-DDTHH:MM:SS
- 期間指定,A..Bとすると,AからBの期間
- T以降はオプション
action
actionにおける関数として,以下の3つを利用する.
- hide_event
- 予定を削除する.
- hide:SUMMARY
- SUMMARYの情報を隠す
- replace:SUMMARY:str
- SUMMARYをstrで置換
outlet
予定の送信先として,現在はgoogle カレンダ,メーラ,Slackを想定している.そこで,outletは以下のようになる.
- google_calendar:calendar_id
- google calendarのcalendar_idに対応するカレンダに公開
- mail:mail_address
- mail_addressに対してメールを用いて予定を公開
- slack
- slackに予定を公開
具体例
予定名に"打合せ"を含む予定を,"仕事"に置換してslackに公開する.
- filter: SUMMARY:打合せ
- action: replace:SUMMARY:仕事
- outlet: slack
検討が必要な項目
- 毎日五時以降の予定,といった条件をどのように指定するか
- 案として,DTSTARTにHH:MM:SSと記述することで指定する方法がある.
- filterの関数はこれで十分か
- 予定の送信タイミングをどのように指定するか
- 案として,outletに,TIMINGという項目を作成し,そこに条件を記述させる方法がある.
- (例1) TIMING:synchronous, 予定の変更に同期して送信
- (例2) TIMING:midnight, 深夜2時に一日の予定を送信
- 案として,outletに,TIMINGという項目を作成し,そこに条件を記述させる方法がある.