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

@ -171,7 +171,7 @@ class REPLine(SQLSubModel):
return new
table = execute(
"SELECT pamhyr_id, enabled, deleted, name, line, "+
"SELECT pamhyr_id, enabled, deleted, name, line, " +
"solvers, scenario " +
"FROM rep_lines " +
f"WHERE scenario = {scenario.id} " +

View File

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

View File

@ -19,7 +19,7 @@
from copy import copy
from tools import trace, timer
from Model.Tools.PamhyrList import PamhyrModelList
from Model.Tools.PamhyrListExt import PamhyrModelList
from Model.Reservoir.Reservoir import Reservoir
@ -39,8 +39,14 @@ class ReservoirList(PamhyrModelList):
return new
def _db_save(self, execute, data=None):
execute("DELETE FROM reservoir")
execute("DELETE FROM reservoir_data")
execute(
"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:
data = {}