from __future__ import division from db import dbconn import datetime from sys import argv def affected_indices(company_id, conn): """returns the list of indices containing company_id""" with conn.cursor() as c: sqlstr = """SELECT * FROM (SELECT unnest(index_list) AS basketid FROM bbg_issuers WHERE company_id=%s) a JOIN index_version USING (basketid) WHERE lastdate='infinity'""" c.execute(sqlstr, (company_id,)) recordslist = c.fetchall() return recordslist def create_newindices(recordslist, lastdate, nissuers, conn): """create the new indices versions and update the old""" insertstr = """INSERT INTO index_version(Index, Series, Version, IndexFactor, CumulativeLoss, lastdate) Values(%(index)s, %(series)s, %(version)s, %(indexfactor)s, %(cumulativeloss)s, %(lastdate)s) RETURNING basketid""" updatestr = "UPDATE index_version SET lastdate=%s WHERE basketid=%s" with conn.cursor() as c: newids = {} for r in recordslist: r['indexfactor'] -= 100/nissuers r['version'] += 1 r['cumulativeloss'] += (100-recovery)/nissuers r['lastdate'] = 'infinity' c.execute(insertstr, r) newids[r['basketid']] = c.fetchone()[0] for oldid in newids.keys(): c.execute(updatestr, (lastdate, oldid)) conn.commit() return newids def update_indexmembers(newids, company_id, conn): with conn.cursor() as c: for oldid, newid in newids.items(): c.execute("""update bbg_issuers set index_list=index_list||%s where company_id in (select company_id from bbg_issuers where %s=Any(index_list) and company_id != %s)""", (newid, oldid, company_id)) conn.commit() if __name__=="__main__": if len(argv) == 1: print("""Usage: python handle_default.py For instance: python handle_default.py 210065 2015-02-19 15.875 100""") else: with dbconn('serenitasdb') as serenitasdb: company_id = int(argv[1]) lastdate = datetime.datetime.strptime(argv[2], "%Y-%m-%d") recovery = float(argv[3]) n_issuers = float(argv[4]) recordslist = affected_indices(company_id, serenitasdb) print(recordslist) newids = create_newindices(recordslist, lastdate, n_issuers, serenitasdb) update_indexmembers(newids, company_id, serenitasdb)