はじめに
NotionRubyMapping 解説の第55回目です。今日は等価であることを確認するはに filter_equals をそれぞれのプロパティで確認してみます。まず、以前使っていたデータベースを取得します。
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_equals
ここから各プロパティに対して、filter_equals でフィルタリングをしてみます。最初は CheckboxProperty です。New title のページだけチェックがついているので、1件のみになっています。
irb(main):007> dps = db.properties => PropertyCache irb(main):008> db.query_database(dps["Check box"].filter_equals true).count => 1
ほとんどのプロパティは単に一致を確認するだけなので、一気に実行してみます。
irb(main):009> db.query_database(dps["Email"].filter_equals "abc@example.com").count => 1 irb(main):010> db.query_database(dps["Number"].filter_equals 3.14159).count => 1 irb(main):011> db.query_database(dps["PhoneNumber"].filter_equals "080-XXXX-YYYY").count => 1 irb(main):012> db.query_database(dps["RichText"].filter_equals "Sample text").co unt => 1 irb(main):013> db.query_database(dps["Select"].filter_equals "Fukuoka").count => 1 irb(main):014> db.query_database(dps["Url"].filter_equals "https://hkob.notion.site").count => 1 irb(main):015> db.query_database(dps["Status"].filter_equals "完了").count => 1
日付の一致
今回、Date は以下のように設定されています。ここで時間を含まない 4月3日で検索してみます。時間での検索はタイムゾーン情報があるのですが、日付はタイムゾーンの情報がなくUTCのタイムゾーンにおける日付の比較になってしまいます。
そこで、NotionRubyMapping では以下のような payload を作成しています。日付の比較の際に JST の 0:00 から 23:59 までの範囲に入っているものを検索するということです。
irb(main):022> print db.query_database(dps["Date"].filter_equals(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":{"and":[{"property":"Date","date":{"after":"2024-04-03T00:00:00+09:00"}},{"property":"Date","date":{"before":"2024-04-03T23:59:59+09:00"}}]},"page_size":100}'=> nil
実際に検索してみると以下のように正しく取得できています。
irb(main):023> db.query_database(dps["Date"].filter_equals Date.new(2024, 4, 3)).count => 1
おわりに
今日は、一致で比較する filter_equals を解説しました。Date に対する filter_equals だけは内部で範囲の比較に変換する処理をしています。
CheckboxProperty のマニュアルはこちらです。その他のプロパティもここから見てください。