← back to Quadrille Room Credit Enrich
gen_update_sql.py
92 lines
#!/usr/bin/env python3
"""Generate the gated, idempotent, additive jsonb UPDATE for the 26 enriched
Quadrille room images. Matches each jsonb object by thumb-stripped URL and
updates ONLY credit/richness/designer/photographer/publication/date inside the
existing object. Wrapped BEGIN ... (counts) ... ROLLBACK by default."""
import csv, json
ROWS = [r for r in csv.DictReader(open('/Users/macstudio3/QuadrilleRoomSettings-credit-enriched.csv'))
if r['source'] == 'filename-reparse']
def sqlstr(v):
if v is None or v == '':
return 'NULL'
return "'" + v.replace("'", "''") + "'"
def base(u):
return u.replace('-sm-thumb', '')
lines = []
lines.append("-- Quadrille room-setting thin-credit enrichment (DTD verdict A, 3/3)")
lines.append("-- Additive: updates credit/richness/sub-fields inside EXISTING jsonb objects.")
lines.append("-- Idempotent (re-running yields same result). BEGIN...ROLLBACK dry-run.")
lines.append("\\set ON_ERROR_STOP on")
lines.append("BEGIN;")
lines.append("")
lines.append("CREATE TEMP TABLE _enrich(key text PRIMARY KEY, credit text, richness text,"
" designer text, photographer text, publication text, date text) ON COMMIT DROP;")
for r in ROWS:
lines.append(
"INSERT INTO _enrich VALUES ("
f"{sqlstr(base(r['url']))}, {sqlstr(r['new_credit'])}, {sqlstr(r['new_richness'])}, "
f"{sqlstr(r['new_designer'])}, {sqlstr(r['new_photographer'])}, "
f"{sqlstr(r['new_publication'])}, {sqlstr(r['new_date'])}) ON CONFLICT (key) DO NOTHING;")
lines.append("")
# Pre-update counts
lines.append("-- BEFORE: how many jsonb objects match an enrich key, by table")
for tbl in ('china_seas_catalog', 'quadrille_house_catalog'):
lines.append(f"""SELECT '{tbl} matching-objects (before)' AS metric, count(*) FROM {tbl} t,
jsonb_array_elements(t.room_setting_images_credited) obj
JOIN _enrich e ON e.key = replace(obj->>'url','-sm-thumb','');""")
lines.append("")
# The additive update: rebuild each row's array, replacing matched objects.
update_tmpl = """
UPDATE {tbl} t SET room_setting_images_credited = (
SELECT jsonb_agg(
CASE WHEN e.key IS NOT NULL THEN
obj
|| jsonb_build_object('credit', e.credit)
|| jsonb_build_object('richness', e.richness)
|| jsonb_build_object('designer', to_jsonb(e.designer))
|| jsonb_build_object('photographer', to_jsonb(e.photographer))
|| jsonb_build_object('publication', to_jsonb(e.publication))
|| jsonb_build_object('date', to_jsonb(e.date))
ELSE obj END
ORDER BY ord
)
FROM jsonb_array_elements(t.room_setting_images_credited) WITH ORDINALITY AS a(obj, ord)
LEFT JOIN _enrich e ON e.key = replace(obj->>'url','-sm-thumb','')
)
WHERE EXISTS (
SELECT 1 FROM jsonb_array_elements(t.room_setting_images_credited) o2
JOIN _enrich e2 ON e2.key = replace(o2->>'url','-sm-thumb','')
);"""
for tbl in ('china_seas_catalog', 'quadrille_house_catalog'):
lines.append(update_tmpl.format(tbl=tbl))
lines.append("")
# After counts: objects now carrying the new credit
lines.append("-- AFTER: objects whose credit now equals the enriched credit")
for tbl in ('china_seas_catalog', 'quadrille_house_catalog'):
lines.append(f"""SELECT '{tbl} objects-updated (after)' AS metric, count(*) FROM {tbl} t,
jsonb_array_elements(t.room_setting_images_credited) obj
JOIN _enrich e ON e.key = replace(obj->>'url','-sm-thumb','')
WHERE obj->>'credit' = e.credit AND obj->>'richness' = e.richness;""")
lines.append("")
lines.append("-- Sample of updated objects for eyeball verification")
lines.append("""SELECT obj->>'url' url, obj->>'credit' credit, obj->>'richness' richness,
obj->>'publication' publication, obj->>'date' date
FROM china_seas_catalog t, jsonb_array_elements(t.room_setting_images_credited) obj
JOIN _enrich e ON e.key = replace(obj->>'url','-sm-thumb','')
WHERE obj->>'credit' = e.credit LIMIT 8;""")
lines.append("")
lines.append("ROLLBACK; -- DRY RUN. Change to COMMIT; once counts verified.")
open('/Users/macstudio3/Projects/quadrille-room-credit-enrich/data/update_credit.sql', 'w').write('\n'.join(lines))
print(f"wrote data/update_credit.sql ({len(ROWS)} enrich rows)")