diff --git a/src/Model/Friction/Friction.py b/src/Model/Friction/Friction.py index 9c6c368b..8ae4923c 100644 --- a/src/Model/Friction/Friction.py +++ b/src/Model/Friction/Friction.py @@ -28,46 +28,39 @@ logger = logging.getLogger() class Friction(SQLSubModel): _id_cnt = 0 - def __init__(self, id: int = -1, name: str = "", + def __init__(self, id: int = -1, status=None): - super(Friction, self).__init__() + super(Friction, self).__init__(id) self._status = status - if id == -1: - self.id = Friction._id_cnt - else: - self.id = id - - Friction._id_cnt = max( - self.id, Friction._id_cnt + 1 - ) - - self._name = name - self._edge = None + self._reach = None self._begin_rk = 0.0 self._end_rk = 0.0 self._begin_strickler = None self._end_strickler = None @classmethod - def _db_create(cls, execute): - execute(""" - CREATE TABLE friction( - id INTEGER NOT NULL PRIMARY KEY, + def _db_create(cls, execute, ext=""): + execute(f""" + CREATE TABLE friction{ext} ( + {cls.create_db_add_pamhyr_id()}, ind INTEGER NOT NULL, begin_rk REAL NOT NULL, end_rk REAL NOT NULL, reach INTEGER NOT NULL, begin_strickler INTEGER NOT NULL, end_strickler INTEGER NOT NULL, - FOREIGN KEY(reach) REFERENCES river_reach(id), - FOREIGN KEY(begin_strickler) REFERENCES stricklers(id), - FOREIGN KEY(end_strickler) REFERENCES stricklers(id) + {Scenario.create_db_add_scenario()}, + {Scenario.create_db_add_scenario_fk()}, + FOREIGN KEY(reach) REFERENCES river_reach(pamhyr_id), + FOREIGN KEY(begin_strickler) REFERENCES stricklers(pamhyr_id), + FOREIGN KEY(end_strickler) REFERENCES stricklers(pamhyr_id) + PRIMARY KEY(pamhyr_id, scenario) ) """) - return True + return cls._create_submodel(execute) @classmethod def _db_update(cls, execute, version, data=None): @@ -78,7 +71,29 @@ class Friction(SQLSubModel): "RENAME COLUMN begin_kp TO begin_rk") execute("ALTER TABLE friction RENAME COLUMN end_kp TO end_rk") - return True + cls._db_update_to_0_1_0(execute, data) + + return cls._update_submodel(execute, version, data) + @classmethod + def _db_update_to_0_1_0(cls, execute, data): + table = "friction" + + 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, ind, begin_rk, end_rk, reach, " + + "begin_strickler, end_strickler, scenario) " + + "SELECT pamhyr_id, ind, begin_rk, end_rk, reach, " + + "begin_strickler, end_strickler, scenario " + + f"FROM {table}" + ) + + execute(f"DROP TABLE {table}") + execute(f"ALTER TABLE {table}_tmp RENAME TO {table}") @classmethod def _db_load(cls, execute, data=None): @@ -89,34 +104,50 @@ class Friction(SQLSubModel): stricklers = data["stricklers"].stricklers table = execute( - "SELECT id, ind, begin_rk, end_rk, " + + "SELECT pamhyr_id, begin_rk, end_rk, " + "begin_strickler, end_strickler " + - f"FROM friction WHERE reach = {reach.id}" + f"FROM friction WHERE reach = {reach.pamhyr_id} " + + "ORDER BY ind ASC" ) for row in table: - id = row[0] - ind = row[1] - # Get stricklers - if int(row[4]) == -1: - bs = None - else: - bs = next(filter(lambda s: s.id == row[4], stricklers)) + it = iter(row) - if int(row[5]) == -1: - es = None - else: - es = next(filter(lambda s: s.id == row[5], stricklers)) + pid = next(it) + begin_rk = next(it) + end_rk = next(it) + begin_strickler_pid = next(it) + end_strickler_pid = next(it) + + # Get stricklers + begin_strickler = None + if int(begin_strickler_pid) != -1: + begin_strickler = next( + filter( + lambda s: s.pamhyr_id == begin_strickler_pid, stricklers + ) + ) + + begin_strickler = None + if int(end_strickler_pid) != -1: + begin_strickler = next( + filter( + lambda s: s.id == begin_strickler_pid, stricklers + ) + ) # Create friction - sec = cls(status=status) - sec.edge = reach - sec.begin_rk = row[2] - sec.end_rk = row[3] - sec.begin_strickler = bs - sec.end_strickler = es + new_friction = cls( + id=pid, + status=status + ) + new_friction.reach = reach + new_friction.begin_rk = begin_rk + new_friction.end_rk = end_rk + new_friction.begin_strickler = begin_strickler + new_friction.end_strickler = begin_strickler - new.append((ind, sec)) + new.append(new_friction) return new @@ -138,42 +169,29 @@ class Friction(SQLSubModel): "VALUES (" + f"{self.id}, {ind}, " + f"{self._begin_rk}, {self._end_rk}, " + - f"{self._edge.id}, " + + f"{self._reach.id}, " + f"{b_s_id}, {e_s_id}" + ")" ) return True - @property - def name(self): - return self._name - - @name.setter - def name(self, name): - self._name = name - self._status.modified() - - @property - def edge(self): - return self._edge - @property def reach(self): - return self._edge + return self._reach - @edge.setter - def edge(self, edge): - self._edge = edge - if (edge is not None and + @reach.setter + def reach(self, reach): + self._reach = reach + if (reach is not None and self._begin_rk == 0.0 and self._end_rk == 0.0): - self._begin_rk = self._edge.reach.get_rk_min() - self._end_rk = self._edge.reach.get_rk_max() + self._begin_rk = self._reach.reach.get_rk_min() + self._end_rk = self._reach.reach.get_rk_max() self._status.modified() - def has_edge(self): - return self._edge is not None + def has_reach(self): + return self._reach is not None def has_coefficient(self): return ( @@ -182,7 +200,7 @@ class Friction(SQLSubModel): ) def is_full_defined(self): - return self.has_edge() and self.has_coefficient() + return self.has_reach() and self.has_coefficient() @property def begin_rk(self): @@ -190,11 +208,11 @@ class Friction(SQLSubModel): @begin_rk.setter def begin_rk(self, begin_rk): - if self._edge is None: + if self._reach is None: self._begin_rk = begin_rk else: - _min = self._edge.reach.get_rk_min() - _max = self._edge.reach.get_rk_max() + _min = self._reach.reach.get_rk_min() + _max = self._reach.reach.get_rk_max() if _min <= begin_rk <= _max: self._begin_rk = begin_rk @@ -207,11 +225,11 @@ class Friction(SQLSubModel): @end_rk.setter def end_rk(self, end_rk): - if self._edge is None: + if self._reach is None: self._end_rk = end_rk else: - _min = self._edge.reach.get_rk_min() - _max = self._edge.reach.get_rk_max() + _min = self._reach.reach.get_rk_min() + _max = self._reach.reach.get_rk_max() if _min <= end_rk <= _max: self._end_rk = end_rk diff --git a/src/Model/InitialConditions/InitialConditions.py b/src/Model/InitialConditions/InitialConditions.py index e9854db4..ddbc2c66 100644 --- a/src/Model/InitialConditions/InitialConditions.py +++ b/src/Model/InitialConditions/InitialConditions.py @@ -100,7 +100,7 @@ class Data(SQLSubModel): cls._db_create(execute, ext="_tmp") execute( - f"INSERT INTO {table} " + + f"INSERT INTO {table}_tmp " + "(pamhyr_id, name, comment, tab, reach, rk, scenario) " + "SELECT pamhyr_id, name, comment, tab, reach, rk, scenario " + f"FROM {table}" diff --git a/src/Model/Stricklers/Stricklers.py b/src/Model/Stricklers/Stricklers.py index 94b18b87..370cad5c 100644 --- a/src/Model/Stricklers/Stricklers.py +++ b/src/Model/Stricklers/Stricklers.py @@ -31,16 +31,9 @@ class Stricklers(SQLSubModel): minor: float = 35.0, medium: float = 15.0, status=None): - super(Stricklers, self).__init__() + super(Stricklers, self).__init__(id) self._status = status - if id == -1: - self.id = Stricklers._id_cnt - else: - self.id = id - - Stricklers._id_cnt = max(Stricklers._id_cnt + 1, id + 1) - self._name = name self._comment = comment @@ -48,14 +41,17 @@ class Stricklers(SQLSubModel): self._medium = medium @classmethod - def _db_create(cls, execute): - execute(""" - CREATE TABLE stricklers( - id INTEGER NOT NULL PRIMARY KEY, + def _db_create(cls, execute, ext=""): + execute(f""" + CREATE TABLE stricklers{ext} ( + {cls.create_db_add_pamhyr_id()} name TEXT, comment TEXT, minor REAL NOT NULL, - medium REAL NOT NULL + medium REAL NOT NULL, + {Scenario.create_db_add_scenario()}, + {Scenario.create_db_add_scenario_fk()}, + PRIMARY KEY(pamhyr_id, scenario) ) """) @@ -63,15 +59,38 @@ class Stricklers(SQLSubModel): @classmethod def _db_update(cls, execute, version, data=None): + major, minor, release = version.strip().split(".") + if major == minor == "0": + cls._db_update_to_0_1_0(execute, data) + return cls._update_submodel(execute, version, data) + @classmethod + def _db_update_to_0_1_0(cls, execute, data): + table = "stricklers" + + 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, name, comment, minor, medium, scenario) " + + "SELECT pamhyr_id, name, comment, minor, medium, scenario " + + f"FROM {table}" + ) + + execute(f"DROP TABLE {table}") + execute(f"ALTER TABLE {table}_tmp RENAME TO {table}") + @classmethod def _db_load(cls, execute, data=None): stricklers = [] status = data["status"] table = execute( - "SELECT id, name, comment, minor, medium " + + "SELECT pamhyr_id, name, comment, minor, medium " + "FROM stricklers" ) @@ -79,14 +98,16 @@ class Stricklers(SQLSubModel): return None for row in table: - id = row[0] - name = row[1] - comment = row[2] - minor = row[3] - medium = row[4] + it = iter(row) + + pid = next(it) + name = next(it) + comment = next(it) + minor = next(it) + medium = next(it) new = cls( - id=id, + id=pid, name=name, comment=comment, minor=minor, medium=medium, @@ -100,9 +121,9 @@ class Stricklers(SQLSubModel): def _db_save(self, execute, data=None): sql = ( "INSERT INTO " + - "stricklers(id, name, comment, minor, medium) " + + "stricklers(pamhyr_id, name, comment, minor, medium) " + "VALUES (" + - f"{self.id}, " + + f"{self.pamhyr_id}, " + f"'{self._db_format(self.name)}', " + f"'{self._db_format(self.comment)}', " + f"{float(self.minor)}, {float(self.medium)}" +