Skip to content

Commit 380430d

Browse files
authored
fix: is_official filter and add SQL indexes (#1051)
1 parent 9840926 commit 380430d

File tree

4 files changed

+45
-14
lines changed

4 files changed

+45
-14
lines changed

api/src/feeds/impl/feeds_api_impl.py

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -131,13 +131,14 @@ def get_gtfs_feed(self, id: str, db_session: Session) -> GtfsFeed:
131131
else:
132132
raise_http_error(404, gtfs_feed_not_found.format(id))
133133

134-
@staticmethod
135134
def _get_gtfs_feed(
136-
stable_id: str, db_session: Session, include_options_for_joinedload: bool = True
135+
self, stable_id: str, db_session: Session, include_options_for_joinedload: bool = True
137136
) -> Optional[Gtfsfeed]:
138-
results = get_gtfs_feeds_query(
137+
query = get_gtfs_feeds_query(
139138
db_session=db_session, stable_id=stable_id, include_options_for_joinedload=include_options_for_joinedload
140-
).all()
139+
)
140+
self.logger.debug("Query: %s", str(query.statement.compile(compile_kwargs={"literal_binds": True})))
141+
results = query.all()
141142
if len(results) == 0:
142143
return None
143144
return results[0]

api/src/shared/common/db_utils.py

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ def get_gtfs_feeds_query(
3737
dataset_latitudes: str | None = None,
3838
dataset_longitudes: str | None = None,
3939
bounding_filter_method: str | None = None,
40-
is_official: bool = False,
40+
is_official: bool | None = None,
4141
published_only: bool = True,
4242
include_options_for_joinedload: bool = True,
4343
) -> Query[any]:
@@ -46,35 +46,42 @@ def get_gtfs_feeds_query(
4646
stable_id=stable_id,
4747
provider__ilike=provider,
4848
producer_url__ilike=producer_url,
49-
location=LocationFilter(
50-
country_code=country_code,
51-
subdivision_name__ilike=subdivision_name,
52-
municipality__ilike=municipality,
53-
),
49+
location=None,
5450
)
5551

56-
subquery = gtfs_feed_filter.filter(select(Gtfsfeed.id).join(Location, Gtfsfeed.locations))
52+
subquery = gtfs_feed_filter.filter(select(Gtfsfeed.id))
5753
subquery = apply_bounding_filtering(
5854
subquery, dataset_latitudes, dataset_longitudes, bounding_filter_method
5955
).subquery()
60-
6156
feed_query = (
6257
db_session.query(Gtfsfeed)
6358
.outerjoin(Gtfsfeed.gtfsdatasets)
6459
.filter(Gtfsfeed.id.in_(subquery))
65-
.filter((Gtfsdataset.latest) | (Gtfsdataset.id == None)) # noqa: E711
60+
.filter(or_(Gtfsdataset.latest, Gtfsdataset.id == None)) # noqa: E711
6661
)
62+
63+
if country_code or subdivision_name or municipality:
64+
location_filter = LocationFilter(
65+
country_code=country_code,
66+
subdivision_name__ilike=subdivision_name,
67+
municipality__ilike=municipality,
68+
)
69+
location_subquery = location_filter.filter(select(Location.id))
70+
feed_query = feed_query.filter(Gtfsfeed.locations.any(Location.id.in_(location_subquery)))
71+
6772
if published_only:
6873
feed_query = feed_query.filter(Gtfsfeed.operational_status == "published")
6974

75+
feed_query = add_official_filter(feed_query, is_official)
76+
7077
if include_options_for_joinedload:
7178
feed_query = feed_query.options(
7279
contains_eager(Gtfsfeed.gtfsdatasets)
7380
.joinedload(Gtfsdataset.validation_reports)
7481
.joinedload(Validationreport.notices),
7582
*get_joinedload_options(),
7683
).order_by(Gtfsfeed.provider, Gtfsfeed.stable_id)
77-
feed_query = add_official_filter(feed_query, is_official)
84+
7885
feed_query = feed_query.limit(limit).offset(offset)
7986
return feed_query
8087

liquibase/changelog.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,5 @@
4242
<include file="changes/feat_927_2.sql" relativeToChangelogFile="true"/>
4343
<include file="changes/feat_966.sql" relativeToChangelogFile="true"/>
4444
<include file="changes/feat_946.sql" relativeToChangelogFile="true"/>
45+
<include file="changes/add_idxs.sql" relativeToChangelogFile="true"/>
4546
</databaseChangeLog>

liquibase/changes/add_idxs.sql

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
-- Feed
2+
CREATE INDEX idx_feed_id ON Feed(id);
3+
CREATE INDEX idx_feed_status ON Feed(status);
4+
CREATE INDEX idx_feed_provider_stable_id ON Feed(provider, stable_id);
5+
6+
-- GTFSDataset
7+
CREATE INDEX idx_gtfsdataset_feed_id ON GTFSDataset(feed_id);
8+
CREATE INDEX idx_gtfsdataset_latest ON GTFSDataset(latest);
9+
10+
-- LocationFeed
11+
CREATE INDEX idx_locationfeed_feed_id ON LocationFeed(feed_id);
12+
CREATE INDEX idx_locationfeed_location_id ON LocationFeed(location_id);
13+
14+
-- ValidationReport
15+
CREATE INDEX idx_validationreport_validator_version ON ValidationReport(validator_version);
16+
17+
-- ValidationReportGTFSDataset
18+
CREATE INDEX idx_vrgtfsdataset_dataset_id ON ValidationReportGTFSDataset(dataset_id);
19+
CREATE INDEX idx_vrgtfsdataset_report_id ON ValidationReportGTFSDataset(validation_report_id);
20+
21+
22+

0 commit comments

Comments
 (0)