Filter_DSL - nomlab/hiyoco GitHub Wiki

フィルタサービスのDSL

  • 作成者: 山本瑛治
  • 作成日: 2018/11/15
  • 最終更新者: 山本瑛治
  • 最終更新日: 2018/11/15

はじめに

本文書はhiyocoにおけるフィルタサービスのDSLについて述べた文書である. 既存のクエリの例として,以下のサイトを参考にした.

  1. https://help.github.com/articles/searching-issues-and-pull-requests/
  2. https://support.google.com/mail/answer/7190?hl=ja

フィルタサービスの概要

フィルタサービスは,予定をルールに応じて編集し,特定のサービスに公開するサービスである. フィルタサービスは以下の情報をもつ.

  1. filter: 公開する予定の条件を表す
  2. action: 予定の編集方法を表す
  3. outlet: 予定の公開方法を表す

一例として,「予定名に"打合せ"を含む予定を,"仕事"に置換してslackに公開する」といった予定共有を考える.この場合,フィルタのルールは以下のようになる.

  1. filter: 予定名に"打合せ" を含む予定
  2. action: 予定名を仕事に置換
  3. outlet: slackに公開

フィルタサービスでは,上記のfilter, action, outletをDSLによって記述する.DSLの詳細は後半に示す.

フィルタサービスのDSLについて

前提知識

予定を構成する項目として,以下の項目がある.

  1. SUMMARY: 予定名
  2. DTSTART: 開始日時
  3. DTEND: 終了日時
  4. LOCATION: 場所
  5. DESCRIPTION: 説明

SUMMARY, LOCATION, DESCRIPTIONには文字列が入る.DTSTART, DTENDは日付が入る. よって,以降では文字列が入る項目の代表としてSUMMARY, 日付が入る項目の代表としてDTSTARTを利用する.

filter

  1. SUMMARY:str
    • SUMMARYにstrを含む(部分一致)
  2. SUMMARY:str1 AND SUMMARY:str2
    • SUMMARYにstr1とstr2を含む
    • ORも同様の使い方
  3. NOT SUMMARY:str
    • 論理式の逆転,SUMMARYにstrを含まない
  4. SUMMARY:str1 AND (SUMMARY:str2 OR SUMMARY:str3)
    • 論理式のグループ化, SUMMARYにstr1を含み,かつstr2かstr3のどちらかを含む
  5. SUMMARY:”str”
    • 完全一致,SUMMARYがstrと一致する
  6. 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以降はオプション
  7. DTSTART:YYYY-MM-DDTHH:MM:SS .. YYYY-MM-DDTHH:MM:SS
    • 期間指定,A..Bとすると,AからBの期間
    • T以降はオプション

action

actionにおける関数として,以下の3つを利用する.

  1. hide_event
    • 予定を削除する.
  2. hide:SUMMARY
    • SUMMARYの情報を隠す
  3. replace:SUMMARY:str
    • SUMMARYをstrで置換

outlet

予定の送信先として,現在はgoogle カレンダ,メーラ,Slackを想定している.そこで,outletは以下のようになる.

  1. google_calendar:calendar_id
    • google calendarのcalendar_idに対応するカレンダに公開
  2. mail:mail_address
    • mail_addressに対してメールを用いて予定を公開
  3. slack
    • slackに予定を公開

具体例

予定名に"打合せ"を含む予定を,"仕事"に置換してslackに公開する.

  1. filter: SUMMARY:打合せ
  2. action: replace:SUMMARY:仕事
  3. outlet: slack

検討が必要な項目

  1. 毎日五時以降の予定,といった条件をどのように指定するか
    • 案として,DTSTARTにHH:MM:SSと記述することで指定する方法がある.
  2. filterの関数はこれで十分か
  3. 予定の送信タイミングをどのように指定するか
    • 案として,outletに,TIMINGという項目を作成し,そこに条件を記述させる方法がある.
      • (例1) TIMING:synchronous, 予定の変更に同期して送信
      • (例2) TIMING:midnight, 深夜2時に一日の予定を送信