🐥

supabase + GraphQL の String 検索で like を使えるようにする

2022/04/25に公開

supabase はそのままだと GraphQL の filter で like が使えない

RestAPI には存在しているのですが、GraphQL には like 演算子が存在していません。そのままだと無理です。

機能を追加する

無いものは仕方がないので作ります。
以下の SQL を実行すると GraphQL のスキーマに like が出現します。

create or replace function graphql.text_to_comparison_op(text)
    returns graphql.comparison_op
    language sql
    immutable
    as
$$
    select
        case $1
            when 'eq' then '='
            when 'lt' then '<'
            when 'lte' then '<='
            when 'neq' then '<>'
            when 'gte' then '>='
            when 'gt' then '>'
            when 'like' then 'like'
            else graphql.exception('Invalid comaprison operator')
        end::graphql.comparison_op
$$;


insert into graphql._field(parent_type_id, type_id, constant_name, is_not_null, is_array, description)
    select
        gt.id as parent_type_id,
        gt.graphql_type_id type_id,
        ops.constant_name as constant_name,
        false,
        false,
        null::text as description
    from
        graphql.type gt
        join (
            values
                ('like')
        ) ops(constant_name)
            on true
    where
        gt.meta_kind = 'FilterType'
        and gt.graphql_type_id = graphql.type_id('String');

alter type graphql.comparison_op add value 'like';

ApolloStudio でスキーマの確認

以下、きちんと追加されています

まとめ

supabase で GraphQL を使っている人は少なそうですが、困っている同士の助けになれば幸いです。

GitHubで編集を提案

Discussion