from .sections import * from .database import API_ADD, API_UPDATE, API_DELETE, ChangeSet, DbChangeSet, execute_command from .s1_title import set_title_cmd from .s2_junctions import set_junction_cmd, add_junction_cmd, delete_junction_cmd from .s3_reservoirs import set_reservoir_cmd, add_reservoir_cmd, delete_reservoir_cmd from .s4_tanks import set_tank_cmd, add_tank_cmd, delete_tank_cmd from .s5_pipes import set_pipe_cmd, add_pipe_cmd, delete_pipe_cmd from .s6_pumps import set_pump_cmd, add_pump_cmd, delete_pump_cmd from .s7_valves import set_valve_cmd, add_valve_cmd, delete_valve_cmd from .s8_tags import set_tag_cmd from .s9_demands import set_demand_cmd from .s10_status import set_status_cmd from .s11_patterns import set_pattern_cmd, add_pattern_cmd, delete_pattern_cmd from .s12_curves import set_curve_cmd, add_curve_cmd, delete_curve_cmd from .s13_controls import set_control_cmd from .s14_rules import set_rule_cmd from .s15_energy import set_energy_cmd, set_pump_energy_cmd from .s16_emitters import set_emitter_cmd from .s17_quality import set_quality_cmd from .s18_sources import set_source_cmd, add_source_cmd, delete_source_cmd from .s19_reactions import set_reaction_cmd, set_pipe_reaction_cmd, set_tank_reaction_cmd from .s20_mixing import set_mixing_cmd, add_mixing_cmd, delete_mixing_cmd from .s21_times import set_time_cmd #from .s22_report import * from .s23_options_util import set_option_cmd, set_option_v3_cmd #from .s24_coordinates import * from .s25_vertices import set_vertex_cmd, add_vertex_cmd, delete_vertex_cmd from .s26_labels import set_label_cmd, add_label_cmd, delete_label_cmd from .s27_backdrop import set_backdrop_cmd # from .s28_end import * from .s29_scada_device import set_scada_device_cmd, add_scada_device_cmd, delete_scada_device_cmd from .s30_scada_device_data import set_scada_device_data_cmd, add_scada_device_data_cmd, delete_scada_device_data_cmd from .s31_scada_element import set_scada_element_cmd, add_scada_element_cmd, delete_scada_element_cmd from .del_cmd_raw import del_cascade_cmd def add_cmd(name: str, cs: ChangeSet) -> DbChangeSet | None: type = cs.operations[0]['type'] if type == s1_title: return None if type == s2_junction: return add_junction_cmd(name, cs) elif type == s3_reservoir: return add_reservoir_cmd(name, cs) elif type == s4_tank: return add_tank_cmd(name, cs) elif type == s5_pipe: return add_pipe_cmd(name, cs) elif type == s6_pump: return add_pump_cmd(name, cs) elif type == s7_valve: return add_valve_cmd(name, cs) elif type == s8_tag: return None elif type == s9_demand: return None elif type == s10_status: return None elif type == s11_pattern: return add_pattern_cmd(name, cs) elif type == s12_curve: return add_curve_cmd(name, cs) elif type == s13_control: return None elif type == s14_rule: return None elif type == s15_energy: return None elif type == s15_pump_energy: return None elif type == s16_emitter: return None elif type == s17_quality: return None elif type == s18_source: return add_source_cmd(name, cs) elif type == s19_reaction: return None elif type == s19_pipe_reaction: return None elif type == s19_tank_reaction: return None elif type == s20_mixing: return add_mixing_cmd(name, cs) elif type == s21_time: return None elif type == s22_report: return None elif type == s23_option: return None elif type == s23_option_v3: return None elif type == s24_coordinate: return None elif type == s25_vertex: return add_vertex_cmd(name, cs) elif type == s26_label: return add_label_cmd(name, cs) elif type == s27_backdrop: return None elif type == s28_end: return None elif type == s29_scada_device: return add_scada_device_cmd(name, cs) elif type == s30_scada_device_data: return add_scada_device_data_cmd(name, cs) elif type == s31_scada_element: return add_scada_element_cmd(name, cs) return None def set_cmd(name: str, cs: ChangeSet) -> DbChangeSet | None: type = cs.operations[0]['type'] if type == s1_title: return set_title_cmd(name, cs) if type == s2_junction: return set_junction_cmd(name, cs) elif type == s3_reservoir: return set_reservoir_cmd(name, cs) elif type == s4_tank: return set_tank_cmd(name, cs) elif type == s5_pipe: return set_pipe_cmd(name, cs) elif type == s6_pump: return set_pump_cmd(name, cs) elif type == s7_valve: return set_valve_cmd(name, cs) elif type == s8_tag: return set_tag_cmd(name, cs) elif type == s9_demand: return set_demand_cmd(name, cs) elif type == s10_status: return set_status_cmd(name, cs) elif type == s11_pattern: return set_pattern_cmd(name, cs) elif type == s12_curve: return set_curve_cmd(name, cs) elif type == s13_control: return set_control_cmd(name, cs) elif type == s14_rule: return set_rule_cmd(name, cs) elif type == s15_energy: return set_energy_cmd(name, cs) elif type == s15_pump_energy: return set_pump_energy_cmd(name, cs) elif type == s16_emitter: return set_emitter_cmd(name, cs) elif type == s17_quality: return set_quality_cmd(name, cs) elif type == s18_source: return set_source_cmd(name, cs) elif type == s19_reaction: return set_reaction_cmd(name, cs) elif type == s19_pipe_reaction: return set_pipe_reaction_cmd(name, cs) elif type == s19_tank_reaction: return set_tank_reaction_cmd(name, cs) elif type == s20_mixing: return set_mixing_cmd(name, cs) elif type == s21_time: return set_time_cmd(name, cs) elif type == s22_report: # no api now return None elif type == s23_option: return set_option_cmd(name, cs) elif type == s23_option_v3: return set_option_v3_cmd(name, cs) elif type == s24_coordinate: # do not support update here return None elif type == s25_vertex: return set_vertex_cmd(name, cs) elif type == s26_label: return set_label_cmd(name, cs) elif type == s27_backdrop: return set_backdrop_cmd(name, cs) elif type == s28_end: # end return None elif type == s29_scada_device: return set_scada_device_cmd(name, cs) elif type == s30_scada_device_data: return set_scada_device_data_cmd(name, cs) elif type == s31_scada_element: return set_scada_element_cmd(name, cs) return None def del_cmd(name: str, cs: ChangeSet) -> DbChangeSet | None: type = cs.operations[0]['type'] if type == s1_title: return None if type == s2_junction: return delete_junction_cmd(name, cs) elif type == s3_reservoir: return delete_reservoir_cmd(name, cs) elif type == s4_tank: return delete_tank_cmd(name, cs) elif type == s5_pipe: return delete_pipe_cmd(name, cs) elif type == s6_pump: return delete_pump_cmd(name, cs) elif type == s7_valve: return delete_valve_cmd(name, cs) elif type == s8_tag: return None elif type == s9_demand: return None elif type == s10_status: return None elif type == s11_pattern: return delete_pattern_cmd(name, cs) elif type == s12_curve: return delete_curve_cmd(name, cs) elif type == s13_control: return None elif type == s14_rule: return None elif type == s15_energy: return None elif type == s15_pump_energy: return None elif type == s16_emitter: return None elif type == s17_quality: return None elif type == s18_source: return delete_source_cmd(name, cs) elif type == s19_reaction: return None elif type == s19_pipe_reaction: return None elif type == s19_tank_reaction: return None elif type == s20_mixing: return delete_mixing_cmd(name, cs) elif type == s21_time: return None elif type == s22_report: return None elif type == s23_option: return None elif type == s23_option_v3: return None elif type == s24_coordinate: return None elif type == s25_vertex: return delete_vertex_cmd(name, cs) elif type == s26_label: return delete_label_cmd(name, cs) elif type == s27_backdrop: return None elif type == s28_end: return None elif type == s29_scada_device: return delete_scada_device_cmd(name, cs) elif type == s30_scada_device_data: return delete_scada_device_data_cmd(name, cs) elif type == s31_scada_element: return delete_scada_element_cmd(name, cs) return None def execute_batch_command(name: str, cs: ChangeSet) -> ChangeSet: css: list[DbChangeSet] = [] # for delete, generate cascade command new_cs = ChangeSet() for op in cs.operations: if op['operation'] == API_DELETE: new_cs.merge(del_cascade_cmd(name, ChangeSet(op))) else: new_cs.merge(ChangeSet(op)) try: for op in new_cs.operations: operation = op['operation'] r = None if operation == API_ADD: r = add_cmd(name, ChangeSet(op)) elif operation == API_UPDATE: r = set_cmd(name, ChangeSet(op)) elif operation == API_DELETE: r = del_cmd(name, ChangeSet(op)) if r == None: print(f'ERROR: Build [{op}] returns None') return ChangeSet() css.append(r) except: return ChangeSet() try: return execute_command(name, DbChangeSet.from_list(css)) except: return ChangeSet()