From edc6d423ec1cb01b1577cd64a35cf8915c7eaf7b Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 14:44:32 +0800 Subject: [PATCH 01/15] Get source guard --- api/s18_sources.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/api/s18_sources.py b/api/s18_sources.py index 7730916..1baeab8 100644 --- a/api/s18_sources.py +++ b/api/s18_sources.py @@ -14,7 +14,9 @@ def get_source_schema(name: str) -> dict[str, dict[str, Any]]: def get_source(name: str, node: str) -> dict[str, Any]: - s = read(name, f"select * from sources where node = '{node}'") + s = try_read(name, f"select * from sources where node = '{node}'") + if s == None: + return {} d = {} d['node'] = str(s['node']) d['s_type'] = str(s['type']) From 4f83e59f0d9f055f229b7d69f1e3f8ae39de053e Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 14:45:41 +0800 Subject: [PATCH 02/15] Test junction cascade deletion --- test_tjnetwork.py | 59 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 59 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index e8d5183..a71d220 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -399,6 +399,65 @@ class TestApi: self.leave(p) + def test_junction_del(self): + p = 'test_junction_del' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_junction(p, ChangeSet({'id': 'j1', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_pipe(p, ChangeSet({'id': 'p0', 'node1': 'j0', 'node2': 'j1', 'length': 100.0, 'diameter': 10.0, 'roughness': 0.1, 'minor_loss': 0.5, 'status': PIPE_STATUS_OPEN })) + set_tag(p, ChangeSet({'t_type': TAG_TYPE_NODE, 'id': 'j0', 'tag': 'j0t' })) + set_demand(p, ChangeSet({'junction': 'j0', 'demands': [{'demand': 10.0, 'pattern': None, 'category': 'x'}, {'demand': 20.0, 'pattern': None, 'category': None}]})) + set_emitter(p, ChangeSet({'junction': 'j0', 'coefficient': 10.0})) + set_quality(p, ChangeSet({'node': 'j0', 'quality': 10.0})) + add_source(p, ChangeSet({'node': 'j0', 's_type': SOURCE_TYPE_CONCEN, 'strength': 10.0, 'pattern': None })) + add_label(p, ChangeSet({'x': 0.0, 'y': 0.0, 'label': 'x', 'node': 'j0'})) + assert is_junction(p, 'j0') + assert is_junction(p, 'j1') + assert is_pipe(p, 'p0') + assert get_tag(p, TAG_TYPE_NODE, 'j0')['tag'] == 'j0t' + assert get_demand(p, 'j0')['demands'] == [{'demand': 10.0, 'pattern': None, 'category': 'x'}, {'demand': 20.0, 'pattern': None, 'category': None}] + assert get_emitter(p, 'j0')['coefficient'] == 10.0 + assert get_quality(p, 'j0')['quality'] == 10.0 + assert get_source(p, 'j0')['s_type'] == SOURCE_TYPE_CONCEN + assert get_label(p, 0.0, 0.0)['node'] == 'j0' + + print(delete_junction(p, ChangeSet({'id': 'j0'})).operations) + assert is_junction(p, 'j0') == False + assert is_junction(p, 'j1') + assert is_pipe(p, 'p0') == False + assert get_tag(p, TAG_TYPE_NODE, 'j0')['tag'] == None + assert get_demand(p, 'j1')['demands'] == [] + assert get_emitter(p, 'j0')['coefficient'] == None + assert get_quality(p, 'j0')['quality'] == None + assert get_source(p, 'j0') == {} + assert get_label(p, 0.0, 0.0)['node'] == None + + execute_undo(p) + assert is_junction(p, 'j0') + assert is_junction(p, 'j1') + assert is_pipe(p, 'p0') + assert get_tag(p, TAG_TYPE_NODE, 'j0')['tag'] == 'j0t' + assert get_demand(p, 'j0')['demands'] == [{'demand': 10.0, 'pattern': None, 'category': 'x'}, {'demand': 20.0, 'pattern': None, 'category': None}] + assert get_emitter(p, 'j0')['coefficient'] == 10.0 + assert get_quality(p, 'j0')['quality'] == 10.0 + assert get_source(p, 'j0')['s_type'] == SOURCE_TYPE_CONCEN + assert get_label(p, 0.0, 0.0)['node'] == 'j0' + + execute_redo(p) + assert is_junction(p, 'j0') == False + assert is_junction(p, 'j1') + assert is_pipe(p, 'p0') == False + assert get_tag(p, TAG_TYPE_NODE, 'j0')['tag'] == None + assert get_demand(p, 'j1')['demands'] == [] + assert get_emitter(p, 'j0')['coefficient'] == None + assert get_quality(p, 'j0')['quality'] == None + assert get_source(p, 'j0') == {} + assert get_label(p, 0.0, 0.0)['node'] == None + + self.leave(p) + + # 3 reservoir From b3b59eb4e0ded2ad0ba87c0b427c84cdce673dc8 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 14:46:06 +0800 Subject: [PATCH 03/15] Test reservoir cascade deletion --- test_tjnetwork.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index a71d220..344fb5a 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -612,6 +612,35 @@ class TestApi: self.leave(p) + def test_reservoir_del(self): + p = 'test_reservoir_del' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_reservoir(p, ChangeSet({'id': 'r0', 'x': 0.0, 'y': 10.0, 'head': 20.0})) + add_pipe(p, ChangeSet({'id': 'p0', 'node1': 'j0', 'node2': 'r0', 'length': 100.0, 'diameter': 10.0, 'roughness': 0.1, 'minor_loss': 0.5, 'status': PIPE_STATUS_OPEN })) + assert is_junction(p, 'j0') + assert is_reservoir(p, 'r0') + assert is_pipe(p, 'p0') + + delete_reservoir(p, ChangeSet({'id': 'r0'})) + assert is_junction(p, 'j0') + assert is_reservoir(p, 'r0') == False + assert is_pipe(p, 'p0') == False + + execute_undo(p) + assert is_junction(p, 'j0') + assert is_reservoir(p, 'r0') + assert is_pipe(p, 'p0') + + execute_redo(p) + assert is_junction(p, 'j0') + assert is_reservoir(p, 'r0') == False + assert is_pipe(p, 'p0') == False + + self.leave(p) + + # 4 tank From 2c584f1a15c32c33759827b3d7d6a8be9fa9ac6f Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 14:46:24 +0800 Subject: [PATCH 04/15] Test tank cascade deletion --- test_tjnetwork.py | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 344fb5a..1bd5cc5 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -855,6 +855,40 @@ class TestApi: self.leave(p) + def test_tank_del(self): + p = 'test_tank_del' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_tank(p, ChangeSet({'id': 't0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0, 'init_level': 1.0, 'min_level': 0.0, 'max_level': 2.0, 'diameter': 10.0, 'min_vol': 100.0, 'vol_curve': None, 'overflow': OVERFLOW_NO})) + add_pipe(p, ChangeSet({'id': 'p0', 'node1': 'j0', 'node2': 't0', 'length': 100.0, 'diameter': 10.0, 'roughness': 0.1, 'minor_loss': 0.5, 'status': PIPE_STATUS_OPEN })) + set_tank_reaction(p, ChangeSet({'tank': 't0', 'value': 10.0})) + assert is_junction(p, 'j0') + assert is_tank(p, 't0') + assert is_pipe(p, 'p0') + assert get_tank_reaction(p, 't0')['value'] == 10.0 + + delete_tank(p, ChangeSet({'id': 't0'})) + assert is_junction(p, 'j0') + assert is_tank(p, 't0') == False + assert is_pipe(p, 'p0') == False + assert get_tank_reaction(p, 't0')['value'] == None + + execute_undo(p) + assert is_junction(p, 'j0') + assert is_tank(p, 't0') + assert is_pipe(p, 'p0') + assert get_tank_reaction(p, 't0')['value'] == 10.0 + + execute_redo(p) + assert is_junction(p, 'j0') + assert is_tank(p, 't0') == False + assert is_pipe(p, 'p0') == False + assert get_tank_reaction(p, 't0')['value'] == None + + self.leave(p) + + # 5 pipe @@ -2453,6 +2487,8 @@ class TestApi: add_pattern(p, ChangeSet({'id' : 'p0', 'factors': [1.0, 2.0, 3.0]})) add_pattern(p, ChangeSet({'id' : 'p1', 'factors': [1.0, 2.0, 3.0]})) + assert get_source(p, 'j0') == {} + add_source(p, ChangeSet({'node': 'j0', 's_type': SOURCE_TYPE_CONCEN, 'strength': 10.0, 'pattern': 'p0'})) s = get_source(p, 'j0') assert s['node'] == 'j0' @@ -2483,6 +2519,8 @@ class TestApi: delete_source(p, ChangeSet({'node': 'j0'})) + assert get_source(p, 'j0') == {} + self.leave(p) From 15d14765bde62ce81dba8feb5e30ba176b9efa19 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 15:07:01 +0800 Subject: [PATCH 05/15] Remove debug info --- test_tjnetwork.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 1bd5cc5..3fc1219 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -422,7 +422,7 @@ class TestApi: assert get_source(p, 'j0')['s_type'] == SOURCE_TYPE_CONCEN assert get_label(p, 0.0, 0.0)['node'] == 'j0' - print(delete_junction(p, ChangeSet({'id': 'j0'})).operations) + delete_junction(p, ChangeSet({'id': 'j0'})) assert is_junction(p, 'j0') == False assert is_junction(p, 'j1') assert is_pipe(p, 'p0') == False From 63175956efb0376ef7cf7d19a17fef5e0f8da136 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 15:07:36 +0800 Subject: [PATCH 06/15] Test pipe cascade deletion --- test_tjnetwork.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 3fc1219..181590f 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -1085,6 +1085,55 @@ class TestApi: self.leave(p) + def test_pipe_del(self): + p = 'test_pipe_del' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_junction(p, ChangeSet({'id': 'j1', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_pipe(p, ChangeSet({'id': 'p0', 'node1': 'j0', 'node2': 'j1', 'length': 100.0, 'diameter': 10.0, 'roughness': 0.1, 'minor_loss': 0.5, 'status': PIPE_STATUS_OPEN })) + set_tag(p, ChangeSet({'t_type': TAG_TYPE_LINK, 'id': 'p0', 'tag': 'p0t' })) + set_status(p, ChangeSet({'link': 'p0', 'status': LINK_STATUS_OPEN, 'setting': 10.0})) + set_pipe_reaction(p, ChangeSet({'pipe': 'p0', 'bulk': 10.0, 'wall': 20.0})) + set_vertex(p, ChangeSet({'link' : 'p0', 'coords': [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}]})) + assert is_pipe(p, 'p0') + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == 'p0t' + assert get_status(p, 'p0')['status'] == LINK_STATUS_OPEN + assert get_status(p, 'p0')['setting'] == 10.0 + assert get_pipe_reaction(p, 'p0')['bulk'] == 10.0 + assert get_pipe_reaction(p, 'p0')['wall'] == 20.0 + assert get_vertex(p, 'p0')['coords'] == [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}] + + delete_pipe(p, ChangeSet({'id': 'p0'})) + assert is_pipe(p, 'p0') == False + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == None + assert get_status(p, 'p0')['status'] == None + assert get_status(p, 'p0')['setting'] == None + assert get_pipe_reaction(p, 'p0')['bulk'] == None + assert get_pipe_reaction(p, 'p0')['wall'] == None + assert get_vertex(p, 'p0')['coords'] == [] + + execute_undo(p) + assert is_pipe(p, 'p0') + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == 'p0t' + assert get_status(p, 'p0')['status'] == LINK_STATUS_OPEN + assert get_status(p, 'p0')['setting'] == 10.0 + assert get_pipe_reaction(p, 'p0')['bulk'] == 10.0 + assert get_pipe_reaction(p, 'p0')['wall'] == 20.0 + assert get_vertex(p, 'p0')['coords'] == [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}] + + execute_redo(p) + assert is_pipe(p, 'p0') == False + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == None + assert get_status(p, 'p0')['status'] == None + assert get_status(p, 'p0')['setting'] == None + assert get_pipe_reaction(p, 'p0')['bulk'] == None + assert get_pipe_reaction(p, 'p0')['wall'] == None + assert get_vertex(p, 'p0')['coords'] == [] + + self.leave(p) + + # 6 pump From 685c8a3a338576cb305c605f6d48a7a91e40717c Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 15:08:08 +0800 Subject: [PATCH 07/15] Test pump cascade deletion --- test_tjnetwork.py | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 181590f..1456dbb 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -1296,6 +1296,51 @@ class TestApi: self.leave(p) + def test_pipe_del(self): + p = 'test_pipe_del' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_junction(p, ChangeSet({'id': 'j1', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j0', 'node2': 'j1', 'power': 0.0})) + set_tag(p, ChangeSet({'t_type': TAG_TYPE_LINK, 'id': 'p0', 'tag': 'p0t' })) + set_status(p, ChangeSet({'link': 'p0', 'status': LINK_STATUS_OPEN, 'setting': 10.0})) + set_pump_energy(p, ChangeSet({'pump' : 'p0', 'price': 1.0})) + set_vertex(p, ChangeSet({'link' : 'p0', 'coords': [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}]})) + assert is_pump(p, 'p0') + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == 'p0t' + assert get_status(p, 'p0')['status'] == LINK_STATUS_OPEN + assert get_status(p, 'p0')['setting'] == 10.0 + assert get_pump_energy(p, 'p0')['price'] == 1.0 + assert get_vertex(p, 'p0')['coords'] == [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}] + + delete_pump(p, ChangeSet({'id': 'p0'})) + assert is_pump(p, 'p0') == False + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == None + assert get_status(p, 'p0')['status'] == None + assert get_status(p, 'p0')['setting'] == None + assert get_pump_energy(p, 'p0')['price'] == None + assert get_vertex(p, 'p0')['coords'] == [] + + execute_undo(p) + assert is_pump(p, 'p0') + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == 'p0t' + assert get_status(p, 'p0')['status'] == LINK_STATUS_OPEN + assert get_status(p, 'p0')['setting'] == 10.0 + assert get_pump_energy(p, 'p0')['price'] == 1.0 + assert get_vertex(p, 'p0')['coords'] == [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}] + + execute_redo(p) + assert is_pump(p, 'p0') == False + assert get_tag(p, TAG_TYPE_LINK, 'p0')['tag'] == None + assert get_status(p, 'p0')['status'] == None + assert get_status(p, 'p0')['setting'] == None + assert get_pump_energy(p, 'p0')['price'] == None + assert get_vertex(p, 'p0')['coords'] == [] + + self.leave(p) + + # 7 valve From 6e6fc676777d4a75d7cbd87a536df12eeb1c839c Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 15:08:27 +0800 Subject: [PATCH 08/15] Test valve cascade deletion --- test_tjnetwork.py | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 1456dbb..8c8e37e 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -1526,6 +1526,46 @@ class TestApi: self.leave(p) + def test_valve_del(self): + p = 'test_valve_del' + self.enter(p) + + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_junction(p, ChangeSet({'id': 'j1', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) + add_valve(p, ChangeSet({'id': 'v0', 'node1': 'j0', 'node2': 'j1', 'diameter': 10.0, 'v_type': VALVES_TYPE_FCV, 'setting': 0.1, 'minor_loss': 0.5 })) + set_tag(p, ChangeSet({'t_type': TAG_TYPE_LINK, 'id': 'v0', 'tag': 'v0t' })) + set_status(p, ChangeSet({'link': 'v0', 'status': LINK_STATUS_OPEN, 'setting': 10.0})) + set_vertex(p, ChangeSet({'link' : 'v0', 'coords': [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}]})) + assert is_valve(p, 'v0') + assert get_tag(p, TAG_TYPE_LINK, 'v0')['tag'] == 'v0t' + assert get_status(p, 'v0')['status'] == LINK_STATUS_OPEN + assert get_status(p, 'v0')['setting'] == 10.0 + assert get_vertex(p, 'v0')['coords'] == [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}] + + delete_valve(p, ChangeSet({'id': 'v0'})) + assert is_valve(p, 'v0') == False + assert get_tag(p, TAG_TYPE_LINK, 'v0')['tag'] == None + assert get_status(p, 'v0')['status'] == None + assert get_status(p, 'v0')['setting'] == None + assert get_vertex(p, 'v0')['coords'] == [] + + execute_undo(p) + assert is_valve(p, 'v0') + assert get_tag(p, TAG_TYPE_LINK, 'v0')['tag'] == 'v0t' + assert get_status(p, 'v0')['status'] == LINK_STATUS_OPEN + assert get_status(p, 'v0')['setting'] == 10.0 + assert get_vertex(p, 'v0')['coords'] == [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}] + + execute_redo(p) + assert is_valve(p, 'v0') == False + assert get_tag(p, TAG_TYPE_LINK, 'v0')['tag'] == None + assert get_status(p, 'v0')['status'] == None + assert get_status(p, 'v0')['setting'] == None + assert get_vertex(p, 'v0')['coords'] == [] + + self.leave(p) + + # 8 tag From 2d0598ca5df2bfa9e214beb88c840f910e0298c9 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 15:58:51 +0800 Subject: [PATCH 09/15] Fix test name --- test_tjnetwork.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 8c8e37e..039ddc8 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -1296,8 +1296,8 @@ class TestApi: self.leave(p) - def test_pipe_del(self): - p = 'test_pipe_del' + def test_pump_del(self): + p = 'test_pump_del' self.enter(p) add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) From 41b923a8384096357d706eb6401ec4faed3c304b Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 15:59:34 +0800 Subject: [PATCH 10/15] Fix unset_pump_energy_by_pattern return value --- api/s15_energy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/s15_energy.py b/api/s15_energy.py index e9c7dc5..92eccc6 100644 --- a/api/s15_energy.py +++ b/api/s15_energy.py @@ -215,7 +215,7 @@ def unset_pump_energy_by_pattern(name: str, pattern: str) -> ChangeSet: effic = str(row2['effic']) if row2 != None else None cs.append(g_update_prefix | {'type': 'pump_energy', 'pump' : pump, 'price': price, 'pattern': None, 'effic': effic}) - return ChangeSet() + return cs def unset_pump_energy_by_curve(name: str, curve: str) -> ChangeSet: From d3e8e63e1bebb08afc52aa0cf9a51c9ac7119498 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 16:00:23 +0800 Subject: [PATCH 11/15] Fix unset_pump_energy_by_curve return value --- api/s15_energy.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/s15_energy.py b/api/s15_energy.py index 92eccc6..2845056 100644 --- a/api/s15_energy.py +++ b/api/s15_energy.py @@ -230,4 +230,4 @@ def unset_pump_energy_by_curve(name: str, curve: str) -> ChangeSet: pattern = str(row2['pattern']) if row2 != None else None cs.append(g_update_prefix | {'type': 'pump_energy', 'pump' : pump, 'price': price, 'pattern': pattern, 'effic': None}) - return ChangeSet() + return cs From 133ba32cdfd94d19459ae53970ca6fe0795413fa Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 16:00:44 +0800 Subject: [PATCH 12/15] Fix unset_demand_by_pattern cs --- api/s9_demands.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/s9_demands.py b/api/s9_demands.py index edb476c..38d84c8 100644 --- a/api/s9_demands.py +++ b/api/s9_demands.py @@ -169,6 +169,6 @@ def unset_demand_by_pattern(name: str, pattern: str) -> ChangeSet: ds = get_demand(name, row['id']) for d in ds['demands']: d['pattern'] = None - cs.append(g_update_prefix | {'type': 'demand', 'junction': row['junction'], 'demands': ds}) + cs.append(g_update_prefix | {'type': 'demand', 'junction': row['id'], 'demands': ds['demands']}) return cs From ae793d8ab590a45df2f499644dcb5b10d214392e Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 16:25:14 +0800 Subject: [PATCH 13/15] Workaround to prevent pump (cascade) deletion... --- api/s6_pumps.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/api/s6_pumps.py b/api/s6_pumps.py index 1f9dce8..1bdbef9 100644 --- a/api/s6_pumps.py +++ b/api/s6_pumps.py @@ -175,9 +175,12 @@ def inp_out_pump(name: str) -> list[str]: def unset_pump_by_curve(name: str, curve: str) -> ChangeSet: cs = ChangeSet() - rows = read_all(name, f"select id from pumps where head = '{curve}'") + rows = read_all(name, f"select * from pumps where head = '{curve}'") for row in rows: - cs.append(g_update_prefix | {'type': 'pump', 'id': row['id'], 'head': None}) + if row['power'] != None: + cs.append(g_update_prefix | {'type': 'pump', 'id': row['id'], 'head': None}) + else: # workaround to prevent pump deletion... and I don't want to remove constraint... + cs.append(g_update_prefix | {'type': 'pump', 'id': row['id'], 'head': None, 'power': 0.0}) return cs From 719e63e572cb50fda67afb97f8b0e3f7f523e726 Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 16:25:45 +0800 Subject: [PATCH 14/15] Test pattern cascade deletion --- test_tjnetwork.py | 49 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 039ddc8..9a8fe8a 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -1958,6 +1958,55 @@ class TestApi: self.leave(p) + def test_pattern_del(self): + p = 'test_pattern_del' + self.enter(p) + + add_pattern(p, ChangeSet({'id' : 'p0', 'factors': [1.0, 2.0, 3.0]})) + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0, 'pattern': 'p0'})) + add_reservoir(p, ChangeSet({'id': 'r0', 'x': 0.0, 'y': 10.0, 'head': 20.0, 'pattern': 'p0'})) + add_pump(p, ChangeSet({'id': 'pump0', 'node1': 'j0', 'node2': 'r0', 'power': 0.0, 'pattern': 'p0'})) + set_demand(p, ChangeSet({'junction': 'j0', 'demands': [{'demand': 10.0, 'pattern': 'p0', 'category': 'x'}, {'demand': 20.0, 'pattern': 'p0', 'category': None}]})) + set_pump_energy(p, ChangeSet({'pump' : 'pump0', 'pattern': 'p0'})) + add_source(p, ChangeSet({'node': 'j0', 's_type': SOURCE_TYPE_CONCEN, 'strength': 10.0, 'pattern': 'p0' })) + assert is_pattern(p, 'p0') + assert get_junction(p, 'j0')['pattern'] == 'p0' + assert get_reservoir(p, 'r0')['pattern'] == 'p0' + assert get_pump(p, 'pump0')['pattern'] == 'p0' + assert get_demand(p, 'j0')['demands'] == [{'demand': 10.0, 'pattern': 'p0', 'category': 'x'}, {'demand': 20.0, 'pattern': 'p0', 'category': None}] + assert get_pump_energy(p, 'pump0')['pattern'] == 'p0' + assert get_source(p, 'j0')['pattern'] == 'p0' + + delete_pattern(p, ChangeSet({'id': 'p0'})) + assert is_pattern(p, 'p0') == False + assert get_junction(p, 'j0')['pattern'] == None + assert get_reservoir(p, 'r0')['pattern'] == None + assert get_pump(p, 'pump0')['pattern'] == None + assert get_demand(p, 'j0')['demands'] == [{'demand': 10.0, 'pattern': None, 'category': 'x'}, {'demand': 20.0, 'pattern': None, 'category': None}] + assert get_pump_energy(p, 'pump0')['pattern'] == None + assert get_source(p, 'j0')['pattern'] == None + + execute_undo(p) + assert is_pattern(p, 'p0') + assert get_junction(p, 'j0')['pattern'] == 'p0' + assert get_reservoir(p, 'r0')['pattern'] == 'p0' + assert get_pump(p, 'pump0')['pattern'] == 'p0' + assert get_demand(p, 'j0')['demands'] == [{'demand': 10.0, 'pattern': 'p0', 'category': 'x'}, {'demand': 20.0, 'pattern': 'p0', 'category': None}] + assert get_pump_energy(p, 'pump0')['pattern'] == 'p0' + assert get_source(p, 'j0')['pattern'] == 'p0' + + execute_redo(p) + assert is_pattern(p, 'p0') == False + assert get_junction(p, 'j0')['pattern'] == None + assert get_reservoir(p, 'r0')['pattern'] == None + assert get_pump(p, 'pump0')['pattern'] == None + assert get_demand(p, 'j0')['demands'] == [{'demand': 10.0, 'pattern': None, 'category': 'x'}, {'demand': 20.0, 'pattern': None, 'category': None}] + assert get_pump_energy(p, 'pump0')['pattern'] == None + assert get_source(p, 'j0')['pattern'] == None + + self.leave(p) + + # 12 curve From 73ec2faa97effcb8fbebef44599789730783417d Mon Sep 17 00:00:00 2001 From: "WQY\\qiong" Date: Sat, 4 Feb 2023 16:26:05 +0800 Subject: [PATCH 15/15] Test curve cascade deletion --- test_tjnetwork.py | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 9a8fe8a..c2c92c3 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -2153,6 +2153,42 @@ class TestApi: self.leave(p) + def test_curve_del(self): + p = 'test_curve_del' + self.enter(p) + + add_curve(p, ChangeSet({'id' : 'c0', 'c_type' : CURVE_TYPE_PUMP, 'coords': [{'x': 1.0, 'y': 2.0}, {'x': 2.0, 'y': 1.0}]})) + add_tank(p, ChangeSet({'id': 't0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0, 'init_level': 1.0, 'min_level': 0.0, 'max_level': 2.0, 'diameter': 10.0, 'min_vol': 100.0, 'vol_curve': 'c0', 'overflow': OVERFLOW_NO})) + add_junction(p, ChangeSet({'id': 'j0', 'x': 0.0, 'y': 10.0, 'elevation': 20.0, 'pattern': None})) + add_reservoir(p, ChangeSet({'id': 'r0', 'x': 0.0, 'y': 10.0, 'head': 20.0, 'pattern': None})) + add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j0', 'node2': 'r0', 'head': 'c0'})) + set_pump_energy(p, ChangeSet({'pump' : 'p0', 'effic': 'c0'})) + assert is_curve(p, 'c0') + assert get_tank(p, 't0')['vol_curve'] == 'c0' + assert get_pump(p, 'p0')['head'] == 'c0' + assert get_pump_energy(p, 'p0')['effic'] == 'c0' + + delete_curve(p, ChangeSet({'id': 'c0'})) + assert is_curve(p, 'c0') == False + assert get_tank(p, 't0')['vol_curve'] == None + assert get_pump(p, 'p0')['head'] == None + assert get_pump_energy(p, 'p0')['effic'] == None + + execute_undo(p) + assert is_curve(p, 'c0') + assert get_tank(p, 't0')['vol_curve'] == 'c0' + assert get_pump(p, 'p0')['head'] == 'c0' + assert get_pump_energy(p, 'p0')['effic'] == 'c0' + + execute_redo(p) + assert is_curve(p, 'c0') == False + assert get_tank(p, 't0')['vol_curve'] == None + assert get_pump(p, 'p0')['head'] == None + assert get_pump_energy(p, 'p0')['effic'] == None + + self.leave(p) + + # 13 control