|
|
@@ -244,6 +244,56 @@ func (r *PlaceRepo) GetFeatures(ctx context.Context, placeID string) ([]models.F
|
|
|
return features, nil
|
|
|
}
|
|
|
|
|
|
+func (r *PlaceRepo) GetTagsBatch(ctx context.Context, placeIDs []string) (map[string][]models.Tag, error) {
|
|
|
+ if len(placeIDs) == 0 {
|
|
|
+ return map[string][]models.Tag{}, nil
|
|
|
+ }
|
|
|
+ rows, err := r.pool.Query(ctx,
|
|
|
+ `SELECT pt.place_id, t.id, t.name, t.category FROM tags t
|
|
|
+ JOIN place_tags pt ON pt.tag_id = t.id
|
|
|
+ WHERE pt.place_id = ANY($1)`, placeIDs)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ defer rows.Close()
|
|
|
+
|
|
|
+ result := make(map[string][]models.Tag)
|
|
|
+ for rows.Next() {
|
|
|
+ var placeID string
|
|
|
+ var t models.Tag
|
|
|
+ if err := rows.Scan(&placeID, &t.ID, &t.Name, &t.Category); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ result[placeID] = append(result[placeID], t)
|
|
|
+ }
|
|
|
+ return result, nil
|
|
|
+}
|
|
|
+
|
|
|
+func (r *PlaceRepo) GetFeaturesBatch(ctx context.Context, placeIDs []string) (map[string][]models.Feature, error) {
|
|
|
+ if len(placeIDs) == 0 {
|
|
|
+ return map[string][]models.Feature{}, nil
|
|
|
+ }
|
|
|
+ rows, err := r.pool.Query(ctx,
|
|
|
+ `SELECT pf.place_id, f.id, f.name, f.category, f.icon FROM features f
|
|
|
+ JOIN place_features pf ON pf.feature_id = f.id
|
|
|
+ WHERE pf.place_id = ANY($1)`, placeIDs)
|
|
|
+ if err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ defer rows.Close()
|
|
|
+
|
|
|
+ result := make(map[string][]models.Feature)
|
|
|
+ for rows.Next() {
|
|
|
+ var placeID string
|
|
|
+ var f models.Feature
|
|
|
+ if err := rows.Scan(&placeID, &f.ID, &f.Name, &f.Category, &f.Icon); err != nil {
|
|
|
+ return nil, err
|
|
|
+ }
|
|
|
+ result[placeID] = append(result[placeID], f)
|
|
|
+ }
|
|
|
+ return result, nil
|
|
|
+}
|
|
|
+
|
|
|
func scanPlace(row interface{ Scan(dest ...any) error }) (*models.Place, error) {
|
|
|
var p models.Place
|
|
|
err := row.Scan(
|