Compare commits

..

5 Commits

8 changed files with 399 additions and 194 deletions

View File

@ -147,27 +147,48 @@ class BoundaryConditionAdisTS(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
status = data['status']
nodes = data['nodes']
scenario = data["scenario"]
loaded = data['loaded_pid']
if scenario is None:
return new
table = execute( table = execute(
"SELECT pamhyr_id, pollutant, type, node " + "SELECT pamhyr_id, pollutant, type, node, scenario " +
"FROM boundary_condition_adists" "FROM boundary_condition_adists " +
f"WHERE scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) "
) )
if table is not None: if table is not None:
for row in table: for row in table:
it = iter(row)
pid = next(it)
pollutant = next(it)
bc_type = next(it)
node = next(it)
owner_scenario = next(it)
bc = cls( bc = cls(
id=row[0], id=pid,
pollutant=row[1], pollutant=pollutant,
status=data['status'] status=status,
owner_scenario=owner_scenario
) )
bc.type = row[2] bc.type = bc_type
bc.node = None bc.node = None
if row[3] != -1: if row[3] != -1:
tmp = next(filter( tmp = next(
lambda n: n.id == row[3], data["nodes"]), filter(
None) lambda n: n.id == node, nodes
),
None
)
if tmp is not None: if tmp is not None:
bc.node = tmp.id bc.node = tmp.id
else: else:
@ -176,7 +197,8 @@ class BoundaryConditionAdisTS(SQLSubModel):
values = execute( values = execute(
"SELECT data0, data1 FROM " + "SELECT data0, data1 FROM " +
"boundary_condition_data_adists " + "boundary_condition_data_adists " +
f"WHERE bc = '{bc.id}'" f"WHERE bc = '{bc.id}' " +
f"AND scenario = {scenario.id}"
) )
# Write data # Write data
@ -186,40 +208,55 @@ class BoundaryConditionAdisTS(SQLSubModel):
# Replace data at pos ind # Replace data at pos ind
bc._data.append((data0, data1)) bc._data.append((data0, data1))
loaded.add(pid)
new.append(bc) new.append(bc)
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(f"DELETE FROM boundary_condition_adists WHERE id = {self.id}") execute(
execute(f"DELETE FROM boundary_condition_data_adists" + "DELETE FROM boundary_condition_adists " +
f" WHERE bc = {self.id}") f"WHERE pamhyr_id = {self.id} " +
f"AND scenario = {self._status.scenario_id} "
)
execute(
"DELETE FROM boundary_condition_data_adists " +
f"WHERE bc = {self.id} " +
f"AND scenario = {self._status.scenario_id} "
)
node = -1 node = -1
if self._node is not None: if self._node is not None:
node = self._node node = self._node
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"boundary_condition_adists(id, pollutant, type, node) " + "boundary_condition_adists(id, pollutant, type, " +
"node, scenario) " +
"VALUES (" + "VALUES (" +
f"{self.id}, {self._pollutant}, " + f"{self.id}, {self._pollutant}, " +
f"'{self._db_format(self._type)}', {node}" + f"'{self._db_format(self._type)}', {node}, " +
f"{self._status.scenario_id}" +
")" ")"
) )
execute(sql)
for d in self._data: for d in self._data:
data0 = self._db_format(str(d[0])) data0 = self._db_format(str(d[0]))
data1 = self._db_format(str(d[1])) data1 = self._db_format(str(d[1]))
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"boundary_condition_data_adists(data0, data1, bc) " + "boundary_condition_data_adists(data0, data1, bc, scenario) " +
f"VALUES ('{data0}', {data1}, {self.id})" f"VALUES ('{data0}', {data1}, {self.id}, " +
f"{self._status.scenario_id})"
) )
execute(sql)
return True return True

View File

