def test_construct_currect_rundesciber_from_v0(some_paramspecs): pgroup1 = some_paramspecs[1] interdeps = InterDependencies(pgroup1['ps1'], pgroup1['ps2'], pgroup1['ps3'], pgroup1['ps4'], pgroup1['ps6']) v0 = RunDescriberV0Dict(interdependencies=interdeps._to_dict(), version=0) rds1 = RunDescriber._from_dict(v0) rds2 = from_dict_to_current(v0) expected_v2_dict = RunDescriberV2Dict( interdependencies=interdeps._to_dict(), interdependencies_=old_to_new(interdeps)._to_dict(), version=2) assert DeepDiff(rds1._to_dict(), expected_v2_dict, ignore_order=True) == {} assert DeepDiff(rds2._to_dict(), expected_v2_dict, ignore_order=True) == {}
def test_convert_v0_to_newer(some_paramspecs): pgroup1 = some_paramspecs[1] interdeps = InterDependencies(pgroup1['ps1'], pgroup1['ps2'], pgroup1['ps3'], pgroup1['ps4'], pgroup1['ps6']) v0 = RunDescriberV0Dict(interdependencies=interdeps._to_dict(), version=0) v1 = v0_to_v1(v0) v2 = v0_to_v2(v0) _assert_dicts_are_related_as_expected(v0, v1, v2)
def upgrade_2_to_3(conn: ConnectionPlus) -> None: """ Perform the upgrade from version 2 to version 3 Insert a new column, run_description, to the runs table and fill it out for exisitng runs with information retrieved from the layouts and dependencies tables represented as the json output of a RunDescriber object """ no_of_runs_query = "SELECT max(run_id) FROM runs" no_of_runs = one(atomic_transaction(conn, no_of_runs_query), 'max(run_id)') no_of_runs = no_of_runs or 0 # If one run fails, we want the whole upgrade to roll back, hence the # entire upgrade is one atomic transaction with atomic(conn) as conn: sql = "ALTER TABLE runs ADD COLUMN run_description TEXT" transaction(conn, sql) result_tables = _2to3_get_result_tables(conn) layout_ids_all = _2to3_get_layout_ids(conn) indeps_all = _2to3_get_indeps(conn) deps_all = _2to3_get_deps(conn) layouts = _2to3_get_layouts(conn) dependencies = _2to3_get_dependencies(conn) pbar = tqdm(range(1, no_of_runs + 1)) pbar.set_description("Upgrading database") for run_id in pbar: if run_id in layout_ids_all: result_table_name = result_tables[run_id] layout_ids = list(layout_ids_all[run_id]) if run_id in indeps_all: independents = tuple(indeps_all[run_id]) else: independents = () if run_id in deps_all: dependents = tuple(deps_all[run_id]) else: dependents = () paramspecs = _2to3_get_paramspecs(conn, layout_ids, layouts, dependencies, dependents, independents, result_table_name) interdeps = InterDependencies(*paramspecs.values()) desc_dict = {'interdependencies': interdeps._to_dict()} json_str = json.dumps(desc_dict) else: desc_dict = { 'interdependencies': InterDependencies()._to_dict() } json_str = json.dumps(desc_dict) sql = f""" UPDATE runs SET run_description = ? WHERE run_id == ? """ cur = conn.cursor() cur.execute(sql, (json_str, run_id)) log.debug(f"Upgrade in transition, run number {run_id}: OK")
def upgrade_3_to_4(conn: ConnectionPlus) -> None: """ Perform the upgrade from version 3 to version 4. This really repeats the version 3 upgrade as it originally had two bugs in the inferred annotation. inferred_from was passed incorrectly resulting in the parameter being marked inferred_from for each char in the inferred_from variable and inferred_from was not handled correctly for parameters that were neither dependencies nor dependent on other parameters. Both have since been fixed so rerun the upgrade. """ no_of_runs_query = "SELECT max(run_id) FROM runs" no_of_runs = one(atomic_transaction(conn, no_of_runs_query), 'max(run_id)') no_of_runs = no_of_runs or 0 # If one run fails, we want the whole upgrade to roll back, hence the # entire upgrade is one atomic transaction with atomic(conn) as conn: result_tables = _2to3_get_result_tables(conn) layout_ids_all = _2to3_get_layout_ids(conn) indeps_all = _2to3_get_indeps(conn) deps_all = _2to3_get_deps(conn) layouts = _2to3_get_layouts(conn) dependencies = _2to3_get_dependencies(conn) pbar = tqdm(range(1, no_of_runs + 1), file=sys.stdout) pbar.set_description("Upgrading database; v3 -> v4") for run_id in pbar: if run_id in layout_ids_all: result_table_name = result_tables[run_id] layout_ids = list(layout_ids_all[run_id]) if run_id in indeps_all: independents = tuple(indeps_all[run_id]) else: independents = () if run_id in deps_all: dependents = tuple(deps_all[run_id]) else: dependents = () paramspecs = _2to3_get_paramspecs(conn, layout_ids, layouts, dependencies, dependents, independents, result_table_name) interdeps = InterDependencies(*paramspecs.values()) desc_dict = {'interdependencies': interdeps._to_dict()} json_str = json.dumps(desc_dict) else: desc_dict = { 'interdependencies': InterDependencies()._to_dict() } json_str = json.dumps(desc_dict) sql = f""" UPDATE runs SET run_description = ? WHERE run_id == ? """ cur = conn.cursor() cur.execute(sql, (json_str, run_id)) log.debug(f"Upgrade in transition, run number {run_id}: OK")