perf(estimator): executemany batch insert in _save_yandex_history_items (Refs #826) #832

Merged
bot-reviewer merged 1 commit from feat/826-yandex-executemany into main 2026-05-30 20:07:06 +00:00
2 changed files with 16 additions and 14 deletions

View file

@ -659,8 +659,8 @@ def _save_yandex_history_items(
) )
try: try:
for row in rows: if rows:
db.execute(sql, row) db.execute(sql, rows)
db.commit() db.commit()
return len(rows) return len(rows)
except Exception as e: except Exception as e:

View file

@ -84,10 +84,11 @@ def test_save_row_contains_house_id_and_confidence():
): ):
_save_yandex_history_items(db, result) _save_yandex_history_items(db, result)
# db.execute called twice (one per item) # db.execute called once with list-of-dicts (executemany, one round-trip)
assert db.execute.call_count == 2 assert db.execute.call_count == 1
for c in db.execute.call_args_list: rows = db.execute.call_args_list[0].args[1]
row = c.args[1] assert isinstance(rows, list) and len(rows) == 2
for row in rows:
assert row["house_id"] == 54321 assert row["house_id"] == 54321
assert row["confidence"] == pytest.approx(0.9) assert row["confidence"] == pytest.approx(0.9)
assert row["notes"] == "match_method=fingerprint" assert row["notes"] == "match_method=fingerprint"
@ -117,8 +118,9 @@ def test_save_row_contains_removed_date():
): ):
_save_yandex_history_items(db, result) _save_yandex_history_items(db, result)
row = db.execute.call_args_list[0].args[1] # args[1] is now the list-of-dicts passed to executemany
assert row["removed_date"] == date(2024, 5, 20) rows = db.execute.call_args_list[0].args[1]
assert rows[0]["removed_date"] == date(2024, 5, 20)
def test_save_row_removed_date_none_when_active(): def test_save_row_removed_date_none_when_active():
@ -144,8 +146,8 @@ def test_save_row_removed_date_none_when_active():
): ):
_save_yandex_history_items(db, result) _save_yandex_history_items(db, result)
row = db.execute.call_args_list[0].args[1] rows = db.execute.call_args_list[0].args[1]
assert row["removed_date"] is None assert rows[0]["removed_date"] is None
def test_save_handles_match_failure_gracefully(): def test_save_handles_match_failure_gracefully():
@ -172,10 +174,10 @@ def test_save_handles_match_failure_gracefully():
saved = _save_yandex_history_items(db, result) saved = _save_yandex_history_items(db, result)
assert saved == 1 assert saved == 1
row = db.execute.call_args_list[0].args[1] rows = db.execute.call_args_list[0].args[1]
assert row["house_id"] is None assert rows[0]["house_id"] is None
assert row["confidence"] == pytest.approx(0.0) assert rows[0]["confidence"] == pytest.approx(0.0)
assert row["notes"] is None assert rows[0]["notes"] is None
def test_save_match_called_with_address_and_year(): def test_save_match_called_with_address_and_year():