@ -36,8 +36,7 @@ class D90AdisTS(SQLSubModel):
] ]
def __init__(self, id: int = -1, name: str = "default", def __init__(self, id: int = -1, name: str = "default",
status=None, status=None, owner_scenario=-1):
owner_scenario=-1):
super(D90AdisTS, self).__init__( super(D90AdisTS, self).__init__(
id=id, status=status, id=id, status=status,
owner_scenario=owner_scenario owner_scenario=owner_scenario
@ -99,59 +98,82 @@ class D90AdisTS(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
status = data['status']
scenario = data["scenario"]
loaded = data['loaded_pid']
if scenario is None:
return new
table = execute( table = execute(
"SELECT pamhyr_id, name, d90, enabled " + "SELECT pamhyr_id, name, d90, enabled, scenario " +
"FROM d90_adists" "FROM d90_adists " +
f"WHERE scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) "
) )
if table is not None: if table is not None:
for row in table: for row in table:
d90_id = row[0] it = iter(row)
name = row[1]
d90 = row[2]
enabled = (row[3] == 1)
D90 = cls( d90_id = next(it)
name = next(it)
value_d90 = next(it)
enabled = (next(it) == 1)
owner_scenario = next(it)
d90 = cls(
id=d90_id, id=d90_id,
name=name, name=name,
status=data['status'] status=status,
owner_scenario=owner_scenario
) )
D90.d90 = d90 d90.d90 = value_d90
D90.enabled = enabled d90.enabled = enabled
data['d90_default_id'] = d90_id data['d90_default_id'] = d90_id
D90._data = D90AdisTSSpec._db_load(execute, data) d90._data = d90AdisTSSpec._db_load(execute, data)
new.append(D90) loaded.add(pid)
new.append(d90)
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):
execute(f"DELETE FROM d90_adists WHERE pamhyr_id = {self.id}") if not self.must_be_saved():
return True
execute(
f"DELETE FROM d90_adists " +
f"WHERE pamhyr_id = {self.id} " +
f"AND scenario = {self._status.scenario_id} "
)
d90 = -1. d90 = -1.
if self.d90 is not None: if self.d90 is not None:
d90 = self.d90 d90 = self.d90
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"d90_adists(" + "d90_adists(" +
"pamhyr_id, name, d90, enabled" + "pamhyr_id, name, d90, enabled, scenario" +
") " + ") " +
"VALUES (" + "VALUES (" +
f"{self.id}, '{self._db_format(self._name)}', " + f"{self.id}, '{self._db_format(self._name)}', " +
f"{d90}, {self._enabled}" + f"{d90}, {self._enabled}, {self._status.scenario_id}" +
")" ")"
) )
execute(sql)
data['d90_default_id'] = self.id data['d90_default_id'] = self.id
execute( execute(
"DELETE FROM d90_spec " + "DELETE FROM d90_spec " +
f"WHERE d90_default = {self.id}" f"WHERE d90_default = {self.id} " +
f"AND scenario = {self._status.scenario_id} "
) )
for d90_spec in self._data: for d90_spec in self._data:
@ -169,7 +191,7 @@ class D90AdisTS(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 d90(self): def d90(self):
@ -178,7 +200,7 @@ class D90AdisTS(SQLSubModel):
@d90.setter @d90.setter
def d90(self, d90): def d90(self, d90):
self._d90 = d90 self._d90 = d90
self._status.modified() self.modified()
@property @property
def enabled(self): def enabled(self):
@ -187,12 +209,12 @@ class D90AdisTS(SQLSubModel):
@enabled.setter @enabled.setter
def enabled(self, enabled): def enabled(self, enabled):
self._enabled = enabled self._enabled = enabled
self._status.modified() self.modified()
def new(self, index): def new(self, index):
n = D90AdisTSSpec(status=self._status) n = D90AdisTSSpec(status=self._status)
self._data.insert(index, n) self._data.insert(index, n)
self._status.modified() self.modified()
return n return n
def delete(self, data): def delete(self, data):
@ -202,13 +224,13 @@ class D90AdisTS(SQLSubModel):
self._data self._data
) )
) )
self._status.modified() self.modified()
def delete_i(self, indexes): def delete_i(self, indexes):
for ind in indexes: for ind in indexes:
del self._data[ind] del self._data[ind]
self._status.modified() self.modified()
def insert(self, index, data): def insert(self, index, data):
self._data.insert(index, data) self._data.insert(index, data)
self._status.modified() self.modified()

