Skip to content

Commit 786d3bd

Browse files
committed
copilot: foodies サービスで pagination が必要な API はサポートして
1 parent f38be57 commit 786d3bd

File tree

2 files changed

+17
-12
lines changed

2 files changed

+17
-12
lines changed

template_fastapi/repositories/restaurants.py

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -138,16 +138,17 @@ def delete_restaurant(self, restaurant_id: str) -> None:
138138
"""指定されたIDのレストランを削除する"""
139139
self.container.delete_item(item=restaurant_id, partition_key=restaurant_id)
140140

141-
def search_restaurants(self, query: str, k: int = 3) -> list[Restaurant]:
142-
"""キーワードによるレストランのベクトル検索を実行する"""
141+
def search_restaurants(self, query: str, k: int = 3, offset: int = 0) -> list[Restaurant]:
142+
"""キーワードによるレストランのベクトル検索を実行する(ページネーション対応)"""
143143
# クエリテキストのベクトル埋め込みを生成
144144
query_embedding = self._get_embeddings(query)
145145

146-
# ベクトル検索クエリの実行
146+
# ベクトル検索クエリの実行(オフセットとリミットを適用)
147147
query_text = f"""
148-
SELECT TOP {k} *
148+
SELECT *
149149
FROM c
150150
ORDER BY VectorDistance(c.vector, @queryVector)
151+
OFFSET {offset} LIMIT {k}
151152
"""
152153

153154
parameters = [{"name": "@queryVector", "value": query_embedding}]
@@ -157,18 +158,19 @@ def search_restaurants(self, query: str, k: int = 3) -> list[Restaurant]:
157158
return [self._cosmos_item_to_restaurant(item) for item in items]
158159

159160
def find_nearby_restaurants(
160-
self, latitude: float, longitude: float, distance_km: float = 5.0, limit: int = 10
161+
self, latitude: float, longitude: float, distance_km: float = 5.0, limit: int = 10, offset: int = 0
161162
) -> list[Restaurant]:
162-
"""指定した位置の近くにあるレストランを検索する"""
163+
"""指定した位置の近くにあるレストランを検索する(ページネーション対応)"""
163164
# 地理空間クエリの実行(メートル単位で距離を指定)
164165
distance_meters = distance_km * 1000
165166
query_text = f"""
166-
SELECT TOP {limit} *
167+
SELECT *
167168
FROM c
168169
WHERE ST_DISTANCE(c.location, {{
169170
"type": "Point",
170171
"coordinates": [{longitude}, {latitude}]
171172
}}) < {distance_meters}
173+
OFFSET {offset} LIMIT {limit}
172174
"""
173175

174176
items = list(self.container.query_items(query=query_text, enable_cross_partition_query=True))

template_fastapi/routers/foodies.py

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -104,13 +104,15 @@ async def delete_foodies_restaurant(restaurant_id: str) -> dict:
104104
operation_id="search_foodies_restaurants",
105105
)
106106
async def search_foodies_restaurants(
107-
query: str, k: int = Query(3, description="取得する上位結果の数")
107+
query: str,
108+
k: int = Query(3, description="取得する上位結果の数"),
109+
offset: int = Query(0, description="スキップする件数(ページネーション用)"),
108110
) -> list[Restaurant]:
109111
"""
110-
キーワードによるレストランのベクトル検索を実行する
112+
キーワードによるレストランのベクトル検索を実行する(ページネーション対応)
111113
"""
112114
try:
113-
return restaurant_repo.search_restaurants(query, k)
115+
return restaurant_repo.search_restaurants(query, k, offset)
114116
except Exception as e:
115117
raise HTTPException(status_code=500, detail=f"検索に失敗しました: {str(e)}")
116118

@@ -126,11 +128,12 @@ async def find_nearby_restaurants(
126128
longitude: float = Query(..., description="経度"),
127129
distance_km: float = Query(5.0, description="検索半径(キロメートル)"),
128130
limit: int = Query(10, description="取得する最大件数"),
131+
offset: int = Query(0, description="スキップする件数(ページネーション用)"),
129132
) -> list[Restaurant]:
130133
"""
131-
指定した位置の近くにあるレストランを検索する
134+
指定した位置の近くにあるレストランを検索する(ページネーション対応)
132135
"""
133136
try:
134-
return restaurant_repo.find_nearby_restaurants(latitude, longitude, distance_km, limit)
137+
return restaurant_repo.find_nearby_restaurants(latitude, longitude, distance_km, limit, offset)
135138
except Exception as e:
136139
raise HTTPException(status_code=500, detail=f"位置検索に失敗しました: {str(e)}")

0 commit comments

Comments
 (0)