Reservoir: Add scenario support.

scenarios
Pierre-Antoine Rouby 2024-09-06 15:33:20 +02:00
parent 81264fa63e
commit cd7a81d828
3 changed files with 132 additions and 43 deletions

View File

@ -27,9 +27,12 @@ logger = logging.getLogger()
class Data(SQLSubModel): class Data(SQLSubModel):
_sub_classes = [] _sub_classes = []
def __init__(self, id: int = -1, status=None): def __init__(self, id: int = -1,
super(Data, self).__init__(id) status=None, owner_scenario=-1):
self._status = status super(Data, self).__init__(
id=id, status=status,
owner_scenario=owner_scenario
)
self._data = [] self._data = []
@ -38,6 +41,7 @@ class Data(SQLSubModel):
execute(f""" execute(f"""
CREATE TABLE reservoir_data{ext}( CREATE TABLE reservoir_data{ext}(
{cls.create_db_add_pamhyr_id()}, {cls.create_db_add_pamhyr_id()},
deleted BOOLEAN NOT NULL DEFAULT FALSE,
ind INTEGER NOT NULL, ind INTEGER NOT NULL,
elevation REAL NOT NULL, elevation REAL NOT NULL,
surface REAL NOT NULL, surface REAL NOT NULL,
@ -62,6 +66,13 @@ class Data(SQLSubModel):
if int(release) > 5: if int(release) > 5:
cls._db_update_to_0_1_0(execute, data) cls._db_update_to_0_1_0(execute, data)
if major == "0" and minor == "1":
if release < 2:
execute(
"ALTER TABLE reservoir_data " +
"ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE"
)
return cls._update_submodel(execute, version, data) return cls._update_submodel(execute, version, data)
@classmethod @classmethod
@ -112,12 +123,20 @@ class Data(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
scenario = data["scenario"]
if scenario is None:
return new
loaded = data['loaded_pid']
reseroire = data["reservoir"] reseroire = data["reservoir"]
values = execute( values = execute(
"SELECT pamhyr_id, ind, elevation, surface " + "SELECT pamhyr_id, deleted, ind, " +
"elevation, surface, scenario " +
"FROM reservoir_data " + "FROM reservoir_data " +
f"WHERE reservoir = {reseroire.pamhyr_id} " + f"WHERE reservoir = {reseroire.pamhyr_id} " +
f"AND scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) " +
"ORDER BY ind ASC" "ORDER BY ind ASC"
) )
@ -125,20 +144,34 @@ class Data(SQLSubModel):
it = iter(v) it = iter(v)
pid = next(it) pid = next(it)
deleted = (next(it) == 1)
ind = next(it) ind = next(it)
elevation = next(it) elevation = next(it)
surface = next(it) surface = next(it)
owner_scenario = next(it)
nd = cls( nd = cls(
id=pid, status=data['status'] id=pid, status=data['status'],
owner_scenario=owner_scenario
) )
if deleted:
f.set_as_deleted()
nd._data = [elevation, surface] nd._data = [elevation, surface]
loaded.add(pid)
new.append(nd) new.append(nd)
data["scenario"] = scenario.parent
new += cls._db_load(execute, data)
data["scenario"] = scenario
return new return new
def _db_save(self, execute, data=None): def _db_save(self, execute, data=None):
if not self.must_be_saved():
return True
pid = self._pamhyr_id pid = self._pamhyr_id
ind = data["ind"] ind = data["ind"]
elevation = self._db_format(str(self[0])) elevation = self._db_format(str(self[0]))
@ -146,12 +179,15 @@ class Data(SQLSubModel):
reservoir = data["reservoir"] reservoir = data["reservoir"]
execute( execute(
"INSERT INTO " + "INSERT INTO reservoir_data " +
"reservoir_data " + "(pamhyr_id, deleted, ind, " +
"(pamhyr_id, ind, elevation, surface, reservoir) " + "elevation, surface, reservoir, scenario) " +
"VALUES (" + "VALUES (" +
f"{pid}, {ind}, '{elevation}', {surface}, " + f"{pid}, " +
f"{reservoir._pamhyr_id}" + f"{self._db_format(self.is_deleted())}, " +
f"{ind}, '{elevation}', {surface}, " +
f"{reservoir._pamhyr_id}, " +
f"{self._status.scenario_id}" +
")" ")"
) )
@ -167,10 +203,11 @@ class Reservoir(SQLSubModel):
def __init__(self, id: int = -1, def __init__(self, id: int = -1,
name: str = "", name: str = "",
status=None): status=None, owner_scenario=-1):
super(Reservoir, self).__init__(id) super(Reservoir, self).__init__(
id=id, status=status,
self._status = status owner_scenario=owner_scenario
)
self._name = name self._name = name
self._node = None self._node = None
@ -181,6 +218,7 @@ class Reservoir(SQLSubModel):
execute(f""" execute(f"""
CREATE TABLE reservoir{ext} ( CREATE TABLE reservoir{ext} (
{cls.create_db_add_pamhyr_id()}, {cls.create_db_add_pamhyr_id()},
deleted BOOLEAN NOT NULL DEFAULT FALSE,
name TEXT NOT NULL, name TEXT NOT NULL,
node INTEGER, node INTEGER,
{Scenario.create_db_add_scenario()}, {Scenario.create_db_add_scenario()},
@ -205,6 +243,13 @@ class Reservoir(SQLSubModel):
cls._db_update_to_0_1_0(execute, data) cls._db_update_to_0_1_0(execute, data)
if major == "0" and minor == "1":
if release < 2:
execute(
"ALTER TABLE additional_files " +
"ADD COLUMN deleted BOOLEAN NOT NULL DEFAULT FALSE"
)
return cls._update_submodel(execute, version, data) return cls._update_submodel(execute, version, data)
@classmethod @classmethod
@ -232,20 +277,35 @@ class Reservoir(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
scenario = data["scenario"]
loaded = data['loaded_pid']
if scenario is None:
return new
table = execute( table = execute(
"SELECT pamhyr_id, name, node " + "SELECT pamhyr_id, deleted, name, node, scenario " +
"FROM reservoir " "FROM reservoir " +
f"WHERE scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))})"
) )
for row in table: for row in table:
it = iter(row) it = iter(row)
id = next(it) id = next(it)
deleted = (next(it) == 1)
name = next(it) name = next(it)
node_id = next(it) node_id = next(it)
owner_scenario = next(it)
new_reservoir = cls(id, name, status=data["status"]) new_reservoir = cls(
id, name,
status=data["status"],
owner_scenario=owner_scenario
)
if deleted:
f.set_as_deleted()
new_reservoir._node = None new_reservoir._node = None
if node_id != -1: if node_id != -1:
@ -260,18 +320,28 @@ class Reservoir(SQLSubModel):
execute, data=data execute, data=data
) )
loaded.add(id)
new.append(new_reservoir) new.append(new_reservoir)
data["scenario"] = scenario.parent
new += cls._db_load(execute, data)
data["scenario"] = scenario
return new return new
def _db_save(self, execute, data=None): def _db_save(self, execute, data=None):
if not self.must_be_saved():
return True
execute( execute(
"DELETE FROM reservoir " + "DELETE FROM reservoir " +
f"WHERE pamhyr_id = {self.pamhyr_id}" f"WHERE pamhyr_id = {self.pamhyr_id}" +
f"AND scenario = {self._status.scenario_id}"
) )
execute( execute(
"DELETE FROM reservoir_data " + "DELETE FROM reservoir_data " +
f"WHERE reservoir = {self.pamhyr_id}" f"WHERE reservoir = {self.pamhyr_id}" +
f"AND scenario = {self._status.scenario_id}"
) )
node_id = 'NULL' node_id = 'NULL'
@ -280,10 +350,13 @@ class Reservoir(SQLSubModel):
sql = ( sql = (
"INSERT INTO " + "INSERT INTO " +
"reservoir(pamhyr_id, name, node) " + "reservoir(pamhyr_id, deleted, name, node, scenario) " +
"VALUES (" + "VALUES (" +
f"{self.pamhyr_id}, '{self._db_format(self._name)}', " + f"{self.pamhyr_id}, " +
f"{node_id}" + f"{self._db_format(self.is_deleted())}, " +
f"'{self._db_format(self._name)}', " +
f"{node_id}, " +
f"{self._status.scenario_id}" +
")" ")"
) )
execute(sql) execute(sql)
@ -313,7 +386,7 @@ class Reservoir(SQLSubModel):
@name.setter @name.setter
def name(self, name): def name(self, name):
self._name = name self._name = name
self._status.modified() self.modified()
@property @property
def node(self): def node(self):
@ -322,7 +395,7 @@ class Reservoir(SQLSubModel):
@node.setter @node.setter
def node(self, node): def node(self, node):
self._node = node self._node = node
self._status.modified() self.modified()
def has_node(self): def has_node(self):
return self._node is not None return self._node is not None
@ -357,40 +430,50 @@ class Reservoir(SQLSubModel):
def add(self, index: int): def add(self, index: int):
value = (self._default_elevation, self._default_surface) value = (self._default_elevation, self._default_surface)
self._data.insert(index, value) self._data.insert(index, value)
self._status.modified() self.modified()
return value return value
def insert(self, index: int, value): def insert(self, index: int, value):
self._data.insert(index, value) self._data.insert(index, value)
self._status.modified() self.modified()
def delete_i(self, indexes): def hard_delete_i(self, indexes):
self._data = list( self._data = list(
map( map(
lambda e: e[1], lambda e: e[1],
filter( filter(
lambda e: e[0] not in indexes, lambda e: e[0] not in indexes,
enumerate(self.data) enumerate(self._data)
) )
) )
) )
self._status.modified() self.modified()
def delete_i(self, indexes):
list(
map(
lambda e: e[1].set_as_deleted(),
filter(
lambda e: e[0] in indexes,
enumerate(self.lst)
)
)
)
self.modified()
def delete(self, els): def delete(self, els):
self._data = list( for el in els:
filter( el.set_as_deleted()
lambda e: e not in els,
self.data self.modified()
)
)
self._status.modified()
def sort(self, _reverse=False, key=None): def sort(self, _reverse=False, key=None):
if key is None: if key is None:
self._data.sort(reverse=_reverse, key=lambda d: d[0]) self._data.sort(reverse=_reverse, key=lambda d: d[0])
else: else:
self._data.sort(reverse=_reverse, key=key) self._data.sort(reverse=_reverse, key=key)
self._status.modified()
self.modified()
def get_i(self, index): def get_i(self, index):
return self.data[index] return self.data[index]
@ -405,7 +488,7 @@ class Reservoir(SQLSubModel):
v = list(self._data[index]) v = list(self._data[index])
v[column] = value v[column] = value
self._data[index] = tuple(v) self._data[index] = tuple(v)
self._status.modified() self.modified()
def set_i_elevation(self, index: int, value): def set_i_elevation(self, index: int, value):
self._set_i_c_v(index, 0, value) self._set_i_c_v(index, 0, value)
@ -418,11 +501,11 @@ class Reservoir(SQLSubModel):
next = index - 1 next = index - 1
d = self._data d = self._data
d[index], d[next] = d[next], d[index] d[index], d[next] = d[next], d[index]
self._status.modified() self.modified()
def move_down(self, index): def move_down(self, index):
if index >= 0: if index >= 0:
prev = index + 1 prev = index + 1
d = self._data d = self._data
d[index], d[prev] = d[prev], d[index] d[index], d[prev] = d[prev], d[index]
self._status.modified() self.modified()

View File

@ -19,7 +19,7 @@
from copy import copy from copy import copy
from tools import trace, timer from tools import trace, timer
from Model.Tools.PamhyrList import PamhyrModelList from Model.Tools.PamhyrListExt import PamhyrModelList
from Model.Reservoir.Reservoir import Reservoir from Model.Reservoir.Reservoir import Reservoir
@ -39,8 +39,14 @@ class ReservoirList(PamhyrModelList):
return new return new
def _db_save(self, execute, data=None): def _db_save(self, execute, data=None):
execute("DELETE FROM reservoir") execute(
execute("DELETE FROM reservoir_data") "DELETE FROM reservoir " +
f"WHERE scenario = {self._status.scenario_id}"
)
execute(
"DELETE FROM reservoir_data " +
f"WHERE scenario = {self._status.scenario_id}"
)
if data is None: if data is None:
data = {} data = {}