View File

@ -33,15 +33,11 @@ class D90AdisTSSpec(SQLSubModel):
_id_cnt = 0 _id_cnt = 0
def __init__(self, id: int = -1, name: str = "", def __init__(self, id: int = -1, name: str = "",
status=None): status=None, owner_scenario=-1):
super(D90AdisTSSpec, self).__init__() super(D90AdisTSSpec, self).__init__(
id=id, status=status,
self._status = status owner_scenario=owner_scenario
)
if id == -1:
self.id = D90AdisTSSpec._id_cnt
else:
self.id = id
self._name_section = name self._name_section = name
self._reach = None self._reach = None
@ -50,8 +46,6 @@ class D90AdisTSSpec(SQLSubModel):
self._d90 = None self._d90 = None
self._enabled = True self._enabled = True
D90AdisTSSpec._id_cnt = max(D90AdisTSSpec._id_cnt + 1, self.id)
@classmethod @classmethod
def _db_create(cls, execute, ext=""): def _db_create(cls, execute, ext=""):
execute(f""" execute(f"""
@ -108,28 +102,40 @@ class D90AdisTSSpec(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
status = data['status']
scenario = data["scenario"]
loaded = data['loaded_pid']
if scenario is None:
return new
table = execute( table = execute(
"SELECT id, d90_default, name, reach, start_rk, end_rk, " + "SELECT id, name, reach, start_rk, end_rk, " +
"d90, enabled " + "d90, enabled, scenario " +
"FROM d90_spec " + "FROM d90_adists_spec " +
f"WHERE d90_default = {data['d90_default_id']} " f"WHERE d90_default = {data['d90_default_id']} " +
f"AND scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) "
) )
if table is not None: if table is not None:
for row in table: for row in table:
id = row[0] it = iter(row)
name = row[2]
reach = row[3] pid = next(it)
start_rk = row[4] name = next(it)
end_rk = row[5] reach = next(it)
d90 = row[6] start_rk = next(it)
enabled = (row[7] == 1) end_rk = next(it)
d90 = next(it)
enabled = (next(it) == 1)
owner_scenario = next(it)
new_spec = cls( new_spec = cls(
id=id, id=pid,
name=name, name=name,
status=data['status'] status=status,
owner_scenario=owner_scenario
) )
new_spec.reach = reach new_spec.reach = reach
@ -138,29 +144,34 @@ class D90AdisTSSpec(SQLSubModel):
new_spec.d90 = d90 new_spec.d90 = d90
new_spec.enabled = enabled new_spec.enabled = enabled
loaded.add(pid)
new.append(new_spec) new.append(new_spec)
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
d90_default = data['d90_default_id'] d90_default = data['d90_default_id']
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"d90_spec(id, d90_default, name, reach, " + "d90_spec(pamhyr_id, d90_default, name, reach, " +
"start_rk, end_rk, d90, enabled) " + "start_rk, end_rk, d90, enabled, scenario) " +
"VALUES (" + "VALUES (" +
f"{self.id}, " + f"{self.id}, {d90_default}, " +
f"{d90_default}, " +
f"'{self._db_format(self._name_section)}', " + f"'{self._db_format(self._name_section)}', " +
f"{self._reach}, " + f"{self._reach}, " +
f"{self._start_rk}, " + f"{self._start_rk}, {self._end_rk}, " +
f"{self._end_rk}, " + f"{self._d90}, {self._enabled}" +
f"{self._d90}, " + f"{self._status.scenario_id}" +
f"{self._enabled}" +
")" ")"
) )
execute(sql)
return True return True
@ -171,7 +182,7 @@ class D90AdisTSSpec(SQLSubModel):
@name.setter @name.setter
def name(self, name): def name(self, name):
self._name_section = name self._name_section = name
self._status.modified() self.modified()
@property @property
def reach(self): def reach(self):
@ -180,7 +191,7 @@ class D90AdisTSSpec(SQLSubModel):
@reach.setter @reach.setter
def reach(self, reach): def reach(self, reach):
self._reach = reach self._reach = reach
self._status.modified() self.modified()
@property @property
def start_rk(self): def start_rk(self):
@ -189,7 +200,7 @@ class D90AdisTSSpec(SQLSubModel):
@start_rk.setter @start_rk.setter
def start_rk(self, start_rk): def start_rk(self, start_rk):
self._start_rk = start_rk self._start_rk = start_rk
self._status.modified() self.modified()
@property @property
def end_rk(self): def end_rk(self):
@ -198,7 +209,7 @@ class D90AdisTSSpec(SQLSubModel):
@end_rk.setter @end_rk.setter
def end_rk(self, end_rk): def end_rk(self, end_rk):
self._end_rk = end_rk self._end_rk = end_rk
self._status.modified() self.modified()
@property @property
def d90(self): def d90(self):
@ -207,7 +218,7 @@ class D90AdisTSSpec(SQLSubModel):
@d90.setter @d90.setter
def d90(self, d90): def d90(self, d90):
self._d90 = d90 self._d90 = d90
self._status.modified() self.modified()
@property @property
def enabled(self): def enabled(self):
@ -216,4 +227,4 @@ class D90AdisTSSpec(SQLSubModel):
@enabled.setter @enabled.setter
def enabled(self, enabled): def enabled(self, enabled):
self._enabled = enabled self._enabled = enabled
self._status.modified() self.modified()

