mirror of https://gitlab.com/pamhyr/pamhyr2
Scenario: Add memory clean for Pamhyr list, dict and reaches.
parent
2c0b155baf
commit
f9d83ac68c
|
|
@ -103,6 +103,9 @@ class Reach(SQLSubModel):
|
|||
predicate=lambda obj, data: True,
|
||||
modifier=lambda obj, data: None,
|
||||
data={}):
|
||||
if predicate(self, data):
|
||||
modifier(self, data)
|
||||
|
||||
for p in self._profiles:
|
||||
p._data_traversal(predicate, modifier, data)
|
||||
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
import os
|
||||
import logging
|
||||
|
||||
from tools import logger_exception
|
||||
from tools import logger_exception, timer, flatten
|
||||
|
||||
from Model.Tools.PamhyrDB import SQLSubModel
|
||||
|
||||
|
|
@ -225,10 +225,13 @@ class Scenario(SQLSubModel):
|
|||
|
||||
return aux(self, [])
|
||||
|
||||
def drop_deleted_data(self, execute):
|
||||
@timer
|
||||
def clean_deleted_data(self, execute):
|
||||
tables = self.tables_with_deleted_column
|
||||
branch = self.get_parent_branch()
|
||||
|
||||
all_ids = []
|
||||
|
||||
for table in tables:
|
||||
if self.parent is None:
|
||||
# This scenario is the default scenario, so we can
|
||||
|
|
@ -257,17 +260,23 @@ class Scenario(SQLSubModel):
|
|||
if ids is None or len(ids) == 0:
|
||||
continue
|
||||
|
||||
ids = flatten(ids)
|
||||
|
||||
logger.debug(
|
||||
f"(s{self.id}) Drop deleted data into '{table}' : {ids}"
|
||||
f"({self.name}) Drop deleted data into '{table}' : {ids}"
|
||||
)
|
||||
|
||||
execute(
|
||||
f"DELETE FROM {table} " +
|
||||
f"WHERE scenario = {self.id} " +
|
||||
"AND pamhyr_id IN " +
|
||||
f"({', '.join(map(lambda x: str(x[0]), ids))})"
|
||||
f"({', '.join(map(str, ids))})"
|
||||
)
|
||||
|
||||
all_ids += ids
|
||||
|
||||
return all_ids
|
||||
|
||||
@property
|
||||
def id(self):
|
||||
return self._id
|
||||
|
|
|
|||
|
|
@ -24,12 +24,15 @@ from datetime import datetime
|
|||
from tools import timer, timestamp
|
||||
from functools import reduce
|
||||
|
||||
from Model.Tools.PamhyrListExt import PamhyrModelList
|
||||
from Model.Tools.PamhyrDict import PamhyrModelDict
|
||||
from Model.Tools.PamhyrDB import SQLModel
|
||||
from Model.Scenarios import Scenarios
|
||||
from Model.Scenario import Scenario
|
||||
from Model.Status import StudyStatus
|
||||
from Model.Except import NotImplementedMethodeError
|
||||
from Model.River import River
|
||||
from Model.Geometry.Reach import Reach
|
||||
|
||||
from Checker.Study import *
|
||||
|
||||
|
|
@ -450,14 +453,48 @@ class Study(SQLModel):
|
|||
data=progress
|
||||
)
|
||||
|
||||
# Clear DB for each scenarios
|
||||
for scenar in self.scenarios.lst:
|
||||
scenar.drop_deleted_data(self.execute)
|
||||
# Clear DB for current scenario
|
||||
ids = self.status.scenario.clean_deleted_data(self.execute)
|
||||
self.memory_clean(ids)
|
||||
|
||||
progress()
|
||||
|
||||
self.commit()
|
||||
|
||||
@timer
|
||||
def memory_clean(self, ids):
|
||||
list_classes = set(PamhyrModelList.__subclasses__())
|
||||
dict_classes = set(PamhyrModelDict.__subclasses__())
|
||||
reach_class = Reach
|
||||
|
||||
def modifier(obj, data):
|
||||
t = type(obj)
|
||||
|
||||
if t in list_classes:
|
||||
obj._lst = list(
|
||||
filter(
|
||||
lambda el: el.id not in ids,
|
||||
obj._lst
|
||||
)
|
||||
)
|
||||
elif t in dict_classes:
|
||||
new = {}
|
||||
for key in obj._dict:
|
||||
if obj._dict[key].id not in ids:
|
||||
new[key] = obj._dict[key]
|
||||
obj._dict = new
|
||||
elif t is reach_class:
|
||||
obj._profiles = list(
|
||||
filter(
|
||||
lambda el: el.id not in ids,
|
||||
obj._profiles
|
||||
)
|
||||
)
|
||||
|
||||
self.river._data_traversal(
|
||||
lambda o, d: True, modifier, {}
|
||||
)
|
||||
|
||||
def sql_save_request_count(self, *args, **kargs):
|
||||
return self._count()
|
||||
|
||||
|
|
|
|||
|
|
@ -97,6 +97,9 @@ class PamhyrModelDict(SQLSubModel):
|
|||
Nothing
|
||||
|
||||
"""
|
||||
if predicate(self, data):
|
||||
modifier(self, data)
|
||||
|
||||
for key in self._dict:
|
||||
self._dict[key]\
|
||||
._data_traversal(predicate, modifier, data)
|
||||
|
|
|
|||
|
|
@ -100,6 +100,9 @@ class PamhyrModelList(SQLSubModel):
|
|||
Nothing
|
||||
|
||||
"""
|
||||
if predicate(self, data):
|
||||
modifier(self, data)
|
||||
|
||||
for el in self._lst:
|
||||
el._data_traversal(predicate, modifier, data)
|
||||
|
||||
|
|
|
|||
|
|
@ -107,6 +107,9 @@ class PamhyrModelList(SQLSubModel):
|
|||
Returns:
|
||||
Nothing
|
||||
"""
|
||||
if predicate(self, data):
|
||||
modifier(self, data)
|
||||
|
||||
for el in self._lst:
|
||||
el._data_traversal(predicate, modifier, data)
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue