filter_does_not_equal: NotionRubyMapping 解説 (56)

はじめに

NotionRubyMapping 解説の第56回目です。今日は昨日と反対で等価でないことを確認する filter_does_not_equal をそれぞれのプロパティで確認してみます。まず、以前使っていたデータベースを取得します。

parent

irb(main):002> db = Database.find "https://www.notion.so/hkob/cad035c49e5346e783
31cb5d05cbc754?v=a03e96ed79ad4d35808e7a08583396a0&pvs=4"
=> NotionRubyMapping::Database-cad035c49e5346e78331cb5d05cbc754

query_database のみ

まず何もフィルタをかけないデータベースの検索で件数が3件になることを確認します。

irb(main):003> db.query_database.count
=> 3

ここから各プロパティに対して、filter_does_not_equal でチェックがついていないものだけを抽出するフィルタリングをしてみます。最初は CheckboxProperty です。New title のページだけチェックがついているので、2件となっています。

irb(main):004> dps = db.properties
=> PropertyCache
irb(main):005> db.query_database(dps["Check box"].filter_does_not_equal true).count
=> 2

ほとんどのプロパティは単に一致を確認するだけなので、一気に実行してみます。

irb(main):006> db.query_database(dps["Email"].filter_does_not_equal "abc@example.com").count
=> 2
irb(main):007> db.query_database(dps["Number"].filter_does_not_equal 3.14159).count
=> 2
irb(main):008> db.query_database(dps["PhoneNumber"].filter_does_not_equal "080-XXXX-YYYY").count
=> 2
irb(main):009> db.query_database(dps["RichText"].filter_does_not_equal "Sample text").count
=> 2
irb(main):010> db.query_database(dps["Select"].filter_does_not_equal "Fukuoka").count
=> 2
irb(main):011> db.query_database(dps["Url"].filter_does_not_equal "https://hkob.notion.site").count
=> 2
irb(main):012> db.query_database(dps["Status"].filter_does_not_equal "完了").count
=> 2

日付の一致

今回、Date は以下のように設定されています。ここで時間を含まない 4月3日で検索してみます。時間での検索はタイムゾーン情報があるのですが、日付はタイムゾーンの情報がなくUTCのタイムゾーンにおける日付の比較になってしまいます。

DateProperty

そこで、NotionRubyMapping では以下のような payload を作成しています。日付の比較の際に JST の 0:00 より前か 23:59 より後のどちらか範囲に入っているものを検索するということです。

irb(main):013> print db.query_database(dps["Date"].filter_does_not_equal(Date.new(2024, 4, 3)), dry_run: true)
#!/bin/sh
curl -X POST 'https://api.notion.com/v1/databases/cad035c49e5346e78331cb5d05cbc754/query' \
  -H 'Notion-Version: 2022-06-28' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Content-Type: application/json' \
  --data '{"filter":{"or":[{"property":"Date","date":{"before":"2024-04-03T00:00:00+09:00"}},{"property":"Date","date":{"after":"2024-04-03T23:59:59+09:00"}}]},"page_size":100}'=> nil

今回は、日付が等しいものか入っていないものだけだったので、0件になっていました。ダミーデータを入れておけばよかったですね。

irb(main):014> db.query_database(dps["Date"].filter_does_not_equal Date.new(2024, 4, 3)).count
=> 0

おわりに

今日は、一致しないものを抽出するときに利用する filter_does_not_equal を解説しました。Date に対する filter_does_not_equal だけは内部で範囲外の比較に変換する処理をしています。

CheckboxProperty のマニュアルはこちらです。その他のプロパティもここから見てください。

CheckboxProperty

NotionRubyMapping解説