From 03ac80a2852e74688daada07f449545583a8082c Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Fri, 4 Nov 2022 23:08:58 +0800 Subject: [PATCH] Add quality api and test --- api/__init__.py | 2 ++ api/s17_quality.py | 59 ++++++++++++++++++++++++++++++++ script/sql/create/17.quality.sql | 2 +- test_tjnetwork.py | 57 ++++++++++++++++++++++++++++++ tjnetwork.py | 18 +++++++++- 5 files changed, 136 insertions(+), 2 deletions(-) create mode 100644 api/s17_quality.py diff --git a/api/__init__.py b/api/__init__.py index 22fa887..ed476a0 100644 --- a/api/__init__.py +++ b/api/__init__.py @@ -60,6 +60,8 @@ from .s15_energy import get_pump_energy_schema, get_pump_energy, set_pump_energy from .s16_emitters import get_emitter_schema, get_emitter, set_emitter +from .s17_quality import get_quality_schema, get_quality, set_quality + 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 diff --git a/api/s17_quality.py b/api/s17_quality.py new file mode 100644 index 0000000..acb18cd --- /dev/null +++ b/api/s17_quality.py @@ -0,0 +1,59 @@ +from .operation import * + + +def get_quality_schema(name: str) -> dict[str, dict[str, Any]]: + return { 'node' : {'type': 'str' , 'optional': False , 'readonly': True }, + 'quality' : {'type': 'float' , 'optional': True , 'readonly': False} } + + +def get_quality(name: str, node: str) -> dict[str, Any]: + e = try_read(name, f"select * from quality where node = '{node}'") + if e == None: + return { 'node': node, 'quality': None } + d = {} + d['node'] = str(e['node']) + d['quality'] = float(e['quality']) if e['quality'] != None else None + return d + + +class Quality(object): + def __init__(self, input: dict[str, Any]) -> None: + self.type = 'quality' + self.node = str(input['node']) + self.quality = float(input['quality']) if 'quality' in input and input['quality'] != None else None + + self.f_type = f"'{self.type}'" + self.f_node = f"'{self.node}'" + self.f_quality = self.quality if self.quality != None else 'null' + + def as_dict(self) -> dict[str, Any]: + return { 'type': self.type, 'node': self.node, 'quality': self.quality } + + +def set_quality_cache(name: str, cs: ChangeSet) -> SqlChangeSet: + old = Quality(get_quality(name, cs.operations[0]['node'])) + raw_new = get_quality(name, cs.operations[0]['node']) + + new_dict = cs.operations[0] + schema = get_quality_schema(name) + for key, value in schema.items(): + if key in new_dict and not value['readonly']: + raw_new[key] = new_dict[key] + new = Quality(raw_new) + + redo_sql = f"delete from quality where node = {new.f_node};" + if new.quality != None: + redo_sql += f"\ninsert into quality (node, quality) values ({new.f_node}, {new.f_quality});" + + undo_sql = f"delete from quality where node = {old.f_node};" + if old.quality != None: + undo_sql += f"\ninsert into quality (node, quality) values ({old.f_node}, {old.f_quality});" + + redo_cs = g_update_prefix | new.as_dict() + undo_cs = g_update_prefix | old.as_dict() + + return SqlChangeSet(redo_sql, undo_sql, redo_cs, undo_cs) + + +def set_quality(name: str, cs: ChangeSet) -> ChangeSet: + return execute_command(name, set_quality_cache(name, cs)) diff --git a/script/sql/create/17.quality.sql b/script/sql/create/17.quality.sql index af1a83a..0b56391 100644 --- a/script/sql/create/17.quality.sql +++ b/script/sql/create/17.quality.sql @@ -3,5 +3,5 @@ create table quality ( node varchar(32) primary key references _node(id) -, initialqual numeric not null +, quality numeric not null ); diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 402b8f5..526aa99 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -2353,6 +2353,63 @@ class TestApi: self.leave(p) + # 17 quality + + + def test_quality(self): + p = 'test_quality' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j1', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + assert is_junction(p, 'j1') + + e = get_quality(p, 'j1') + assert e['node'] == 'j1' + assert e['quality'] == None + + set_quality(p, ChangeSet({'node': 'j1', 'quality': 10.0})) + + e = get_quality(p, 'j1') + assert e['node'] == 'j1' + assert e['quality'] == 10.0 + + set_quality(p, ChangeSet({'node': 'j1', 'quality': None})) + + e = get_quality(p, 'j1') + assert e['node'] == 'j1' + assert e['quality'] == None + + self.leave(p) + + + def test_quality_op(self): + p = 'test_quality_op' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j1', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + assert is_junction(p, 'j1') + + cs = set_quality(p, ChangeSet({'node': 'j1', 'quality': 10.0})).operations[0] + assert cs['operation'] == API_UPDATE + assert cs['type'] == 'quality' + assert cs['node'] == 'j1' + assert cs['quality'] == 10.0 + + cs = execute_undo(p).operations[0] + assert cs['operation'] == API_UPDATE + assert cs['type'] == 'quality' + assert cs['node'] == 'j1' + assert cs['quality'] == None + + cs = execute_redo(p).operations[0] + assert cs['operation'] == API_UPDATE + assert cs['type'] == 'quality' + assert cs['node'] == 'j1' + assert cs['quality'] == 10.0 + + self.leave(p) + + # 21 time diff --git a/tjnetwork.py b/tjnetwork.py index a0e2244..787db04 100644 --- a/tjnetwork.py +++ b/tjnetwork.py @@ -465,7 +465,7 @@ def set_rule(name: str, cs: ChangeSet) -> ChangeSet: ############################################################ -# energy 16.[ENERGY] +# energy 15.[ENERGY] ############################################################ def get_global_energy_schema(name: str) -> dict[str, dict[str, Any]]: @@ -486,6 +486,7 @@ def get_pump_energy(name: str, pump: str) -> dict[str, Any]: def set_pump_energy(name: str, cs: ChangeSet) -> ChangeSet: return api.set_pump_energy(name, cs) + ############################################################ # emitter 16.[EMITTERS] ############################################################ @@ -501,6 +502,21 @@ def set_emitter(name: str, cs: ChangeSet) -> ChangeSet: return api.set_emitter(name, cs) +############################################################ +# quality 17.[QUALITY] +############################################################ + +def get_quality_schema(name: str) -> dict[str, dict[str, Any]]: + return api.get_quality_schema(name) + +def get_quality(name: str, node: str) -> dict[str, Any]: + return api.get_quality(name, node) + +# example: set_quality(p, ChangeSet({'node': 'j1', 'quality': 10.0})) +def set_quality(name: str, cs: ChangeSet) -> ChangeSet: + return api.set_quality(name, cs) + + ############################################################ # time 21.[TIMES] ############################################################