|
@@ -10,6 +10,7 @@ import (
|
|
|
"github.com/jellydator/ttlcache/v3"
|
|
|
"github.com/mailru/dbr"
|
|
|
_ "github.com/mailru/go-clickhouse"
|
|
|
+ "gshopper.com/gshopify/products/cache"
|
|
|
"gshopper.com/gshopify/products/graphql/generated"
|
|
|
"gshopper.com/gshopify/products/relation"
|
|
|
"net/url"
|
|
@@ -75,6 +76,53 @@ func New(ctx context.Context, forceDebug bool) (Database, error) {
|
|
|
return r, nil
|
|
|
}
|
|
|
|
|
|
+func (db *clickhouse) Collection(ln model.LanguageCode, handle *string, id *string) (*generated.Collection, error) {
|
|
|
+ var (
|
|
|
+ clause = strings.Builder{}
|
|
|
+ vars []any
|
|
|
+ key *cache.SqlKey
|
|
|
+ loader ttlcache.LoaderFunc[string, any]
|
|
|
+ )
|
|
|
+
|
|
|
+ if id != nil {
|
|
|
+ clause.WriteString("id=?")
|
|
|
+ vars = append(vars, *id)
|
|
|
+ }
|
|
|
+
|
|
|
+ if handle != nil {
|
|
|
+ if clause.Len() > 0 {
|
|
|
+ clause.WriteString(" AND ")
|
|
|
+ }
|
|
|
+
|
|
|
+ clause.WriteString("handle=?")
|
|
|
+ vars = append(vars, *handle)
|
|
|
+ }
|
|
|
+
|
|
|
+ key = productCollectionKey(clause.String(), vars...)
|
|
|
+ loader = func(ttl *ttlcache.Cache[string, any], _ string) *ttlcache.Item[string, any] {
|
|
|
+ var o relation.ProductCollection
|
|
|
+ rows, err := db.session.
|
|
|
+ Select(productCollectionSelection(ln)...).
|
|
|
+ From(key.Table()).
|
|
|
+ Where(key.Clause(), key.Args()...).
|
|
|
+ Limit(1).
|
|
|
+ Load(&o)
|
|
|
+ if rows != 1 || err != nil {
|
|
|
+ return nil
|
|
|
+ }
|
|
|
+
|
|
|
+ return ttl.Set(key.String(), o, key.TTL())
|
|
|
+ }
|
|
|
+
|
|
|
+ p := db.cache.Get(key.String(), ttlcache.WithLoader[string, any](loader))
|
|
|
+ if p == nil {
|
|
|
+ return nil, fmt.Errorf("not found")
|
|
|
+ }
|
|
|
+
|
|
|
+ collection := p.Value().(relation.ProductCollection)
|
|
|
+ return collection.As(), nil
|
|
|
+}
|
|
|
+
|
|
|
func (db *clickhouse) Collections(ln model.LanguageCode) ([]*generated.Collection, error) {
|
|
|
var (
|
|
|
collections []*generated.Collection
|