from ..core.database import ChangeSet, g_update_prefix, read_all, sql_literal from .options import get_option_schema, generate_v3 def _inp_in_option_v2(section: list[str]) -> ChangeSet: if len(section) <= 0: return ChangeSet() cs = g_update_prefix | { 'type' : 'option' } for s in section: if s.startswith(';'): continue tokens = s.strip().split() if tokens[0].upper() == 'PATTERN': # can not upper id value = tokens[1] if len(tokens) > 1 else '' cs |= { 'PATTERN' : value } elif tokens[0].upper() == 'QUALITY': # can not upper trace node value = tokens[1] if len(tokens) > 1 else '' if len(tokens) > 2: value += f' {tokens[2]}' cs |= { 'QUALITY' : value } else: line = s.upper().strip() for key in get_option_schema('').keys(): if line.startswith(key): value = line.removeprefix(key).strip() cs |= { key : value } result = ChangeSet(cs) result.merge(generate_v3(result)) return result def inp_in_option_v2(section: list[str]) -> str: sql = '' result = _inp_in_option_v2(section) for op in result.operations: for key in op.keys(): if key == 'operation' or key == 'type': continue if op['type'] == 'option': sql += f"update network.simulation_settings set value = {sql_literal(op[key])} where engine_version = 'legacy' and key = {sql_literal(key)};" else: sql += f"update network.simulation_settings set value = {sql_literal(op[key])} where engine_version = 'v3' and key = {sql_literal(key)};" return sql def inp_out_option_v2(name: str) -> list[str]: lines = [] objs = read_all(name, "select key, value from network.simulation_settings where engine_version = 'legacy' order by key") is_dda = False for obj in objs: if obj['key'] == 'DEMAND MODEL': is_dda = obj['value'] == 'DDA' dda_ignore = [ 'HEADERROR', # TODO: default is 0 which is conflict with PDA 'FLOWCHANGE', # TODO: default is 0 which is conflict with PDA 'MINIMUM PRESSURE', 'REQUIRED PRESSURE', 'PRESSURE EXPONENT' ] for obj in objs: key = obj['key'] # why write this ? if key == 'PRESSURE': continue # EPANET V2 does not support these newer keys. if key == 'HTOL' or key == 'QTOL' or key == 'RQTOL': continue # ignore some weird settings for DDA if is_dda and key in dda_ignore: continue value = obj['value'] if str(value).strip() != '': lines.append(f'{key} {value}') return lines