View File

@ -105,43 +105,67 @@ class DIFAdisTS(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
status = data['status']
scenario = data["scenario"]
loaded = data['loaded_pid']
if scenario is None:
return new
table = execute( table = execute(
"SELECT pamhyr_id, name, method, dif, b, c, enabled " + "SELECT pamhyr_id, name, method, dif, b, c, enabled, scenario " +
"FROM dif_adists" "FROM dif_adists " +
f"WHERE scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) "
) )
if table is not None: if table is not None:
for row in table: for row in table:
dif_id = row[0] it = iter(row)
name = row[1]
method = row[2]
dif = row[3]
b = row[4]
c = row[5]
enabled = (row[6] == 1)
DIF = cls( pid = next(it)
id=dif_id, name = next(it)
method = next(it)
dif = next(it)
b = next(it)
c = next(it)
enabled = (next(it) == 1)
owner_scenario = next(it)
dif = cls(
id=pid,
name=name, name=name,
status=data['status'] status=status,
owner_scenario=owner_scenario,
) )
DIF.method = method dif.method = method
DIF.dif = dif dif.dif = dif
DIF.b = b dif.b = b
DIF.c = c dif.c = c
DIF.enabled = enabled dif.enabled = enabled
data['dif_default_id'] = dif_id data['dif_default_id'] = pid
DIF._data = DIFAdisTSSpec._db_load(execute, data) dif._data = difAdisTSSpec._db_load(execute, data)
new.append(DIF) loaded.add(pid)
new.append(dif)
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):
execute(f"DELETE FROM dif_adists WHERE id = {self.id}") if not self.must_be_saved():
return True
execute(
"DELETE FROM dif_adists " +
f"WHERE pamhyr_id = {self.id} " +
f"AND scenario = {self._status.scenario_id} "
)
method = "" method = ""
if self.method is not None: if self.method is not None:
@ -162,12 +186,13 @@ class DIFAdisTS(SQLSubModel):
sql = ( sql = (
"INSERT INTO " + "INSERT INTO " +
"dif_adists(" + "dif_adists(" +
"pamhyr_id, name, method, dif, b, c, enabled" + "pamhyr_id, name, method, dif, b, c, enabled, scenario" +
") " + ") " +
"VALUES (" + "VALUES (" +
f"{self.id}, '{self._db_format(self._name)}', " + f"{self.id}, '{self._db_format(self._name)}', " +
f"'{self._db_format(self._method)}', " + f"'{self._db_format(self._method)}', " +
f"{dif}, {b}, {c}, {self._enabled}" + f"{dif}, {b}, {c}, {self._enabled}" +
f"{self._status.scenario_id}" +
")" ")"
) )
@ -176,7 +201,8 @@ class DIFAdisTS(SQLSubModel):
data['dif_default_id'] = self.id data['dif_default_id'] = self.id
execute( execute(
"DELETE FROM dif_adists_spec " + "DELETE FROM dif_adists_spec " +
f"WHERE dif_default = {self.id}" f"WHERE dif_default = {self.id} " +
f"AND scenario = {self._status.scenario_id} "
) )
for dif_spec in self._data: for dif_spec in self._data:
@ -194,7 +220,7 @@ class DIFAdisTS(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 method(self): def method(self):
@ -203,7 +229,7 @@ class DIFAdisTS(SQLSubModel):
@method.setter @method.setter
def method(self, method): def method(self, method):
self._method = method self._method = method
self._status.modified() self.modified()
@property @property
def types(self): def types(self):
@ -216,7 +242,7 @@ class DIFAdisTS(SQLSubModel):
@dif.setter @dif.setter
def dif(self, dif): def dif(self, dif):
self._dif = dif self._dif = dif
self._status.modified() self.modified()
@property @property
def b(self): def b(self):
@ -225,7 +251,7 @@ class DIFAdisTS(SQLSubModel):
@b.setter @b.setter
def b(self, b): def b(self, b):
self._b = b self._b = b
self._status.modified() self.modified()
@property @property
def c(self): def c(self):
@ -234,7 +260,7 @@ class DIFAdisTS(SQLSubModel):
@c.setter @c.setter
def c(self, c): def c(self, c):
self._c = c self._c = c
self._status.modified() self.modified()
@property @property
def enabled(self): def enabled(self):
@ -243,12 +269,12 @@ class DIFAdisTS(SQLSubModel):
@enabled.setter @enabled.setter
def enabled(self, enabled): def enabled(self, enabled):
self._enabled = enabled self._enabled = enabled
self._status.modified() self.modified()
def new(self, index): def new(self, index):
n = DIFAdisTSSpec(status=self._status) n = DIFAdisTSSpec(status=self._status)
self._data.insert(index, n) self._data.insert(index, n)
self._status.modified() self.modified()
return n return n
def delete(self, data): def delete(self, data):
@ -258,13 +284,13 @@ class DIFAdisTS(SQLSubModel):
self._data self._data
) )
) )
self._status.modified() self.modified()
def delete_i(self, indexes): def delete_i(self, indexes):
for ind in indexes: for ind in indexes:
del self._data[ind] del self._data[ind]
self._status.modified() self.modified()
def insert(self, index, data): def insert(self, index, data):
self._data.insert(index, data) self._data.insert(index, data)
self._status.modified() self.modified()

