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