multi value filter の確認 : hkob の雑記録 (468)

はじめに

hkob の雑記録の第468回目(連続41日目)は、Select などへの multi value フィルタについて確認します。

テストデータの作成

まず、スクリプトを作成します。equals の中が Array になっています。

curl -X POST 'https://api.notion.com/v1/data_sources/4f93db514e1d4015b07f876e34c3b0b1/query' \
  -H 'Authorization: Bearer '"$NOTION_API_KEY"'' \
  -H 'Notion-Version: 2025-09-03' \
  -H "Content-Type: application/json" \
    --data '{
    "filter": {
      "property": "SelectTitle",
      "select": {
        "equals": [
          "Select 1",
          "Select 2"
        ]
      }
    },
    "page_size": 100
  }'

make して json を取得します。

make
sh query_data_source_select_multi_values.sh > query_data_source_select_multi_values.json
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  9731    0  9572  100   159  23388    388 --:--:-- --:--:-- --:--:-- 23792
sleep 1

テストの作成

実際の API アクセスと dry_run の二通りのテストを実行しています。filter_equals の部分に Array を渡しています。

    describe "query with multivalue filter" do
      let(:target) { DataSource.new id: TestConnection::DATA_SOURCE_ID, assign: [SelectProperty, "SelectTitle"] }
      let(:sp) { target.properties["SelectTitle"] }
      let(:query) { sp.filter_equals ["Select 1", "Select 2"] }

      context "when API access" do
        let(:result) { target.query_data_source query }

        it { expect(result.count).to eq 1 }
      end

      context "when dry_run" do
        let(:dry_run) { target.query_data_source query, dry_run: true }

        it_behaves_like "dry run", :post, :query_data_source_path, use_id: true, use_query: true
      end
    end

WebMock の追加

当然、新規の Web アクセスが行われて失敗します。これに対応した WebMock を追加します。equals に配列が渡された select_multi_values キーに対応した payload を追加します。この payload により、query_data_source_select_multi_values.json の結果が mock として返却されます。

    def query_data_source
      generate_stubs_sub :post, __method__, :query_data_source_path, {
        limit_2: [DATA_SOURCE_ID, 200, {"page_size" => 2}],
        next_2: [DATA_SOURCE_ID, 200, {"start_cursor" => "6601e719-a39a-460c-908e-8909467fcccf", "page_size" => 2}],
        last_2: [DATA_SOURCE_ID, 200, {"start_cursor" => "dcdc805c-85fa-4155-a55c-20fc28771af7", "page_size" => 2}],
        filter_properties: [DATA_SOURCE_ID, 200, {"page_size" => 100}],
        select_multi_values: [DATA_SOURCE_ID, 200,
                              {
                                "filter" => {
                                  "property": "SelectTitle",
                                  "select" => {
                                    "equals": [
                                      "Select 1",
                                      "Select 2",
                                    ],
                                  },
                                },
                                "page_size": 100,
                              }],
      }
    end

テストの確認

実は、このテストは自動的に通過してしまいました。こちらのポストに書いたように filter_equals に渡す引数にはなんの制約もつけていないので、今までも配列を渡すと JSON にそのまま配列が設定されてしまうのでした。

実際に dry_run の結果はちゃんと配列になっていました。

dry_run の結果

おわりに

とりあえずテストでは確認しましたが、特に NotionRubyMapping を更新することもなく、multi value のフィルタは今でも利用可能でした。是非使ってみてください。

https://hkob.notion.site/hkob-16dd8e4e98ab807cbe3cf3cc94cdfe0f?pvs=4hkob.notion.site