View File

@ -115,30 +115,42 @@ class DIFAdisTSSpec(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
status = data['status']
scenario = data["scenario"]
loaded = data['loaded_pid']
if scenario is None:
return new
table = execute( table = execute(
"SELECT id, dif_default, method, reach, start_rk, end_rk, " + "SELECT id, method, reach, start_rk, end_rk, " +
"dif, b, c, enabled " + "dif, b, c, enabled, scenario " +
"FROM dif_spec " + "FROM dif_spec " +
f"WHERE dif_default = {data['dif_default_id']} " f"WHERE dif_default = {data['dif_default_id']} " +
f"AND scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))}) "
) )
if table is not None: if table is not None:
for row in table: for row in table:
id = row[0] it = iter(row)
method = row[2]
reach = row[3] id = next(it)
start_rk = row[4] method = next(it)
end_rk = row[5] reach = next(it)
dif = row[6] start_rk = next(it)
b = row[7] end_rk = next(it)
c = row[8] dif = next(it)
enabled = (row[9] == 1) b = next(it)
c = next(it)
enabled = (next(it) == 1)
owner_scenario = next(it)
new_spec = cls( new_spec = cls(
id=id, id=id,
method=method, method=method,
status=data['status'] status=status,
owner_scenario=owner_scenario
) )
new_spec.reach = reach new_spec.reach = reach
@ -149,31 +161,35 @@ class DIFAdisTSSpec(SQLSubModel):
new_spec.c = c new_spec.c = c
new_spec.enabled = enabled new_spec.enabled = enabled
loaded.add(pid)
new.append(new_spec) new.append(new_spec)
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
dif_default = data['dif_default_id'] dif_default = data['dif_default_id']
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"dif_spec(id, dif_default, method, reach, " + "dif_spec(id, dif_default, method, reach, " +
"start_rk, end_rk, dif, b, c, enabled) " + "start_rk, end_rk, dif, b, c, enabled, scenario) " +
"VALUES (" + "VALUES (" +
f"{self.id}, " + f"{self.id}, {dif_default}, " +
f"{dif_default}, " +
f"'{self._db_format(self._method)}', " + f"'{self._db_format(self._method)}', " +
f"{self._reach}, " + f"{self._reach}, " +
f"{self._start_rk}, " + f"{self._start_rk}, {self._end_rk}, " +
f"{self._end_rk}, " + f"{self._dif}, {self._b}, {self._c}, " +
f"{self._dif}, " +
f"{self._b}, " +
f"{self._c}, " +
f"{self._enabled}" + f"{self._enabled}" +
f"{self._status.scenario_id}" +
")" ")"
) )
execute(sql)
return True return True

