Cloud Firestoreで利用されるコードを自動生成する。
リリースからバイナリを落としてきて使用する事をオススメする。
go installでも可能↓
$ go install github.com/go-generalize/volcago/cmd/volcago@latest
package task
import (
"time"
)
//go:generate volcago Task
type Task struct {
ID string `firestore:"-" firestore_key:""`
Desc string `firestore:"description" indexer:"suffix,like" unique:""`
Done bool `firestore:"done" indexer:"equal"`
Count int `firestore:"count"`
Created time.Time `firestore:"created"`
Indexes map[string]bool `firestore:"indexes"`
}
//go:generate
から始まる行を書くことでfirestore向けのモデルを自動生成するようになる。
SubCollectionで利用される場合は -sub-collection
という引数を追加する。
Meta情報(CreatedAtや楽観排他ロックで使用するVersionなど)を併用したい場合は
-disable-meta
を引数で渡すことで無効化できる。
Meta構造体のフォーマットは↓
type Meta struct {
CreatedAt time.Time
CreatedBy string
UpdatedAt time.Time
UpdatedBy string
DeletedAt *time.Time
DeletedBy string
Version int
}
また、structの中で一つの要素は必ず firestore_key:""
を持った要素が必要となっている。
この要素の型は string
である必要がある。
firestore_key:"auto"
とすることによりIDが自動生成される。
この状態でgo generate
を実行すると接尾辞が _gen.go
のファイルにモデルが生成される。
$ go generate
unique
というタグがあるとUniqueという別コレクションにユニーク制約用のドキュメントが生成される。
電話番号やメールアドレスなど重複を許容したくない場合に使用する。
この要素の型は string
である必要がある。
Indexes
(map[string]bool型) というフィールドがあると xim を使用したn-gram検索ができるようになる
対応している検索は、接頭辞/接尾辞/部分一致/完全一致(タグ: prefix/suffix/like/equal)
xim ではUnigram/Bigramしか採用していないため、ノイズが発生しやすい(例: 東京都が京都で検索するとヒットするなど)
Task.Desc = "Hello, World!".
- 部分一致検索
param := &model.TaskSearchParam{
Desc: model.NewQueryChainer().Filters("o, Wor", model.FilterTypeAddBiunigrams),
}
tasks, err := taskRepo.Search(ctx, param, nil)
if err != nil {
// error handling
}
- 接頭辞一致検索
param := &model.TaskSearchParam{
Desc: model.NewQueryChainer().Filters("Hell", model.FilterTypeAddPrefix),
}
tasks, err := taskRepo.Search(ctx, param, nil)
if err != nil {
// error handling
}
- 接尾辞一致検索
param := &model.TaskSearchParam{
Desc: model.NewQueryChainer().Filters("orld!", model.FilterTypeAddSuffix),
}
tasks, err := taskRepo.Search(ctx, param, nil)
if err != nil {
// error handling
}
- 完全一致検索
chainer := model.NewQueryChainer
param := &model.TaskSearchParam{
Desc: chainer().Filters("Hello, World!", model.FilterTypeAdd),
Done: chainer().Filters(true, model.FilterTypeAddSomething), // 文字列以外の時はAddSomethingを使用する
}
tasks, err := taskRepo.Search(ctx, param, nil)
if err != nil {
// error handling
}
query_builder_gen.go
というクエリビルダー用のコードも生成される。
qb := model.NewQueryBuilder(taskRepo.GetCollection())
qb.GreaterThan("count", 3)
qb.LessThan("count", 8)
tasks, err := taskRepo.Search(ctx, nil, qb.Query())
if err != nil {
// error handling
}
StrictUpdateという関数を使用する。
これを使用することにより、firestore.Incrementなども使用することができる。
ユニーク制約するフィールドは利用できない。
param := &model.TaskUpdateParam{
Done: false,
Created: firestore.ServerTimestamp,
Count: firestore.Increment(1),
}
if err = taskRepo.StrictUpdate(ctx, id, param); err != nil {
// error handling
}
- Under the MIT License
- Copyright (C) 2021 go-generalize