diff --git a/api/__init__.py b/api/__init__.py index 4e6f570..7126da2 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -89,24 +89,26 @@ from .s20_mixing import get_mixing_schema, get_mixing, set_mixing, add_mixing, d from .s21_times import TIME_STATISTIC_NONE, TIME_STATISTIC_AVERAGED, TIME_STATISTIC_MINIMUM, TIME_STATISTIC_MAXIMUM, TIME_STATISTIC_RANGE from .s21_times import get_time_schema, get_time, set_time -from .s23_options import OPTION_UNITS_CFS, OPTION_UNITS_GPM, OPTION_UNITS_MGD, OPTION_UNITS_IMGD, OPTION_UNITS_AFD, OPTION_UNITS_LPS, OPTION_UNITS_LPM, OPTION_UNITS_MLD, OPTION_UNITS_CMH, OPTION_UNITS_CMD -from .s23_options import OPTION_PRESSURE_PSI, OPTION_PRESSURE_KPA, OPTION_PRESSURE_M -from .s23_options import OPTION_HEADLOSS_HW, OPTION_HEADLOSS_DW, OPTION_HEADLOSS_CM -from .s23_options import OPTION_UNBALANCED_STOP, OPTION_UNBALANCED_CONTINUE -from .s23_options import OPTION_DEMAND_MODEL_DDA, OPTION_DEMAND_MODEL_PDA -from .s23_options import OPTION_QUALITY_NONE, OPTION_QUALITY_CHEMICAL, OPTION_QUALITY_AGE, OPTION_QUALITY_TRACE -from .s23_options import get_option_schema, get_option, set_option +from .s23_options_util import OPTION_UNITS_CFS, OPTION_UNITS_GPM, OPTION_UNITS_MGD, OPTION_UNITS_IMGD, OPTION_UNITS_AFD, OPTION_UNITS_LPS, OPTION_UNITS_LPM, OPTION_UNITS_MLD, OPTION_UNITS_CMH, OPTION_UNITS_CMD +from .s23_options_util import OPTION_PRESSURE_PSI, OPTION_PRESSURE_KPA, OPTION_PRESSURE_M +from .s23_options_util import OPTION_HEADLOSS_HW, OPTION_HEADLOSS_DW, OPTION_HEADLOSS_CM +from .s23_options_util import OPTION_UNBALANCED_STOP, OPTION_UNBALANCED_CONTINUE +from .s23_options_util import OPTION_DEMAND_MODEL_DDA, OPTION_DEMAND_MODEL_PDA +from .s23_options_util import OPTION_QUALITY_NONE, OPTION_QUALITY_CHEMICAL, OPTION_QUALITY_AGE, OPTION_QUALITY_TRACE +from .s23_options_util import get_option_schema, get_option +from .s23_options import set_option -from .s23_options_v3 import OPTION_V3_FLOW_UNITS_CFS, OPTION_V3_FLOW_UNITS_GPM, OPTION_V3_FLOW_UNITS_MGD, OPTION_V3_FLOW_UNITS_IMGD, OPTION_V3_FLOW_UNITS_AFD, OPTION_V3_FLOW_UNITS_LPS, OPTION_V3_FLOW_UNITS_LPM, OPTION_V3_FLOW_UNITS_MLD, OPTION_V3_FLOW_UNITS_CMH, OPTION_V3_FLOW_UNITS_CMD -from .s23_options_v3 import OPTION_V3_PRESSURE_UNITS_PSI, OPTION_V3_PRESSURE_UNITS_KPA, OPTION_V3_PRESSURE_UNITS_M -from .s23_options_v3 import OPTION_V3_HEADLOSS_MODEL_HW, OPTION_V3_HEADLOSS_MODEL_DW, OPTION_V3_HEADLOSS_MODEL_CM -from .s23_options_v3 import OPTION_V3_STEP_SIZING, OPTION_V3_STEP_SIZING, OPTION_V3_STEP_SIZING -from .s23_options_v3 import OPTION_V3_IF_UNBALANCED_STOP, OPTION_V3_IF_UNBALANCED_CONTINUE -from .s23_options_v3 import OPTION_V3_DEMAND_MODEL_FIXED, OPTION_V3_DEMAND_MODEL_CONSTRAINED, OPTION_V3_DEMAND_MODEL_POWER, OPTION_V3_DEMAND_MODEL_LOGISTIC -from .s23_options_v3 import OPTION_V3_LEAKAGE_MODEL_NONE, OPTION_V3_LEAKAGE_MODEL_POWER, OPTION_V3_LEAKAGE_MODEL_FAVAD -from .s23_options_v3 import OPTION_V3_QUALITY_MODEL_NONE, OPTION_V3_QUALITY_MODEL_CHEMICAL, OPTION_V3_QUALITY_MODEL_AGE, OPTION_V3_QUALITY_MODEL_TRACE -from .s23_options_v3 import OPTION_V3_QUALITY_UNITS_HRS, OPTION_V3_QUALITY_UNITS_PCNT, OPTION_V3_QUALITY_UNITS_MGL, OPTION_V3_QUALITY_UNITS_UGL -from .s23_options_v3 import get_option_v3_schema, get_option_v3, set_option_v3 +from .s23_options_util import OPTION_V3_FLOW_UNITS_CFS, OPTION_V3_FLOW_UNITS_GPM, OPTION_V3_FLOW_UNITS_MGD, OPTION_V3_FLOW_UNITS_IMGD, OPTION_V3_FLOW_UNITS_AFD, OPTION_V3_FLOW_UNITS_LPS, OPTION_V3_FLOW_UNITS_LPM, OPTION_V3_FLOW_UNITS_MLD, OPTION_V3_FLOW_UNITS_CMH, OPTION_V3_FLOW_UNITS_CMD +from .s23_options_util import OPTION_V3_PRESSURE_UNITS_PSI, OPTION_V3_PRESSURE_UNITS_KPA, OPTION_V3_PRESSURE_UNITS_M +from .s23_options_util import OPTION_V3_HEADLOSS_MODEL_HW, OPTION_V3_HEADLOSS_MODEL_DW, OPTION_V3_HEADLOSS_MODEL_CM +from .s23_options_util import OPTION_V3_STEP_SIZING, OPTION_V3_STEP_SIZING, OPTION_V3_STEP_SIZING +from .s23_options_util import OPTION_V3_IF_UNBALANCED_STOP, OPTION_V3_IF_UNBALANCED_CONTINUE +from .s23_options_util import OPTION_V3_DEMAND_MODEL_FIXED, OPTION_V3_DEMAND_MODEL_CONSTRAINED, OPTION_V3_DEMAND_MODEL_POWER, OPTION_V3_DEMAND_MODEL_LOGISTIC +from .s23_options_util import OPTION_V3_LEAKAGE_MODEL_NONE, OPTION_V3_LEAKAGE_MODEL_POWER, OPTION_V3_LEAKAGE_MODEL_FAVAD +from .s23_options_util import OPTION_V3_QUALITY_MODEL_NONE, OPTION_V3_QUALITY_MODEL_CHEMICAL, OPTION_V3_QUALITY_MODEL_AGE, OPTION_V3_QUALITY_MODEL_TRACE +from .s23_options_util import OPTION_V3_QUALITY_UNITS_HRS, OPTION_V3_QUALITY_UNITS_PCNT, OPTION_V3_QUALITY_UNITS_MGL, OPTION_V3_QUALITY_UNITS_UGL +from .s23_options_util import get_option_v3_schema, get_option_v3 +from .s23_options_v3 import set_option_v3 from .s24_coordinates import get_node_coord diff --git a/api/s23_options.py b/api/s23_options.py index 252d50c..4a839aa 100644 --- a/api/s23_options.py +++ b/api/s23_options.py @@ -1,156 +1,18 @@ from .database import * -from .s23_options_v3 import set_option_v3 -from .s23_options_util import generate_v3 +from .s23_options_util import get_option_schema, set_option_cmd, set_option_v3_cmd, generate_v3 -OPTION_UNITS_CFS = 'CFS' -OPTION_UNITS_GPM = 'GPM' -OPTION_UNITS_MGD = 'MGD' -OPTION_UNITS_IMGD = 'IMGD' -OPTION_UNITS_AFD = 'AFD' -OPTION_UNITS_LPS = 'LPS' -OPTION_UNITS_LPM = 'LPM' -OPTION_UNITS_MLD = 'MLD' -OPTION_UNITS_CMH = 'CMH' -OPTION_UNITS_CMD = 'CMD' +def set_option(name: str, cs: ChangeSet) -> ChangeSet: + v2_cmd = set_option_cmd(name, cs) + result = execute_command(name, v2_cmd) -OPTION_PRESSURE_PSI = 'PSI' -OPTION_PRESSURE_KPA = 'KPA' -OPTION_PRESSURE_M = 'M' + v3 = generate_v3(ChangeSet(v2_cmd.redo_cs[0])) + v3_cmd = set_option_v3_cmd(name, v3) + result.merge(execute_command(name, v3_cmd)) -OPTION_HEADLOSS_HW = 'H-W' -OPTION_HEADLOSS_DW = 'D-W' -OPTION_HEADLOSS_CM = 'C-M' - -OPTION_UNBALANCED_STOP = 'STOP' -OPTION_UNBALANCED_CONTINUE = 'CONTINUE' - -OPTION_DEMAND_MODEL_DDA = 'DDA' -OPTION_DEMAND_MODEL_PDA = 'PDA' - -OPTION_QUALITY_NONE = 'NONE' -OPTION_QUALITY_CHEMICAL = 'CHEMICAL' -OPTION_QUALITY_AGE = 'AGE' -OPTION_QUALITY_TRACE = 'TRACE' - - -element_schema = {'type': 'str' , 'optional': True , 'readonly': False} - - -def get_option_schema(name: str) -> dict[str, dict[str, Any]]: - return { 'UNITS' : element_schema, - 'PRESSURE' : element_schema, - 'HEADLOSS' : element_schema, - 'QUALITY' : element_schema, - 'UNBALANCED' : element_schema, - 'PATTERN' : element_schema, - 'DEMAND MODEL' : element_schema, - 'DEMAND MULTIPLIER' : element_schema, - 'EMITTER EXPONENT' : element_schema, - 'VISCOSITY' : element_schema, - 'DIFFUSIVITY' : element_schema, - 'SPECIFIC GRAVITY' : element_schema, - 'TRIALS' : element_schema, - 'ACCURACY' : element_schema, - 'HEADERROR' : element_schema, - 'FLOWCHANGE' : element_schema, - 'MINIMUM PRESSURE' : element_schema, - 'REQUIRED PRESSURE' : element_schema, - 'PRESSURE EXPONENT' : element_schema, - 'TOLERANCE' : element_schema, - 'HTOL' : element_schema, - 'QTOL' : element_schema, - 'RQTOL' : element_schema, - 'CHECKFREQ' : element_schema, - 'MAXCHECK' : element_schema, - 'DAMPLIMIT' : element_schema } - - -def get_option(name: str) -> dict[str, Any]: - ts = read_all(name, f"select * from options") - d = {} - for e in ts: - d[e['key']] = str(e['value']) - return d - - -def set_option_cmd(name: str, cs: ChangeSet) -> DbChangeSet: - raw_old = get_option(name) - - old = {} - new = {} - - new_dict = cs.operations[0] - schema = get_option_schema(name) - for key in schema.keys(): - if key in new_dict: - old[key] = str(raw_old[key]) - new[key] = str(new_dict[key]) - - redo_cs = g_update_prefix | { 'type' : 'option' } - - redo_sql = '' - for key, value in new.items(): - if redo_sql != '': - redo_sql += '\n' - redo_sql += f"update options set value = '{value}' where key = '{key}';" - redo_cs |= { key: value } - - undo_cs = g_update_prefix | { 'type' : 'option' } - - undo_sql = '' - for key, value in old.items(): - if undo_sql != '': - undo_sql += '\n' - undo_sql += f"update options set value = '{value}' where key = '{key}';" - undo_cs |= { key: value } - - return DbChangeSet(redo_sql, undo_sql, [redo_cs], [undo_cs]) - - -def set_option(name: str, cs: ChangeSet, update_v3: bool = True) -> ChangeSet: - v2 = set_option_cmd(name, cs) - result = execute_command(name, v2) - if update_v3: - v3 = generate_v3(ChangeSet(v2.redo_cs[0])) - result.merge(set_option_v3(name, v3, False)) return result -#-------------------------------------------------------------- -# [EPANET2][IN][OUT] -# UNITS CFS/GPM/MGD/IMGD/AFD/LPS/LPM/MLD/CMH/CMD/SI -# PRESSURE PSI/KPA/M -# HEADLOSS H-W/D-W/C-M -# QUALITY NONE/AGE/TRACE/CHEMICAL (TraceNode) -# UNBALANCED STOP/CONTINUE {Niter} -# PATTERN id -# DEMAND MODEL DDA/PDA -# DEMAND MULTIPLIER value -# EMITTER EXPONENT value -# VISCOSITY value -# DIFFUSIVITY value -# SPECIFIC GRAVITY value -# TRIALS value -# ACCURACY value# -# HEADERROR value -# FLOWCHANGE value -# MINIMUM PRESSURE value -# REQUIRED PRESSURE value -# PRESSURE EXPONENT value# -# TOLERANCE value -# HTOL value -# QTOL value -# RQTOL value -# CHECKFREQ value -# MAXCHECK value -# DAMPLIMIT value -# ---- Unsupported Options ----- -# HYDRAULICS USE/SAVE filename -# MAP filename -#-------------------------------------------------------------- - - def inp_in_option(section: list[str]) -> ChangeSet: if len(section) <= 0: return ChangeSet() diff --git a/api/s23_options_util.py b/api/s23_options_util.py index 2244c25..0285a12 100644 --- a/api/s23_options_util.py +++ b/api/s23_options_util.py @@ -1,5 +1,265 @@ from .database import * + +#-------------------------------------------------------------- +# [EPANET2][IN][OUT] +# UNITS CFS/GPM/MGD/IMGD/AFD/LPS/LPM/MLD/CMH/CMD/SI +# PRESSURE PSI/KPA/M +# HEADLOSS H-W/D-W/C-M +# QUALITY NONE/AGE/TRACE/CHEMICAL (TraceNode) +# UNBALANCED STOP/CONTINUE {Niter} +# PATTERN id +# DEMAND MODEL DDA/PDA +# DEMAND MULTIPLIER value +# EMITTER EXPONENT value +# VISCOSITY value +# DIFFUSIVITY value +# SPECIFIC GRAVITY value +# TRIALS value +# ACCURACY value# +# HEADERROR value +# FLOWCHANGE value +# MINIMUM PRESSURE value +# REQUIRED PRESSURE value +# PRESSURE EXPONENT value# +# TOLERANCE value +# HTOL value +# QTOL value +# RQTOL value +# CHECKFREQ value +# MAXCHECK value +# DAMPLIMIT value +# ---- Unsupported Options ----- +# HYDRAULICS USE/SAVE filename +# MAP filename +#-------------------------------------------------------------- + + +element_schema = {'type': 'str' , 'optional': True , 'readonly': False} + + +OPTION_UNITS_CFS = 'CFS' +OPTION_UNITS_GPM = 'GPM' +OPTION_UNITS_MGD = 'MGD' +OPTION_UNITS_IMGD = 'IMGD' +OPTION_UNITS_AFD = 'AFD' +OPTION_UNITS_LPS = 'LPS' +OPTION_UNITS_LPM = 'LPM' +OPTION_UNITS_MLD = 'MLD' +OPTION_UNITS_CMH = 'CMH' +OPTION_UNITS_CMD = 'CMD' + +OPTION_PRESSURE_PSI = 'PSI' +OPTION_PRESSURE_KPA = 'KPA' +OPTION_PRESSURE_M = 'M' + +OPTION_HEADLOSS_HW = 'H-W' +OPTION_HEADLOSS_DW = 'D-W' +OPTION_HEADLOSS_CM = 'C-M' + +OPTION_UNBALANCED_STOP = 'STOP' +OPTION_UNBALANCED_CONTINUE = 'CONTINUE' + +OPTION_DEMAND_MODEL_DDA = 'DDA' +OPTION_DEMAND_MODEL_PDA = 'PDA' + +OPTION_QUALITY_NONE = 'NONE' +OPTION_QUALITY_CHEMICAL = 'CHEMICAL' +OPTION_QUALITY_AGE = 'AGE' +OPTION_QUALITY_TRACE = 'TRACE' + + +def get_option_schema(name: str) -> dict[str, dict[str, Any]]: + return { 'UNITS' : element_schema, + 'PRESSURE' : element_schema, + 'HEADLOSS' : element_schema, + 'QUALITY' : element_schema, + 'UNBALANCED' : element_schema, + 'PATTERN' : element_schema, + 'DEMAND MODEL' : element_schema, + 'DEMAND MULTIPLIER' : element_schema, + 'EMITTER EXPONENT' : element_schema, + 'VISCOSITY' : element_schema, + 'DIFFUSIVITY' : element_schema, + 'SPECIFIC GRAVITY' : element_schema, + 'TRIALS' : element_schema, + 'ACCURACY' : element_schema, + 'HEADERROR' : element_schema, + 'FLOWCHANGE' : element_schema, + 'MINIMUM PRESSURE' : element_schema, + 'REQUIRED PRESSURE' : element_schema, + 'PRESSURE EXPONENT' : element_schema, + 'TOLERANCE' : element_schema, + 'HTOL' : element_schema, + 'QTOL' : element_schema, + 'RQTOL' : element_schema, + 'CHECKFREQ' : element_schema, + 'MAXCHECK' : element_schema, + 'DAMPLIMIT' : element_schema } + + +def get_option(name: str) -> dict[str, Any]: + ts = read_all(name, f"select * from options") + d = {} + for e in ts: + d[e['key']] = str(e['value']) + return d + + +def set_option_cmd(name: str, cs: ChangeSet) -> DbChangeSet: + raw_old = get_option(name) + + old = {} + new = {} + + new_dict = cs.operations[0] + schema = get_option_schema(name) + for key in schema.keys(): + if key in new_dict: + old[key] = str(raw_old[key]) + new[key] = str(new_dict[key]) + + redo_cs = g_update_prefix | { 'type' : 'option' } + + redo_sql = '' + for key, value in new.items(): + if redo_sql != '': + redo_sql += '\n' + redo_sql += f"update options set value = '{value}' where key = '{key}';" + redo_cs |= { key: value } + + undo_cs = g_update_prefix | { 'type' : 'option' } + + undo_sql = '' + for key, value in old.items(): + if undo_sql != '': + undo_sql += '\n' + undo_sql += f"update options set value = '{value}' where key = '{key}';" + undo_cs |= { key: value } + + return DbChangeSet(redo_sql, undo_sql, [redo_cs], [undo_cs]) + + +OPTION_V3_FLOW_UNITS_CFS = OPTION_UNITS_CFS +OPTION_V3_FLOW_UNITS_GPM = OPTION_UNITS_GPM +OPTION_V3_FLOW_UNITS_MGD = OPTION_UNITS_MGD +OPTION_V3_FLOW_UNITS_IMGD = OPTION_UNITS_IMGD +OPTION_V3_FLOW_UNITS_AFD = OPTION_UNITS_AFD +OPTION_V3_FLOW_UNITS_LPS = OPTION_UNITS_LPS +OPTION_V3_FLOW_UNITS_LPM = OPTION_UNITS_LPM +OPTION_V3_FLOW_UNITS_MLD = OPTION_UNITS_MLD +OPTION_V3_FLOW_UNITS_CMH = OPTION_UNITS_CMH +OPTION_V3_FLOW_UNITS_CMD = OPTION_UNITS_CMD + +OPTION_V3_PRESSURE_UNITS_PSI = OPTION_PRESSURE_PSI +OPTION_V3_PRESSURE_UNITS_KPA = OPTION_PRESSURE_KPA +OPTION_V3_PRESSURE_UNITS_M = OPTION_PRESSURE_M + +OPTION_V3_HEADLOSS_MODEL_HW = OPTION_HEADLOSS_HW +OPTION_V3_HEADLOSS_MODEL_DW = OPTION_HEADLOSS_DW +OPTION_V3_HEADLOSS_MODEL_CM = OPTION_HEADLOSS_CM + +OPTION_V3_STEP_SIZING = 'FULL' +OPTION_V3_STEP_SIZING = 'RELAXATION' +OPTION_V3_STEP_SIZING = 'LINESEARCH' + +OPTION_V3_IF_UNBALANCED_STOP = OPTION_UNBALANCED_STOP +OPTION_V3_IF_UNBALANCED_CONTINUE = OPTION_UNBALANCED_CONTINUE + +OPTION_V3_DEMAND_MODEL_FIXED = 'FIXED' +OPTION_V3_DEMAND_MODEL_CONSTRAINED = 'CONSTRAINED' +OPTION_V3_DEMAND_MODEL_POWER = 'POWER' +OPTION_V3_DEMAND_MODEL_LOGISTIC = 'LOGISTIC' + +OPTION_V3_LEAKAGE_MODEL_NONE = 'NONE' +OPTION_V3_LEAKAGE_MODEL_POWER = 'POWER' +OPTION_V3_LEAKAGE_MODEL_FAVAD = 'FAVAD' + +OPTION_V3_QUALITY_MODEL_NONE = OPTION_QUALITY_NONE +OPTION_V3_QUALITY_MODEL_CHEMICAL = OPTION_QUALITY_CHEMICAL +OPTION_V3_QUALITY_MODEL_AGE = OPTION_QUALITY_AGE +OPTION_V3_QUALITY_MODEL_TRACE = OPTION_QUALITY_TRACE + +OPTION_V3_QUALITY_UNITS_HRS = 'HRS' +OPTION_V3_QUALITY_UNITS_PCNT = 'PCNT' +OPTION_V3_QUALITY_UNITS_MGL = 'MG/L' +OPTION_V3_QUALITY_UNITS_UGL = 'UG/L' + + +def get_option_v3_schema(name: str) -> dict[str, dict[str, Any]]: + return { 'FLOW_UNITS' : element_schema, + 'PRESSURE_UNITS' : element_schema, + 'HEADLOSS_MODEL' : element_schema, + 'SPECIFIC_GRAVITY' : element_schema, + 'SPECIFIC_VISCOSITY' : element_schema, + 'MAXIMUM_TRIALS' : element_schema, + 'HEAD_TOLERANCE' : element_schema, + 'FLOW_TOLERANCE' : element_schema, + 'FLOW_CHANGE_LIMIT' : element_schema, + 'RELATIVE_ACCURACY' : element_schema, + 'TIME_WEIGHT' : element_schema, + 'STEP_SIZING' : element_schema, + 'IF_UNBALANCED' : element_schema, + 'DEMAND_MODEL' : element_schema, + 'DEMAND_PATTERN' : element_schema, + 'DEMAND_MULTIPLIER' : element_schema, + 'MINIMUM_PRESSURE' : element_schema, + 'SERVICE_PRESSURE' : element_schema, + 'PRESSURE_EXPONENT' : element_schema, + 'LEAKAGE_MODEL' : element_schema, + 'LEAKAGE_COEFF1' : element_schema, + 'LEAKAGE_COEFF2' : element_schema, + 'EMITTER_EXPONENT' : element_schema, + 'QUALITY_MODEL' : element_schema, + 'QUALITY_NAME' : element_schema, + 'QUALITY_UNITS' : element_schema, + 'TRACE_NODE' : element_schema, + 'SPECIFIC_DIFFUSIVITY' : element_schema, + 'QUALITY_TOLERANCE' : element_schema } + + +def get_option_v3(name: str) -> dict[str, Any]: + ts = read_all(name, f"select * from options_v3") + d = {} + for e in ts: + d[e['key']] = str(e['value']) + return d + + +def set_option_v3_cmd(name: str, cs: ChangeSet) -> DbChangeSet: + raw_old = get_option_v3(name) + + old = {} + new = {} + + new_dict = cs.operations[0] + schema = get_option_v3_schema(name) + for key in schema.keys(): + if key in new_dict: + old[key] = str(raw_old[key]) + new[key] = str(new_dict[key]) + + redo_cs = g_update_prefix | { 'type' : 'option_v3' } + + redo_sql = '' + for key, value in new.items(): + if redo_sql != '': + redo_sql += '\n' + redo_sql += f"update options_v3 set value = '{value}' where key = '{key}';" + redo_cs |= { key: value } + + undo_cs = g_update_prefix | { 'type' : 'option_v3' } + + undo_sql = '' + for key, value in old.items(): + if undo_sql != '': + undo_sql += '\n' + undo_sql += f"update options_v3 set value = '{value}' where key = '{key}';" + undo_cs |= { key: value } + + return DbChangeSet(redo_sql, undo_sql, [redo_cs], [undo_cs]) + + _key_map_23 = { 'UNITS' : 'FLOW_UNITS', 'PRESSURE' : 'PRESSURE_UNITS', @@ -127,3 +387,4 @@ def generate_v3(cs: ChangeSet) -> ChangeSet: return ChangeSet(cs_v3) return ChangeSet() + diff --git a/api/s23_options_v3.py b/api/s23_options_v3.py index cb00d15..c2228a5 100644 --- a/api/s23_options_v3.py +++ b/api/s23_options_v3.py @@ -1,139 +1,15 @@ from .database import * -from .s23_options import OPTION_UNITS_CFS, OPTION_UNITS_GPM, OPTION_UNITS_MGD, OPTION_UNITS_IMGD, OPTION_UNITS_AFD, OPTION_UNITS_LPS, OPTION_UNITS_LPM, OPTION_UNITS_MLD, OPTION_UNITS_CMH, OPTION_UNITS_CMD -from .s23_options import OPTION_PRESSURE_PSI, OPTION_PRESSURE_KPA, OPTION_PRESSURE_M -from .s23_options import OPTION_HEADLOSS_HW, OPTION_HEADLOSS_DW, OPTION_HEADLOSS_CM -from .s23_options import OPTION_UNBALANCED_STOP, OPTION_UNBALANCED_CONTINUE -from .s23_options import OPTION_QUALITY_NONE, OPTION_QUALITY_CHEMICAL, OPTION_QUALITY_AGE, OPTION_QUALITY_TRACE -from .s23_options import element_schema -from .s23_options import get_option_schema, set_option -from .s23_options_util import generate_v2, generate_v3 - -OPTION_V3_FLOW_UNITS_CFS = OPTION_UNITS_CFS -OPTION_V3_FLOW_UNITS_GPM = OPTION_UNITS_GPM -OPTION_V3_FLOW_UNITS_MGD = OPTION_UNITS_MGD -OPTION_V3_FLOW_UNITS_IMGD = OPTION_UNITS_IMGD -OPTION_V3_FLOW_UNITS_AFD = OPTION_UNITS_AFD -OPTION_V3_FLOW_UNITS_LPS = OPTION_UNITS_LPS -OPTION_V3_FLOW_UNITS_LPM = OPTION_UNITS_LPM -OPTION_V3_FLOW_UNITS_MLD = OPTION_UNITS_MLD -OPTION_V3_FLOW_UNITS_CMH = OPTION_UNITS_CMH -OPTION_V3_FLOW_UNITS_CMD = OPTION_UNITS_CMD - -OPTION_V3_PRESSURE_UNITS_PSI = OPTION_PRESSURE_PSI -OPTION_V3_PRESSURE_UNITS_KPA = OPTION_PRESSURE_KPA -OPTION_V3_PRESSURE_UNITS_M = OPTION_PRESSURE_M - -OPTION_V3_HEADLOSS_MODEL_HW = OPTION_HEADLOSS_HW -OPTION_V3_HEADLOSS_MODEL_DW = OPTION_HEADLOSS_DW -OPTION_V3_HEADLOSS_MODEL_CM = OPTION_HEADLOSS_CM - -OPTION_V3_STEP_SIZING = 'FULL' -OPTION_V3_STEP_SIZING = 'RELAXATION' -OPTION_V3_STEP_SIZING = 'LINESEARCH' - -OPTION_V3_IF_UNBALANCED_STOP = OPTION_UNBALANCED_STOP -OPTION_V3_IF_UNBALANCED_CONTINUE = OPTION_UNBALANCED_CONTINUE - -OPTION_V3_DEMAND_MODEL_FIXED = 'FIXED' -OPTION_V3_DEMAND_MODEL_CONSTRAINED = 'CONSTRAINED' -OPTION_V3_DEMAND_MODEL_POWER = 'POWER' -OPTION_V3_DEMAND_MODEL_LOGISTIC = 'LOGISTIC' - -OPTION_V3_LEAKAGE_MODEL_NONE = 'NONE' -OPTION_V3_LEAKAGE_MODEL_POWER = 'POWER' -OPTION_V3_LEAKAGE_MODEL_FAVAD = 'FAVAD' - -OPTION_V3_QUALITY_MODEL_NONE = OPTION_QUALITY_NONE -OPTION_V3_QUALITY_MODEL_CHEMICAL = OPTION_QUALITY_CHEMICAL -OPTION_V3_QUALITY_MODEL_AGE = OPTION_QUALITY_AGE -OPTION_V3_QUALITY_MODEL_TRACE = OPTION_QUALITY_TRACE - -OPTION_V3_QUALITY_UNITS_HRS = 'HRS' -OPTION_V3_QUALITY_UNITS_PCNT = 'PCNT' -OPTION_V3_QUALITY_UNITS_MGL = 'MG/L' -OPTION_V3_QUALITY_UNITS_UGL = 'UG/L' +from .s23_options_util import get_option_schema, get_option_v3_schema, set_option_v3_cmd, set_option_cmd, generate_v2, generate_v3 -def get_option_v3_schema(name: str) -> dict[str, dict[str, Any]]: - return { 'FLOW_UNITS' : element_schema, - 'PRESSURE_UNITS' : element_schema, - 'HEADLOSS_MODEL' : element_schema, - 'SPECIFIC_GRAVITY' : element_schema, - 'SPECIFIC_VISCOSITY' : element_schema, - 'MAXIMUM_TRIALS' : element_schema, - 'HEAD_TOLERANCE' : element_schema, - 'FLOW_TOLERANCE' : element_schema, - 'FLOW_CHANGE_LIMIT' : element_schema, - 'RELATIVE_ACCURACY' : element_schema, - 'TIME_WEIGHT' : element_schema, - 'STEP_SIZING' : element_schema, - 'IF_UNBALANCED' : element_schema, - 'DEMAND_MODEL' : element_schema, - 'DEMAND_PATTERN' : element_schema, - 'DEMAND_MULTIPLIER' : element_schema, - 'MINIMUM_PRESSURE' : element_schema, - 'SERVICE_PRESSURE' : element_schema, - 'PRESSURE_EXPONENT' : element_schema, - 'LEAKAGE_MODEL' : element_schema, - 'LEAKAGE_COEFF1' : element_schema, - 'LEAKAGE_COEFF2' : element_schema, - 'EMITTER_EXPONENT' : element_schema, - 'QUALITY_MODEL' : element_schema, - 'QUALITY_NAME' : element_schema, - 'QUALITY_UNITS' : element_schema, - 'TRACE_NODE' : element_schema, - 'SPECIFIC_DIFFUSIVITY' : element_schema, - 'QUALITY_TOLERANCE' : element_schema } +def set_option_v3(name: str, cs: ChangeSet) -> ChangeSet: + v3_cmd = set_option_v3_cmd(name, cs) + result = execute_command(name, v3_cmd) + v2 = generate_v2(ChangeSet(v3_cmd.redo_cs[0])) + v2_cmd = set_option_cmd(name, v2) + result.merge(execute_command(name, v2_cmd)) -def get_option_v3(name: str) -> dict[str, Any]: - ts = read_all(name, f"select * from options_v3") - d = {} - for e in ts: - d[e['key']] = str(e['value']) - return d - - -def set_option_v3_cmd(name: str, cs: ChangeSet) -> DbChangeSet: - raw_old = get_option_v3(name) - - old = {} - new = {} - - new_dict = cs.operations[0] - schema = get_option_v3_schema(name) - for key in schema.keys(): - if key in new_dict: - old[key] = str(raw_old[key]) - new[key] = str(new_dict[key]) - - redo_cs = g_update_prefix | { 'type' : 'option_v3' } - - redo_sql = '' - for key, value in new.items(): - if redo_sql != '': - redo_sql += '\n' - redo_sql += f"update options_v3 set value = '{value}' where key = '{key}';" - redo_cs |= { key: value } - - undo_cs = g_update_prefix | { 'type' : 'option_v3' } - - undo_sql = '' - for key, value in old.items(): - if undo_sql != '': - undo_sql += '\n' - undo_sql += f"update options_v3 set value = '{value}' where key = '{key}';" - undo_cs |= { key: value } - - return DbChangeSet(redo_sql, undo_sql, [redo_cs], [undo_cs]) - - -def set_option_v3(name: str, cs: ChangeSet, update_v2: bool = True) -> ChangeSet: - v3 = set_option_v3_cmd(name, cs) - result = execute_command(name, v3) - if update_v2: - v2 = generate_v2(ChangeSet(v3.redo_cs[0])) - result.merge(set_option(name, v2, False)) return result