View File

@ -102,7 +102,7 @@ class InitialConditionsAdisTS(SQLSubModel):
"(pamhyr_id, pollutant, name, concentration, " + "(pamhyr_id, pollutant, name, concentration, " +
"eg, em, ed, scenario) " + "eg, em, ed, scenario) " +
"SELECT pamhyr_id, pollutant, name, concentration, " + "SELECT pamhyr_id, pollutant, name, concentration, " +
"eg, em, ed, scenario) " + "eg, em, ed, scenario " +
f"FROM {table}" f"FROM {table}"
) )

View File

@ -43,8 +43,6 @@ class OutputRKAdists(SQLSubModel):
owner_scenario=owner_scenario owner_scenario=owner_scenario
) )
self._status = status
self._reach = reach self._reach = reach
self._rk = rk self._rk = rk
self._title = str(title) self._title = str(title)
@ -131,48 +129,67 @@ class OutputRKAdists(SQLSubModel):
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
status = data['status']
scenario = data["scenario"]
loaded = data['loaded_pid']
# reach = data["reach"] # reach = data["reach"]
# profile = data["profile"] # profile = data["profile"]
status = data["status"]
if scenario is None:
return new
table = execute( table = execute(
"SELECT pamhyr_id, reach, rk, title " + "SELECT pamhyr_id, reach, rk, title, scenario " +
f"FROM OutputRKAdists" f"FROM OutputRKAdists"
) )
if table is not None: if table is not None:
for row in table: for row in table:
id = row[0] it = iter(row)
id_reach = row[1]
id_rk = row[2] pid = next(it)
title = row[3] id_reach = next(it)
id_rk = next(it)
title = next(it)
owner_scenario = next(it)
new_output = cls( new_output = cls(
id=id, reach=id_reach, id=pid, reach=id_reach,
rk=id_rk, title=title, rk=id_rk, title=title,
status=status status=status,
owner_scenario=owner_scenario,
) )
loaded.add(pid)
new.append(new_output) new.append(new_output)
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(f"DELETE FROM OutputRKAdists WHERE id = {self.id}") execute(
"DELETE FROM OutputRKAdists " +
f"WHERE pamhyr_id = {self.id} " +
f"AND scenario = {self._status.scenario_id} "
)
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"OutputRKAdists(pamhyr_id, reach, rk, title) " + "OutputRKAdists(pamhyr_id, reach, rk, title, scenario) " +
"VALUES (" + "VALUES (" +
f"{self.id}, {self._reach}, {self._rk}, " + f"{self.id}, {self._reach}, {self._rk}, " +
f"'{self._db_format(self._title)}'" + f"'{self._db_format(self._title)}'" +
f"{self._status.scenario_id}" +
")" ")"
) )
execute(sql)
return True return True
@property @property

