Skip to content

Commit f5d856e

Browse files
committed
fix circular FK between feed and gtfsdataset
1 parent 1177beb commit f5d856e

File tree

4 files changed

+22
-24
lines changed

4 files changed

+22
-24
lines changed

functions-python/reverse_geolocation/src/reverse_geolocation_processor.py

Lines changed: 9 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
Osmlocationgroup,
3434
Gtfsdataset,
3535
Gtfsfeed,
36+
Gbfsfeed,
3637
)
3738
from shared.dataset_service.dataset_service_commons import Status
3839

@@ -141,7 +142,7 @@ def create_geojson_aggregate(
141142
bounding_box: shapely.Polygon,
142143
data_type: str,
143144
logger,
144-
feed: Feed,
145+
feed: Gtfsfeed | Gbfsfeed,
145146
gtfs_dataset: Gtfsdataset = None,
146147
extraction_urls: List[str] = None,
147148
public: bool = True,
@@ -345,30 +346,15 @@ def reverse_geolocation_process(
345346
# Update the bounding box of the dataset
346347
if dataset_id:
347348
gtfs_dataset = load_dataset(dataset_id, db_session)
348-
feed = gtfs_dataset.feed
349-
if not feed:
350-
feed = (
351-
db_session.query(Feed).filter(Feed.stable_id == stable_id).one_or_none()
352-
)
353-
if not feed:
354-
no_feed_message = f"No feed found for stable ID {stable_id}."
355-
logger.warning(no_feed_message)
356-
record_execution_trace(
357-
execution_id=execution_id,
358-
stable_id=stable_id,
359-
status=Status.FAILED,
360-
logger=logger,
361-
dataset_file=None,
362-
error_message=no_feed_message,
363-
)
364-
return no_feed_message, ERROR_STATUS_CODE
349+
feed = load_feed(stable_id, data_type, logger, db_session)
365350

366351
bounding_box = update_dataset_bounding_box(gtfs_dataset, stops_df, db_session)
367352

368353
location_groups = reverse_geolocation(
369354
strategy=strategy,
370355
stable_id=stable_id,
371356
stops_df=stops_df,
357+
data_type=data_type,
372358
logger=logger,
373359
use_cache=use_cache,
374360
db_session=db_session,
@@ -447,6 +433,7 @@ def reverse_geolocation(
447433
strategy,
448434
stable_id,
449435
stops_df,
436+
data_type,
450437
logger,
451438
use_cache,
452439
db_session: Session = None,
@@ -456,7 +443,7 @@ def reverse_geolocation(
456443
"""
457444
logger.info("Processing geopolygons with strategy: %s.", strategy)
458445

459-
feed = load_feed(stable_id, logger, db_session)
446+
feed = load_feed(stable_id, data_type, logger, db_session)
460447

461448
# Get Geopolygons with Geometry and cached location groups
462449
cache_location_groups, unmatched_stops_df = get_geopolygons_with_geometry(
@@ -495,9 +482,10 @@ def reverse_geolocation(
495482
return cache_location_groups
496483

497484

498-
def load_feed(stable_id, logger, db_session):
485+
def load_feed(stable_id, data_type, logger, db_session) -> Gtfsfeed | Gbfsfeed:
486+
"""Load feed from the database using the stable ID and data type."""
499487
feed = (
500-
db_session.query(Feed)
488+
db_session.query(Gbfsfeed if data_type == "gbfs" else Gtfsfeed)
501489
.options(joinedload(Feed.feedlocationgrouppoints))
502490
.filter(Feed.stable_id == stable_id)
503491
.one_or_none()

functions-python/reverse_geolocation/tests/test_reverse_geolocation_processor.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -451,10 +451,12 @@ def test_update_dataset_bounding_box_exception(self, db_session):
451451
@patch("reverse_geolocation_processor.check_maximum_executions")
452452
@patch("reverse_geolocation_processor.get_execution_id")
453453
@patch("reverse_geolocation_processor.load_dataset")
454+
@patch("reverse_geolocation_processor.load_feed")
454455
@patch("reverse_geolocation_processor.record_execution_trace")
455456
def test_valid_request(
456457
self,
457458
_,
459+
mock_load_feed,
458460
mock_load_dataset,
459461
mock_get_execution_id,
460462
mock_check_maximum_executions,
@@ -482,9 +484,10 @@ def test_valid_request(
482484
mock_update_bounding_box.return_value = MagicMock()
483485
mock_reverse_geolocation.return_value = {"group_id": MagicMock()}
484486
mock_create_geojson_aggregate.return_value = MagicMock()
487+
mock_load_feed.return_value = MagicMock()
488+
mock_load_dataset.return_value = MagicMock()
485489
# Mocking a Flask request
486490
request = MagicMock(spec=Request)
487-
488491
# Call the function
489492
response, status_code = reverse_geolocation_process(request)
490493

@@ -520,10 +523,12 @@ def test_invalid_request(self, mock_parse_request_parameters):
520523
@patch("reverse_geolocation_processor.check_maximum_executions")
521524
@patch("reverse_geolocation_processor.get_execution_id")
522525
@patch("reverse_geolocation_processor.load_dataset")
526+
@patch("reverse_geolocation_processor.load_feed")
523527
@patch("reverse_geolocation_processor.record_execution_trace")
524528
def test_exception_handling(
525529
self,
526530
_,
531+
mock_load_feed,
527532
mock_load_dataset,
528533
mock_check_get_execution_id,
529534
mock_check_maximum_executions,
@@ -549,6 +554,7 @@ def test_exception_handling(
549554
1,
550555
)
551556
mock_load_dataset.return_value = MagicMock()
557+
mock_load_feed.return_value = MagicMock()
552558
mock_update_bounding_box.side_effect = Exception("Unexpected error")
553559

554560
# Mocking a Flask request
@@ -632,6 +638,7 @@ def test_valid_per_point_strategy(
632638
stable_id="test_stable_id",
633639
stops_df=pd.DataFrame({"stop_lat": [1.0], "stop_lon": [1.0]}),
634640
logger=MagicMock(),
641+
data_type="gtfs",
635642
use_cache=True,
636643
db_session=MagicMock(spec=Session),
637644
)
@@ -670,6 +677,7 @@ def test_valid_per_polygon_strategy(
670677
strategy=ReverseGeocodingStrategy.PER_POLYGON,
671678
stable_id="test_stable_id",
672679
stops_df=pd.DataFrame({"stop_lat": [1.0], "stop_lon": [1.0]}),
680+
data_type="gtfs",
673681
logger=MagicMock(),
674682
use_cache=True,
675683
db_session=MagicMock(spec=Session),
@@ -689,7 +697,7 @@ def test_invalid_strategy(
689697
from reverse_geolocation_processor import reverse_geolocation
690698

691699
id = str(uuid.uuid4())
692-
feed = Feed(
700+
feed = Gtfsfeed(
693701
id=id,
694702
stable_id=f"test_feed{id}",
695703
status="active",
@@ -705,6 +713,7 @@ def test_invalid_strategy(
705713
stable_id=f"test_feed{id}",
706714
stops_df=pd.DataFrame({"stop_lat": [1.0], "stop_lon": [1.0]}),
707715
logger=MagicMock(),
716+
data_type=feed.data_type,
708717
use_cache=True,
709718
db_session=db_session,
710719
)
@@ -724,6 +733,7 @@ def test_load_feed_missing_feed(self, db_session):
724733
strategy=ReverseGeocodingStrategy.PER_POINT,
725734
stable_id="missing_stable_id",
726735
stops_df=pd.DataFrame({"stop_lat": [1.0], "stop_lon": [1.0]}),
736+
data_type="gtfs",
727737
logger=MagicMock(),
728738
use_cache=True,
729739
db_session=db_session,

functions-python/tasks_executor/tests/tasks/geojson/test_update_geojson_files_precision.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -282,7 +282,6 @@ def test_handler_uploads_and_updates_gbfs_feed_info(self, db_session: Session):
282282
.limit(1)
283283
.first()
284284
)
285-
self.assertIsNone(reloaded_testing_feed.geolocation_file_dataset_id)
286285
self.assertIsNotNone(reloaded_testing_feed.geolocation_file_created_date)
287286

288287
@with_db_session(db_url=default_db_url)

liquibase/changelog.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,4 +68,5 @@
6868
<include file="changes/feat_1260.sql" relativeToChangelogFile="true"/>
6969
<include file="changes/feat_1333.sql" relativeToChangelogFile="true"/>
7070
<include file="changes/feat_pt_152.sql" relativeToChangelogFile="true"/>
71+
<include file="changes/feat_fix_geolocation_circular_dep.sql" relativeToChangelogFile="true"/>
7172
</databaseChangeLog>

0 commit comments

Comments
 (0)