|
2 | 2 | from typing import List, Union, TypeVar, Optional |
3 | 3 |
|
4 | 4 | from sqlalchemy import or_ |
5 | | -from sqlalchemy import select |
6 | | -from sqlalchemy.orm import joinedload, contains_eager, selectinload, Session |
| 5 | +from sqlalchemy.orm import contains_eager, selectinload, Session |
7 | 6 | from sqlalchemy.orm.query import Query |
8 | 7 |
|
9 | 8 | from feeds.impl.datasets_api_impl import DatasetsApiImpl |
10 | 9 | from feeds.impl.error_handling import raise_http_error, raise_http_validation_error, convert_exception |
11 | | -from shared.db_models.entity_type_enum import EntityType |
12 | 10 | from shared.db_models.feed_impl import FeedImpl |
13 | 11 | from shared.db_models.gbfs_feed_impl import GbfsFeedImpl |
14 | 12 | from shared.db_models.gtfs_feed_impl import GtfsFeedImpl |
|
23 | 21 | from shared.common.db_utils import ( |
24 | 22 | get_gtfs_feeds_query, |
25 | 23 | get_gtfs_rt_feeds_query, |
26 | | - get_joinedload_options, |
| 24 | + get_selectinload_options, |
27 | 25 | add_official_filter, |
28 | 26 | get_gbfs_feeds_query, |
29 | 27 | ) |
|
41 | 39 | Gtfsdataset, |
42 | 40 | Gtfsfeed, |
43 | 41 | Gtfsrealtimefeed, |
44 | | - Location, |
45 | | - Entitytype, |
46 | 42 | ) |
47 | 43 | from shared.feed_filters.feed_filter import FeedFilter |
48 | 44 | from shared.feed_filters.gtfs_dataset_filter import GtfsDatasetFilter |
49 | | -from shared.feed_filters.gtfs_feed_filter import LocationFilter |
50 | | -from shared.feed_filters.gtfs_rt_feed_filter import GtfsRtFeedFilter, EntityTypeFilter |
| 45 | +from shared.feed_filters.gtfs_rt_feed_filter import GtfsRtFeedFilter |
51 | 46 | from utils.date_utils import valid_iso_date |
52 | 47 | from utils.logger import get_logger |
53 | 48 |
|
@@ -120,7 +115,7 @@ def get_feeds( |
120 | 115 | # Results are sorted by provider |
121 | 116 | feed_query = feed_query.order_by(FeedOrm.provider, FeedOrm.stable_id) |
122 | 117 | # Ensure license relationship is available to the model conversion without extra queries |
123 | | - feed_query = feed_query.options(*get_joinedload_options(), selectinload(FeedOrm.license)) |
| 118 | + feed_query = feed_query.options(*get_selectinload_options(), selectinload(FeedOrm.license)) |
124 | 119 | if limit is not None: |
125 | 120 | feed_query = feed_query.limit(limit) |
126 | 121 | if offset is not None: |
@@ -251,11 +246,10 @@ def get_gtfs_rt_feed(self, id: str, db_session: Session) -> GtfsRTFeed: |
251 | 246 | not is_user_email_restricted(), # Allow all feeds to be returned if the user is not restricted |
252 | 247 | ) |
253 | 248 | ) |
254 | | - .outerjoin(Location, Gtfsrealtimefeed.locations) |
255 | 249 | .options( |
256 | | - joinedload(Gtfsrealtimefeed.entitytypes), |
257 | | - joinedload(Gtfsrealtimefeed.gtfs_feeds), |
258 | | - *get_joinedload_options(), |
| 250 | + selectinload(Gtfsrealtimefeed.entitytypes), |
| 251 | + selectinload(Gtfsrealtimefeed.gtfs_feeds), |
| 252 | + *get_selectinload_options(), |
259 | 253 | ) |
260 | 254 | ).all() |
261 | 255 |
|
@@ -299,61 +293,11 @@ def get_gtfs_rt_feeds( |
299 | 293 |
|
300 | 294 | return self._get_response(feed_query, GtfsRTFeedImpl) |
301 | 295 |
|
302 | | - entity_types_list = entity_types.split(",") if entity_types else None |
303 | | - |
304 | | - # Validate entity types using the EntityType enum |
305 | | - if entity_types_list: |
306 | | - try: |
307 | | - entity_types_list = [EntityType(et.strip()).value for et in entity_types_list] |
308 | | - except ValueError: |
309 | | - raise_http_validation_error( |
310 | | - "Entity types must be the value 'vp,' 'sa,' or 'tu,'. " |
311 | | - "When provided a list values must be separated by commas." |
312 | | - ) |
313 | | - |
314 | | - gtfs_rt_feed_filter = GtfsRtFeedFilter( |
315 | | - stable_id=None, |
316 | | - provider__ilike=provider, |
317 | | - producer_url__ilike=producer_url, |
318 | | - entity_types=EntityTypeFilter(name__in=entity_types_list), |
319 | | - location=LocationFilter( |
320 | | - country_code=country_code, |
321 | | - subdivision_name__ilike=subdivision_name, |
322 | | - municipality__ilike=municipality, |
323 | | - ), |
324 | | - ) |
325 | | - subquery = gtfs_rt_feed_filter.filter( |
326 | | - select(Gtfsrealtimefeed.id) |
327 | | - .join(Location, Gtfsrealtimefeed.locations) |
328 | | - .join(Entitytype, Gtfsrealtimefeed.entitytypes) |
329 | | - ).subquery() |
330 | | - feed_query = ( |
331 | | - db_session.query(Gtfsrealtimefeed) |
332 | | - .filter(Gtfsrealtimefeed.id.in_(subquery)) |
333 | | - .filter( |
334 | | - or_( |
335 | | - Gtfsrealtimefeed.operational_status == "published", |
336 | | - not is_user_email_restricted(), # Allow all feeds to be returned if the user is not restricted |
337 | | - ) |
338 | | - ) |
339 | | - .options( |
340 | | - joinedload(Gtfsrealtimefeed.entitytypes), |
341 | | - joinedload(Gtfsrealtimefeed.gtfs_feeds), |
342 | | - *get_joinedload_options(), |
343 | | - ) |
344 | | - .order_by(Gtfsrealtimefeed.provider, Gtfsrealtimefeed.stable_id) |
345 | | - ) |
346 | | - feed_query = add_official_filter(feed_query, is_official) |
347 | | - |
348 | | - feed_query = feed_query.limit(limit).offset(offset) |
349 | | - return self._get_response(feed_query, GtfsRTFeedImpl) |
350 | | - |
351 | 296 | @staticmethod |
352 | 297 | def _get_response(feed_query: Query, impl_cls: type[T]) -> List[T]: |
353 | 298 | """Get the response for the feed query.""" |
354 | 299 | results = feed_query.all() |
355 | | - response = [impl_cls.from_orm(feed) for feed in results] |
356 | | - return list({feed.id: feed for feed in response}.values()) |
| 300 | + return [impl_cls.from_orm(feed) for feed in results] |
357 | 301 |
|
358 | 302 | @with_db_session |
359 | 303 | def get_gtfs_feed_gtfs_rt_feeds(self, id: str, db_session: Session) -> List[GtfsRTFeed]: |
|
0 commit comments