View File

@ -27,20 +27,20 @@ from tools import (
from Model.Tools.PamhyrDB import SQLSubModel from Model.Tools.PamhyrDB import SQLSubModel
from Model.Except import NotImplementedMethodeError from Model.Except import NotImplementedMethodeError
from Model.Scenario import Scenario
logger = logging.getLogger() logger = logging.getLogger()
class Pollutants(SQLSubModel): class Pollutants(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, owner_scenario=-1):
owner_scenario=-1):
super(Pollutants, self).__init__( super(Pollutants, self).__init__(
id=id, status=status, id=id, status=status,
owner_scenario=owner_scenario) owner_scenario=owner_scenario
)
self._status = status self._status = status
@ -52,9 +52,6 @@ class Pollutants(SQLSubModel):
self._data = [] self._data = []
Pollutants._id_cnt = max(
Pollutants._id_cnt + 1, self.id)
@property @property
def name(self): def name(self):
return self._name return self._name
@ -69,17 +66,26 @@ class Pollutants(SQLSubModel):
return self._data.copy() return self._data.copy()
@classmethod @classmethod
def _db_create(cls, execute): def _db_create(cls, execute, ext=""):
execute(""" cls._db_create_pol(execute, ext=ext)
CREATE TABLE Pollutants( cls._db_create_pol_char(execute, ext=ext)
id INTEGER NOT NULL PRIMARY KEY,
name TEXT NOT NULL UNIQUE @classmethod
def _db_create_pol(cls, execute, ext=""):
execute(f"""
CREATE TABLE pollutants{ext}(
{cls.create_db_add_pamhyr_id()},
name TEXT NOT NULL UNIQUE,
{Scenario.create_db_add_scenario()},
{Scenario.create_db_add_scenario_fk()}
) )
""") """)
execute(""" @classmethod
CREATE TABLE Pollutants_characteristics( def _db_create_pol_char(cls, execute, ext=""):
id INTEGER NOT NULL PRIMARY KEY, execute(f"""
CREATE TABLE pollutants_characteristics{ext}(
{cls.create_db_add_pamhyr_id()},
type INTEGER NOT NULL, type INTEGER NOT NULL,
diametre REAL NOT NULL, diametre REAL NOT NULL,
rho REAL NOT NULL, rho REAL NOT NULL,
@ -90,7 +96,9 @@ class Pollutants(SQLSubModel):
ac REAL NOT NULL, ac REAL NOT NULL,
bc REAL NOT NULL, bc REAL NOT NULL,
pollutant INTEGER NOT NULL, pollutant INTEGER NOT NULL,
FOREIGN KEY(pollutant) REFERENCES Pollutants(id) {Scenario.create_db_add_scenario()},
{Scenario.create_db_add_scenario_fk()},
FOREIGN KEY(pollutant) REFERENCES pollutants(pamhyr_id)
) )
""") """)
@ -103,17 +111,70 @@ class Pollutants(SQLSubModel):
if int(release) < 7: if int(release) < 7:
cls._db_create(execute) cls._db_create(execute)
elif major == "0" and int(minor) < 2:
cls._db_update_to_0_2_0(execute, data)
cls._db_update_to_0_2_0_char(execute, data)
return True return True
@classmethod
def _db_update_to_0_2_0(cls, execute, data):
table = "Pollutants"
table_new = "pollutants"
cls.update_db_add_pamhyr_id(execute, table, data)
Scenario.update_db_add_scenario(execute, table)
cls._db_create_lca(execute, ext="_tmp")
execute(
f"INSERT INTO {table_new}_tmp " +
"(pamhyr_id, name, scenario) " +
"SELECT pamhyr_id, name, scenario) " +
f"FROM {table}"
)
execute(f"DROP TABLE {table}")
execute(f"ALTER TABLE {table_new}_tmp RENAME TO {table_new}")
@classmethod
def _db_update_to_0_2_0_char(cls, execute, data):
table = "Pollutants_characteristics"
table_new = "pollutants_characteristics"
cls.update_db_add_pamhyr_id(execute, table, data)
Scenario.update_db_add_scenario(execute, table)
cls._db_create_lca(execute, ext="_tmp")
execute(
f"INSERT INTO {table_new}_tmp " +
"(pamhyr_id, type, diametre, rho, porosity, " +
"cdc_riv, cdc_cas, apd, ac, bc, pollutant, scenario) " +
"SELECT pamhyr_id, type, diametre, rho, porosity, " +
"cdc_riv, cdc_cas, apd, ac, bc, pollutant, scenario " +
f"FROM {table}"
)
execute(f"DROP TABLE {table}")
execute(f"ALTER TABLE {table_new}_tmp RENAME TO {table_new}")
@classmethod @classmethod
def _db_load(cls, execute, data=None): def _db_load(cls, execute, data=None):
new = [] new = []
status = data["status"] status = data["status"]
scenario = data["scenario"]
loaded = data['loaded_pid']
if scenario is None:
return new
table = execute( table = execute(
"SELECT id, name " + "SELECT pamhyr_id, name FROM pollutants " +
f"FROM Pollutants" f"WHERE scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))})"
) )
if table is not None: if table is not None:
@ -129,8 +190,10 @@ class Pollutants(SQLSubModel):
new_data = [] new_data = []
table = execute( table = execute(
"SELECT * " + "SELECT * " +
"FROM Pollutants_characteristics " + "FROM pollutants_characteristics " +
f"WHERE pollutant = {id}" f"WHERE pollutant = {id}" +
f"AND scenario = {scenario.id} " +
f"AND pamhyr_id NOT IN ({', '.join(map(str, loaded))})"
) )
if table is not None: if table is not None:
@ -139,36 +202,49 @@ class Pollutants(SQLSubModel):
new_pollutant._data.append(new_data) new_pollutant._data.append(new_data)
loaded.add(pid)
new.append(new_pollutant) new.append(new_pollutant)
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(f"DELETE FROM Pollutants WHERE id = {self.id}") execute(
execute(f"DELETE FROM Pollutants_characteristics" + "DELETE FROM pollutants " +
f" WHERE pollutant = {self.id}") f"WHERE pamhyr_id = {self.id} " +
f"AND scenario = {self._status.scenario_id}"
)
execute(
f"DELETE FROM pollutants_characteristics " +
f"WHERE pollutant = {self.id} " +
f"AND scenario = {self._status.scenario_id}"
)
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"Pollutants(id, name) " + "pollutants(id, name, scenario) " +
"VALUES (" + "VALUES (" +
f"{self.id}, " + f"{self.id}, " +
f"'{self._db_format(self._name)}'" + f"'{self._db_format(self._name)}', " +
f"{self._status.scenario_id}" +
")" ")"
) )
execute(sql)
for d in self._data: for d in self._data:
sql = ( execute(
"INSERT INTO " + "INSERT INTO " +
"Pollutants_characteristics(type, diametre, rho, porosity, " + "pollutants_characteristics(type, diametre, rho, porosity, " +
"cdc_riv, cdc_cas, apd, ac, bc, pollutant) " + "cdc_riv, cdc_cas, apd, ac, bc, pollutant, scenario) " +
f"VALUES ({d[0]}, {d[1]}, {d[2]},{d[3]}, {d[4]}, " f"VALUES ({d[0]}, {d[1]}, {d[2]},{d[3]}, {d[4]}, "
f"{d[5]}, {d[6]}, {d[7]}, {d[8]}, {self.id})" f"{d[5]}, {d[6]}, {d[7]}, {d[8]}, {self.id}, " +
f"{self._status.scenario_id})"
) )
execute(sql)
return True return True