Files
TJWaterServerBinary/app/native/wndb/commands/executor.py
T
jiang fa188af0b1 refactor(db)!: adopt project-routed pooled databases
Reorganize WNDB by responsibility and remove legacy scheme endpoints.\n\nRoute analysis and time-series access through project pools, preserve transactional realtime replacement, and refresh GIS materialized views after writes.\n\nAdd database architecture documentation, live pooling coverage, API contract updates, and executable container verification.\n\nBREAKING CHANGE: legacy scheme APIs and flat app.native.wndb module imports are removed.
2026-08-25 18:35:05 +08:00

156 lines
5.0 KiB
Python

"""Transactional command dispatch for WNDB model mutations."""
from collections.abc import Callable
from ..core.connection import project_transaction
from ..core.database import (
API_ADD,
API_DELETE,
API_UPDATE,
ChangeSet,
refresh_materialized_views,
)
from ..gis.backdrop import set_backdrop
from ..gis.labels import add_label, delete_label, set_label
from ..gis.regions import add_region, delete_region, set_region
from ..gis.vertices import add_vertex, delete_vertex, set_vertex
from ..model.controls import set_control
from ..model.curves import add_curve, delete_curve, set_curve
from ..model.demands import set_demand
from ..model.emitters import set_emitter
from ..model.energy import set_energy, set_pump_energy
from ..model.junctions import add_junction, delete_junction, set_junction
from ..model.mixing import add_mixing, delete_mixing, set_mixing
from ..model.options import set_option, set_option_v3
from ..model.patterns import add_pattern, delete_pattern, set_pattern
from ..model.pipes import add_pipe, delete_pipe, set_pipe
from ..model.pumps import add_pump, delete_pump, set_pump
from ..model.quality import set_quality
from ..model.reactions import (
set_pipe_reaction,
set_reaction,
set_tank_reaction,
)
from ..model.reservoirs import add_reservoir, delete_reservoir, set_reservoir
from ..model.rules import set_rule
from ..model.sources import add_source, delete_source, set_source
from ..model.status import set_status
from ..model.tags import set_tag
from ..model.tanks import add_tank, delete_tank, set_tank
from ..model.times import set_time
from ..model.title import set_title
from ..model.valves import add_valve, delete_valve, set_valve
from .cascade import expand_command
CommandHandler = Callable[[str, ChangeSet], ChangeSet]
_ADD_HANDLERS: dict[str, CommandHandler] = {
"junction": add_junction,
"reservoir": add_reservoir,
"tank": add_tank,
"pipe": add_pipe,
"pump": add_pump,
"valve": add_valve,
"pattern": add_pattern,
"curve": add_curve,
"source": add_source,
"mixing": add_mixing,
"vertex": add_vertex,
"label": add_label,
"region": add_region,
}
_UPDATE_HANDLERS: dict[str, CommandHandler] = {
"title": set_title,
"junction": set_junction,
"reservoir": set_reservoir,
"tank": set_tank,
"pipe": set_pipe,
"pump": set_pump,
"valve": set_valve,
"tag": set_tag,
"demand": set_demand,
"status": set_status,
"pattern": set_pattern,
"curve": set_curve,
"control": set_control,
"rule": set_rule,
"energy": set_energy,
"pump_energy": set_pump_energy,
"emitter": set_emitter,
"quality": set_quality,
"source": set_source,
"reaction": set_reaction,
"pipe_reaction": set_pipe_reaction,
"tank_reaction": set_tank_reaction,
"mixing": set_mixing,
"time": set_time,
"option": set_option,
"option_v3": set_option_v3,
"vertex": set_vertex,
"label": set_label,
"backdrop": set_backdrop,
"region": set_region,
}
_DELETE_HANDLERS: dict[str, CommandHandler] = {
"junction": delete_junction,
"reservoir": delete_reservoir,
"tank": delete_tank,
"pipe": delete_pipe,
"pump": delete_pump,
"valve": delete_valve,
"pattern": delete_pattern,
"curve": delete_curve,
"source": delete_source,
"mixing": delete_mixing,
"vertex": delete_vertex,
"label": delete_label,
"region": delete_region,
}
def _dispatch(
handlers: dict[str, CommandHandler], name: str, change_set: ChangeSet
) -> ChangeSet:
element_type = change_set.operations[0]["type"]
handler = handlers.get(element_type)
return handler(name, change_set) if handler else ChangeSet()
def _execute_add_command(name: str, change_set: ChangeSet) -> ChangeSet:
return _dispatch(_ADD_HANDLERS, name, change_set)
def _execute_update_command(name: str, change_set: ChangeSet) -> ChangeSet:
return _dispatch(_UPDATE_HANDLERS, name, change_set)
def _execute_delete_command(name: str, change_set: ChangeSet) -> ChangeSet:
return _dispatch(_DELETE_HANDLERS, name, change_set)
def execute_batch_commands(name: str, change_set: ChangeSet) -> ChangeSet:
with project_transaction(name):
rewritten = ChangeSet()
for operation in change_set.operations:
rewritten.merge(expand_command(name, ChangeSet(operation)))
result = ChangeSet()
for operation in rewritten.operations:
operation_type = operation["operation"]
if operation_type == API_ADD:
result.merge(_execute_add_command(name, ChangeSet(operation)))
elif operation_type == API_UPDATE:
result.merge(_execute_update_command(name, ChangeSet(operation)))
elif operation_type == API_DELETE:
result.merge(_execute_delete_command(name, ChangeSet(operation)))
if rewritten.operations:
refresh_materialized_views(name)
return result
def execute_batch_command(name: str, change_set: ChangeSet) -> ChangeSet:
return execute_batch_commands(name, change_set)