vraiprix_local : réparation set-based des replis rôle dans enrich_role
Filet de sécurité idempotent : ré-applique year_built/lot_sqft depuis le JSON vraiprix (annee_construction_role / superficie_terrain_role_m2) si une mise à jour de source les a remis à NULL (anciens process sans COALESCE). Récupéré au premier passage : 246 années + 1 920 terrains. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 changed file +28 −1
modified
immoka/vraiprix_local.py
+28 −1
@@ -402,9 +402,36 @@ def enrich_role(limit: int | None = None) -> dict: | ||
| 402 | 402 | pass |
| 403 | 403 | time.sleep(1.0) |
| 404 | 404 | con.commit() |
| 405 | + # réparation set-based (idempotente, instantanée) : ré-applique le repli de | |
| 406 | + # colonnes depuis le JSON vraiprix déjà enrichi — filet de sécurité si une | |
| 407 | + # mise à jour de source a écrasé year_built/lot_sqft (anciens process sans | |
| 408 | + # COALESCE, edge cases de course entre writer et backfill). | |
| 409 | + cur = con.execute( | |
| 410 | + "UPDATE listings SET" | |
| 411 | + " year_built=CAST(json_extract(vraiprix,'$.annee_construction_role') AS INT)," | |
| 412 | + " details=json_set(COALESCE(details,'{}'),'$.year_built_source','role')" | |
| 413 | + " WHERE active=1 AND year_built IS NULL" | |
| 414 | + " AND CAST(json_extract(vraiprix,'$.annee_construction_role') AS INT)" | |
| 415 | + " BETWEEN 1600 AND 2049") | |
| 416 | + repaired_y = cur.rowcount | |
| 417 | + like_condo = ("lower(property_type) LIKE '%condo%'" | |
| 418 | + " OR lower(property_type) LIKE '%appartement%'" | |
| 419 | + " OR lower(property_type) LIKE '%loft%'" | |
| 420 | + " OR lower(property_type) LIKE '%copropri%'") | |
| 421 | + cur = con.execute( | |
| 422 | + "UPDATE listings SET" | |
| 423 | + " lot_sqft=ROUND(CAST(json_extract(vraiprix,'$.superficie_terrain_role_m2')" | |
| 424 | + " AS REAL) * 10.7639)," | |
| 425 | + " details=json_set(COALESCE(details,'{}'),'$.lot_sqft_source','role')" | |
| 426 | + " WHERE active=1 AND lot_sqft IS NULL" | |
| 427 | + " AND CAST(json_extract(vraiprix,'$.superficie_terrain_role_m2') AS REAL) > 0" | |
| 428 | + f" AND NOT ({like_condo})") | |
| 429 | + repaired_l = cur.rowcount | |
| 430 | + con.commit() | |
| 405 | 431 | con.close() |
| 406 | 432 | vp.close() |
| 407 | 433 | out = {"role_enriched": enriched, "year_built_filled": fallback_y, |
| 408 | − "lot_filled": fallback_l} | |
| 434 | + "lot_filled": fallback_l, "repaired_year": repaired_y, | |
| 435 | + "repaired_lot": repaired_l} | |
| 409 | 436 | print(f"[immo-ka] vraiprix_local.enrich_role {out}") |
| 410 | 437 | return out |
| 411 | 438 | |