diff --git a/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py b/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py index 4526a8e8..9ed0f1ac 100644 --- a/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py +++ b/src/Model/BoundaryConditionsAdisTS/BoundaryConditionAdisTS.py @@ -32,9 +32,178 @@ from Model.Scenario import Scenario logger = logging.getLogger() -class BoundaryConditionAdisTS(SQLSubModel): +class Data(SQLSubModel): _sub_classes = [] + def __init__(self, + data0, data1, + id: int = -1, + types=[float, float], + status=None, + owner_scenario=-1): + super(Data, self).__init__( + id=id, status=status, + owner_scenario=owner_scenario + ) + + self._types = types + self._data = [data0, data1] + + @classmethod + def _db_create(cls, execute, ext=""): + execute(f""" + CREATE TABLE boundary_condition_data_adists{ext}( + {cls.create_db_add_pamhyr_id()}, + deleted BOOLEAN NOT NULL DEFAULT FALSE, + data0 TEXT NOT NULL, + data1 TEXT NOT NULL, + bca INTEGER, + {Scenario.create_db_add_scenario()}, + {Scenario.create_db_add_scenario_fk()}, + FOREIGN KEY(bca) REFERENCES boundary_condition_adists(pamhyr_id) + ) + """) + + return True + + @classmethod + def _db_update(cls, execute, version, data=None): + major, minor, release = version.strip().split(".") + created = False + + if major == "0" and int(minor) <= 1: + if int(release) < 7: + cls._db_create(execute) + created = True + + if major == "0" and int(minor) < 2: + if not created: + cls._db_update_to_0_2_0(execute, data) + + if not created: + return cls._update_submodel(execute, version, data) + + return True + + @classmethod + def _db_update_to_0_2_0(cls, execute, data): + table = "boundary_condition_data_adists" + + cls.update_db_add_pamhyr_id(execute, table, data) + Scenario.update_db_add_scenario(execute, table) + + cls._db_create(execute, ext="_tmp") + + execute( + f"INSERT INTO {table}_tmp " + + "(pamhyr_id, data0, data1, bca, scenario) " + + "SELECT pamhyr_id, data0, data1, bc, scenario " + + f"FROM {table}" + ) + + execute(f"DROP TABLE {table}") + execute(f"ALTER TABLE {table}_tmp RENAME TO {table}") + + cls._db_update_to_0_2_0_set_bca_pid(execute, data) + + @classmethod + def _db_update_to_0_2_0_set_bca_pid(cls, execute, data): + pid_bca = data["id2pid"]["boundary_condition_adists"] + els = execute( + "SELECT pamhyr_id, bca " + + "FROM boundary_condition_data_adists" + ) + + for row in els: + it = iter(row) + pid = next(it) + bca_id = next(it) + + if bca_id == -1: + continue + + execute( + f"UPDATE boundary_condition_data_adists " + + f"SET bca = {pid_bca[bca_id]} " + + f"WHERE pamhyr_id = {pid}" + ) + + @classmethod + def _db_load(cls, execute, data=None): + new = [] + status = data['status'] + scenario = data["scenario"] + loaded = data['loaded_pid'] + + if scenario is None: + return new + + bca = data["bca"] + + table = execute( + "SELECT pamhyr_id, deleted, data0, data1, scenario FROM " + + "boundary_condition_data_adists " + + f"WHERE bca = {bca.id} " + + f"AND scenario = {scenario.id}" + ) + + if table is not None: + for row in table: + it = iter(row) + + pid = next(it) + deleted = (next(it) == 1) + data0 = next(it) + data1 = next(it) + owner_scenario = next(it) + + bc = cls( + data0, data1, + id=pid, + status=status, + owner_scenario=owner_scenario + ) + if deleted: + bc.set_as_deleted() + + loaded.add(pid) + new.append(bc) + + data["scenario"] = scenario.parent + new += cls._db_load(execute, data) + data["scenario"] = scenario + + return new + + def _db_save(self, execute, data=None): + if not self.must_be_saved(): + return True + + bca = data["bca"] + + data0 = self._db_format(self._data[0]) + data1 = self._db_format(self._data[1]) + + execute( + "INSERT INTO " + + "boundary_condition_data_adists(" + + "pamhyr_id, data0, data1, bca, scenario) " + + f"VALUES ({self.id}, '{data0}', {data1}, {bca.id}, " + + f"{self._status.scenario_id})" + ) + + return True + + def __getitem__(self, key): + return self._types[key](self._data[key]) + + def __setitem__(self, key, value): + self._data[key] = self._types[key](value) + + +class BoundaryConditionAdisTS(SQLSubModel): + _sub_classes = [Data] + def __init__(self, id: int = -1, pollutant: int = -1, status=None, owner_scenario=-1): @@ -54,13 +223,6 @@ class BoundaryConditionAdisTS(SQLSubModel): @classmethod def _db_create(cls, execute, ext=""): - cls._db_create_bca(execute, ext) - cls._db_create_bca_data(execute, ext) - - return cls._create_submodel(execute) - - @classmethod - def _db_create_bca(cls, execute, ext=""): execute(f""" CREATE TABLE boundary_condition_adists{ext}( {cls.create_db_add_pamhyr_id()}, @@ -75,19 +237,10 @@ class BoundaryConditionAdisTS(SQLSubModel): ) """) - @classmethod - def _db_create_bca_data(cls, execute, ext=""): - execute(f""" - CREATE TABLE boundary_condition_data_adists{ext}( - {cls.create_db_add_pamhyr_id()}, - data0 TEXT NOT NULL, - data1 TEXT NOT NULL, - bca INTEGER, - {Scenario.create_db_add_scenario()}, - {Scenario.create_db_add_scenario_fk()}, - FOREIGN KEY(bca) REFERENCES boundary_condition_adists(pamhyr_id) - ) - """) + if ext != "": + return True + + return cls._create_submodel(execute) @classmethod def _db_update(cls, execute, version, data=None): @@ -102,7 +255,9 @@ class BoundaryConditionAdisTS(SQLSubModel): if major == "0" and int(minor) < 2: if not created: cls._db_update_to_0_2_0(execute, data) - cls._db_update_to_0_2_0_data(execute, data) + + if not created: + return cls._update_submodel(execute, version, data) return True @@ -114,7 +269,7 @@ class BoundaryConditionAdisTS(SQLSubModel): cls.update_db_add_pamhyr_id(execute, table, data) Scenario.update_db_add_scenario(execute, table) - cls._db_create_bca(execute, ext="_tmp") + cls._db_create(execute, ext="_tmp") execute( f"INSERT INTO {table}_tmp " + @@ -151,49 +306,6 @@ class BoundaryConditionAdisTS(SQLSubModel): f"WHERE pamhyr_id = {pid}" ) - @classmethod - def _db_update_to_0_2_0_data(cls, execute, data): - table = "boundary_condition_data_adists" - - cls.update_db_add_pamhyr_id(execute, table, data) - Scenario.update_db_add_scenario(execute, table) - - cls._db_create_bca_data(execute, ext="_tmp") - - execute( - f"INSERT INTO {table}_tmp " + - "(pamhyr_id, data0, data1, bca, scenario) " + - "SELECT pamhyr_id, data0, data1, bc, scenario " + - f"FROM {table}" - ) - - execute(f"DROP TABLE {table}") - execute(f"ALTER TABLE {table}_tmp RENAME TO {table}") - - cls._db_update_to_0_2_0_set_bca_pid(execute, data) - - @classmethod - def _db_update_to_0_2_0_set_bca_pid(cls, execute, data): - pid_bca = data["id2pid"]["boundary_condition_adists"] - els = execute( - "SELECT pamhyr_id, bca " + - "FROM boundary_condition_data_adists" - ) - - for row in els: - it = iter(row) - pid = next(it) - bca_id = next(it) - - if bca_id == -1: - continue - - execute( - f"UPDATE boundary_condition_data_adists " + - f"SET bca = {pid_bca[bca_id]} " + - f"WHERE pamhyr_id = {pid}" - ) - @classmethod def _db_load(cls, execute, data=None): new = [] @@ -247,19 +359,8 @@ class BoundaryConditionAdisTS(SQLSubModel): else: bc.node = -1 - values = execute( - "SELECT data0, data1 FROM " + - "boundary_condition_data_adists " + - f"WHERE bca = '{bc.id}' " + - f"AND scenario = {scenario.id}" - ) - - # Write data - for v in values: - data0 = bc._types[0](v[0]) - data1 = bc._types[1](v[1]) - # Replace data at pos ind - bc._data.append((data0, data1)) + data["bca"] = bc + bc._data = Data._db_load(execute, data=data) loaded.add(pid) new.append(bc) @@ -302,17 +403,13 @@ class BoundaryConditionAdisTS(SQLSubModel): ")" ) + ind = 0 for d in self._data: - data0 = self._db_format(str(d[0])) - data1 = self._db_format(str(d[1])) + data["ind"] = ind - execute( - "INSERT INTO " + - "boundary_condition_data_adists(" + - "data0, data1, bca, scenario) " + - f"VALUES ('{data0}', {data1}, {self.id}, " + - f"{self._status.scenario_id})" - ) + d._db_save(execute, data) + + ind += 1 return True