【Go】firestoreのqueryをoption引数にする方法

0

2022年04月16日 7:15

こんにちは、ISSUEの寒河江です。

今回はfirestore×Golangを利用した場合のクエリオプションの設定方法についてご紹介します。firestoreのquery option引数というのは、LimitOrderByStartAfterなどfirestoreで提供されているqueryをオプションとしてまとめて実行クエリ関数の引数として渡すことを指しています。

利用しているライブラリ

firestoreにクエリを実行するGoのクライアントライブラリ
https://github.com/googleapis/google-cloud-go

最初に実装方法の結論を言うと下記になります。

結論

  • firestoreのクエリをラッピングする
  • Functional Options Patternを利用する
  • クエリ実行前に、オプションを適用するApplyQueryを実行する

クエリのを実行する関数
img

firestoreのquery optionを実装した背景

元々、LimitやStartAfterはページネーション用に頻繁に利用していました。ただ、その度にmodelやinteractor用のinput(クリーンアーキテクチャを採用しています)などにoption用のstructを定義して引き回すのは冗長だなと感じていました。そこでオブションの定義をfirestoreパッケージに統一することにしました。

では、詳細な実装の流れをみていきます!

firestoreのクエリをラッピングする

まずはfirestoreのラッパーを作成します。package名はfirestoreとします。
ちなみにFunctional Options Patternについてはこちらの記事でも触れているので先に読まれた方がわかりやすいかもしれません。

img

Functional Options Patternを利用する

続いて、クエリをオプションで追加できるようにオプションを定義します。オプションには安全性、他のクエリオプションも増えていくことを見据えた拡張性、設定のしやすさからFunctional Options Patternを使いました。また、LimitとStartAfterをクエリとして追加しています。
img
他のクエリ、例えばOffsetなどを追加したい場合でも同様にオプション設定関数を定義するだけになります。
img

ApplyQueryの追加

上記のクエリオプションを実際のfirestoreのクエリに適用する関数を定義します。

img

クエリ実行前に、オプションを適用するApplyQueryを実行する

準備は整いました!それではクエリオプションを使って、クエリを叩いてみます。

interactorからクエリの実行関数であるrepository.ListにFunctional Options Patternでオプションを渡します。
img

img
こちらでしっかりオプションの内容が適用されたクエリが実行されます。

オプションを指定しない場合

もちろん、オプションを指定しないクエリも書くことができます。下記はオプションを指定しないケースになります。主にinteractorの変更になります。
img

以上、firestoreのクエリオプションを設定についてです!
もっといい形があればさらに改良していこうと思います。

# Go
# Firestore
0

診断を受けるとあなたの現在の業務委託単価を算出します。今後副業やフリーランスで単価を交渉する際の参考になります。また次の単価レンジに到達するためのヒントも確認できます。

目次を見る