mirror of https://gitlab.com/pamhyr/pamhyr2
Reservoir: Prepare db update 0.1.0.
parent
5c4948bd6d
commit
aea308a5a2
|
|
@ -52,10 +52,10 @@ class Data(SQLSubModel):
|
|||
ind INTEGER NOT NULL,
|
||||
data0 TEXT NOT NULL,
|
||||
data1 TEXT NOT NULL,
|
||||
lc INTEGER,
|
||||
bc INTEGER,
|
||||
{Scenario.create_db_add_scenario()},
|
||||
{Scenario.create_db_add_scenario_fk()},
|
||||
FOREIGN KEY(lc) REFERENCES boundary_condition(pamhyr_id),
|
||||
FOREIGN KEY(bc) REFERENCES boundary_condition(pamhyr_id),
|
||||
PRIMARY KEY(pamhyr_id, scenario)
|
||||
)
|
||||
""")
|
||||
|
|
@ -67,22 +67,25 @@ class Data(SQLSubModel):
|
|||
major, minor, release = version.strip().split(".")
|
||||
|
||||
if major == "0" and int(minor) < 1:
|
||||
cls._db_update_to_0_1_0(execute)
|
||||
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):
|
||||
def _db_update_to_0_1_0(cls, execute, data):
|
||||
table = "boundary_condition_data"
|
||||
|
||||
cls.update_db_add_pamhyr_id(execute, table)
|
||||
cls.update_db_add_pamhyr_id(
|
||||
execute, table,
|
||||
data=data
|
||||
)
|
||||
Scenario.update_db_add_scenario(execute, table)
|
||||
|
||||
cls._db_create(execute, ext="_tmp")
|
||||
execute(
|
||||
f"INSERT INTO {table} " +
|
||||
"(pamhyr_id, ind, data0, data1, lc, scenario) " +
|
||||
"SELECT pamhyr_id, ind, data0, data1, lc, scenario " +
|
||||
"(pamhyr_id, ind, data0, data1, bc, scenario) " +
|
||||
"SELECT pamhyr_id, ind, data0, data1, bc, scenario " +
|
||||
f"FROM {table}"
|
||||
)
|
||||
|
||||
|
|
@ -92,12 +95,12 @@ class Data(SQLSubModel):
|
|||
@classmethod
|
||||
def _db_load(cls, execute, data=None):
|
||||
new = []
|
||||
lc = data["lc"]
|
||||
bc = data["bc"]
|
||||
|
||||
values = execute(
|
||||
"SELECT pamhyr_id, ind, data0, data1 " +
|
||||
"FROM boundary_condition_data " +
|
||||
f"WHERE lc = {lc._pamhyr_id} " +
|
||||
f"WHERE bc = {bc._pamhyr_id} " +
|
||||
"ORDER BY ind ASC"
|
||||
)
|
||||
|
||||
|
|
@ -111,12 +114,12 @@ class Data(SQLSubModel):
|
|||
|
||||
nd = cls(
|
||||
id=pid,
|
||||
types=lc._types,
|
||||
types=bc._types,
|
||||
status=data['status']
|
||||
)
|
||||
nd._data = [data0, data1]
|
||||
|
||||
new.append((ind, nd))
|
||||
new.append(nd)
|
||||
|
||||
return new
|
||||
|
||||
|
|
@ -125,12 +128,12 @@ class Data(SQLSubModel):
|
|||
ind = data["ind"]
|
||||
data0 = self._db_format(str(self[0]))
|
||||
data1 = self._db_format(str(self[1]))
|
||||
lc = data["lc"]
|
||||
bc = data["bc"]
|
||||
|
||||
sql = (
|
||||
"INSERT INTO " +
|
||||
"boundary_condition_data(pamhyr_id, ind, data0, data1, bc) " +
|
||||
f"VALUES ({pid}, {ind}, '{data0}', {data1}, {lc._pamhyr_id})"
|
||||
f"VALUES ({pid}, {ind}, '{data0}', {data1}, {bc._pamhyr_id})"
|
||||
)
|
||||
execute(sql)
|
||||
|
||||
|
|
|
|||
|
|
@ -19,50 +19,146 @@
|
|||
import logging
|
||||
|
||||
from Model.Tools.PamhyrDB import SQLSubModel
|
||||
from Model.Scenario import Scenario
|
||||
|
||||
logger = logging.getLogger()
|
||||
|
||||
class Data(SQLSubModel):
|
||||
_sub_classes = []
|
||||
|
||||
def __init__(self, id: int = -1, status=None):
|
||||
super(Data, self).__init__(id)
|
||||
self._status = status
|
||||
|
||||
self._data = []
|
||||
|
||||
@classmethod
|
||||
def _db_create(cls, execute, ext=""):
|
||||
execute(f"""
|
||||
CREATE TABLE reservoir_data{ext}(
|
||||
{cls.create_db_add_pamhyr_id()},
|
||||
ind INTEGER NOT NULL,
|
||||
elevation REAL NOT NULL,
|
||||
surface REAL NOT NULL,
|
||||
reservoir INTEGER,
|
||||
{Scenario.create_db_add_scenario()},
|
||||
{Scenario.create_db_add_scenario_fk()},
|
||||
FOREIGN KEY(reservoir) REFERENCES reservoir(pamhyr_id),
|
||||
PRIMARY KEY(pamhyr_id, scenario)
|
||||
)
|
||||
""")
|
||||
|
||||
return cls._create_submodel(execute)
|
||||
|
||||
@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 = "reservoir_data"
|
||||
|
||||
cls.update_db_add_pamhyr_id(
|
||||
execute, table,
|
||||
data=data
|
||||
)
|
||||
Scenario.update_db_add_scenario(execute, table)
|
||||
|
||||
cls._db_create(execute, ext="_tmp")
|
||||
execute(
|
||||
f"INSERT INTO {table} " +
|
||||
"(pamhyr_id, ind, elevation, surface, reservoir, scenario) " +
|
||||
"SELECT pamhyr_id, ind, elevation, surface, reservoir, 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):
|
||||
new = []
|
||||
reseroire = data["reservoir"]
|
||||
|
||||
values = execute(
|
||||
"SELECT pamhyr_id, ind, elevation, surface " +
|
||||
"FROM reservoir_data " +
|
||||
f"WHERE reservoir = {reseroire.pamhyr_id} " +
|
||||
"ORDER BY ind ASC"
|
||||
)
|
||||
|
||||
for v in values:
|
||||
it = iter(v)
|
||||
|
||||
pid = next(it)
|
||||
ind = next(it)
|
||||
elevation = next(it)
|
||||
surface = next(it)
|
||||
|
||||
nd = cls(
|
||||
id=pid, status=data['status']
|
||||
)
|
||||
nd._data = [elevation, surface]
|
||||
|
||||
new.append(nd)
|
||||
|
||||
return new
|
||||
|
||||
def _db_save(self, execute, data=None):
|
||||
pid = self._pamhyr_id
|
||||
ind = data["ind"]
|
||||
elevation = self._db_format(str(self[0]))
|
||||
surface = self._db_format(str(self[1]))
|
||||
bc = data["bc"]
|
||||
|
||||
execute(
|
||||
"INSERT INTO " +
|
||||
"reservoir_data " +
|
||||
"(pamhyr_id, ind, elevation, surface, reservoir) " +
|
||||
"VALUES (" +
|
||||
f"{pid}, {ind}, '{elevation}', {surface}, "+
|
||||
f"{reservoir._pamhyr_id}" +
|
||||
")"
|
||||
)
|
||||
|
||||
|
||||
def __getitem__(self, key):
|
||||
return self._data[key]
|
||||
|
||||
def __setitem__(self, key, value):
|
||||
self._data[key] = float(value)
|
||||
|
||||
|
||||
class Reservoir(SQLSubModel):
|
||||
_sub_classes = []
|
||||
_id_cnt = 0
|
||||
|
||||
def __init__(self, id: int = -1, name: str = "",
|
||||
def __init__(self, id: int = -1,
|
||||
name: str = "",
|
||||
status=None):
|
||||
super(Reservoir, self).__init__()
|
||||
super(Reservoir, self).__init__(id)
|
||||
|
||||
self._status = status
|
||||
|
||||
if id == -1:
|
||||
self.id = Reservoir._id_cnt
|
||||
else:
|
||||
self.id = id
|
||||
|
||||
self._name = name
|
||||
self._node = None
|
||||
self._data = []
|
||||
|
||||
Reservoir._id_cnt = max(Reservoir._id_cnt + 1, self.id)
|
||||
|
||||
@classmethod
|
||||
def _db_create(cls, execute):
|
||||
execute("""
|
||||
CREATE TABLE reservoir(
|
||||
id INTEGER NOT NULL PRIMARY KEY,
|
||||
def _db_create(cls, execute, ext=""):
|
||||
execute(f"""
|
||||
CREATE TABLE reservoir{ext} (
|
||||
{cls.create_db_add_pamhyr_id()},
|
||||
name TEXT NOT NULL,
|
||||
node INTEGER,
|
||||
FOREIGN KEY(node) REFERENCES river_node(id)
|
||||
)
|
||||
""")
|
||||
|
||||
execute("""
|
||||
CREATE TABLE reservoir_data(
|
||||
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
|
||||
ind INTEGER NOT NULL,
|
||||
elevation REAL NOT NULL,
|
||||
surface REAL NOT NULL,
|
||||
reservoir INTEGER,
|
||||
FOREIGN KEY(reservoir) REFERENCES reservoir(id)
|
||||
{Scenario.create_db_add_scenario()},
|
||||
{Scenario.create_db_add_scenario_fk()},
|
||||
FOREIGN KEY(node) REFERENCES river_node(pamhyr_id),
|
||||
PRIMARY KEY(pamhyr_id, scenario)
|
||||
)
|
||||
""")
|
||||
|
||||
|
|
@ -75,21 +171,48 @@ class Reservoir(SQLSubModel):
|
|||
if int(release) < 5:
|
||||
cls._db_create(execute)
|
||||
|
||||
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 = "reservoir"
|
||||
|
||||
cls.update_db_add_pamhyr_id(
|
||||
execute, table,
|
||||
data=data
|
||||
)
|
||||
Scenario.update_db_add_scenario(execute, table)
|
||||
|
||||
cls._db_create(execute, ext="_tmp")
|
||||
execute(
|
||||
f"INSERT INTO {table} " +
|
||||
"(pamhyr_id, name, node, scenario) " +
|
||||
"SELECT pamhyr_id, name, node, 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):
|
||||
new = []
|
||||
|
||||
table = execute(
|
||||
"SELECT id, name, node " +
|
||||
"SELECT pamhyr_id, name, node " +
|
||||
"FROM reservoir "
|
||||
)
|
||||
|
||||
for row in table:
|
||||
id = row[0]
|
||||
name = row[1]
|
||||
node_id = row[2]
|
||||
it = iter(row)
|
||||
|
||||
id = next(it)
|
||||
name = next(it)
|
||||
node_id = next(it)
|
||||
|
||||
new_reservoir = cls(id, name, status=data["status"])
|
||||
|
||||
new_reservoir._node = None
|
||||
|
|
@ -100,36 +223,34 @@ class Reservoir(SQLSubModel):
|
|||
)
|
||||
)
|
||||
|
||||
new_data = []
|
||||
table = execute(
|
||||
"SELECT elevation, surface " +
|
||||
"FROM reservoir_data " +
|
||||
f"WHERE reservoir = {id} " +
|
||||
"ORDER BY ind ASC"
|
||||
data["reservoir"] = new_reservoir
|
||||
new_reservoir._data = Data._db_load(
|
||||
execute, data=data
|
||||
)
|
||||
for t in table:
|
||||
new_data.append((t[0], t[1]))
|
||||
|
||||
new_reservoir._data = new_data
|
||||
|
||||
new.append(new_reservoir)
|
||||
|
||||
return new
|
||||
|
||||
def _db_save(self, execute, data=None):
|
||||
execute(
|
||||
"DELETE FROM reservoir " +
|
||||
f"WHERE pamhyr_id = {self.pamhyr_id}"
|
||||
)
|
||||
execute(
|
||||
"DELETE FROM reservoir_data " +
|
||||
f"WHERE reservoir = {self.pamhyr_id}"
|
||||
)
|
||||
|
||||
execute(f"DELETE FROM reservoir WHERE id = {self.id}")
|
||||
execute(f"DELETE FROM reservoir_data WHERE reservoir = {self.id}")
|
||||
|
||||
node_id = -1
|
||||
node_id = 'NULL'
|
||||
if self._node is not None:
|
||||
node_id = self._node.id
|
||||
node_id = self._node.pamhyr_id
|
||||
|
||||
sql = (
|
||||
"INSERT INTO " +
|
||||
"reservoir(id, name, node) " +
|
||||
"VALUES (" +
|
||||
f"{self.id}, '{self._db_format(self._name)}', " +
|
||||
f"{self.pamhyr_id}, '{self._db_format(self._name)}', " +
|
||||
f"{node_id}" +
|
||||
")"
|
||||
)
|
||||
|
|
@ -137,12 +258,10 @@ class Reservoir(SQLSubModel):
|
|||
|
||||
ind = 0
|
||||
for d in self._data:
|
||||
sql = (
|
||||
"INSERT INTO " +
|
||||
"reservoir_data(ind, elevation, surface, reservoir) " +
|
||||
f"VALUES ({ind}, '{d[0]}', {d[1]}, {self.id})"
|
||||
)
|
||||
execute(sql)
|
||||
data["ind"] = ind
|
||||
|
||||
d._db_save(execute, data)
|
||||
|
||||
ind += 1
|
||||
|
||||
return True
|
||||
|
|
@ -153,7 +272,7 @@ class Reservoir(SQLSubModel):
|
|||
@property
|
||||
def name(self):
|
||||
if self._name == "":
|
||||
return f"R{self.id + 1}"
|
||||
return f"Reservoir #{self.pamhyr_id}"
|
||||
|
||||
return self._name
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue