diff --git a/api/s6_pumps.py b/api/s6_pumps.py index 1cbdae7..2d6e746 100644 --- a/api/s6_pumps.py +++ b/api/s6_pumps.py @@ -5,7 +5,11 @@ from .s0_base import * def get_pump_schema(name: str) -> dict[str, dict[str, Any]]: return { 'id' : {'type': 'str' , 'optional': False , 'readonly': True }, 'node1' : {'type': 'str' , 'optional': False , 'readonly': False}, - 'node2' : {'type': 'str' , 'optional': False , 'readonly': False} } + 'node2' : {'type': 'str' , 'optional': False , 'readonly': False}, + 'power' : {'type': 'float' , 'optional': True , 'readonly': False}, + 'head' : {'type': 'str' , 'optional': True , 'readonly': False}, + 'speed' : {'type': 'float' , 'optional': True , 'readonly': False}, + 'pattern' : {'type': 'str' , 'optional': True , 'readonly': False} } def get_pump(name: str, id: str) -> dict[str, Any]: @@ -14,6 +18,10 @@ def get_pump(name: str, id: str) -> dict[str, Any]: d['id'] = str(p['id']) d['node1'] = str(p['node1']) d['node2'] = str(p['node2']) + d['power'] = float(p['power']) if p['power'] != None else None + d['head'] = str(p['head']) if p['head'] != None else None + d['speed'] = float(p['speed']) if p['speed'] != None else None + d['pattern'] = str(p['pattern']) if p['pattern'] != None else None return d @@ -23,14 +31,22 @@ class Pump(object): self.id = str(input['id']) self.node1 = str(input['node1']) self.node2 = str(input['node2']) + self.power = float(input['power']) if 'power' in input and input['power'] != None else None + self.head = str(input['head']) if 'head' in input and input['head'] != None else None + self.speed = float(input['speed']) if 'speed' in input and input['speed'] != None else None + self.pattern = str(input['pattern']) if 'pattern' in input and input['pattern'] != None else None self.f_type = f"'{self.type}'" self.f_id = f"'{self.id}'" self.f_node1 = f"'{self.node1}'" self.f_node2 = f"'{self.node2}'" + self.f_power = self.power if self.power != None else 'null' + self.f_head = f"'{self.head}'" if self.head != None else 'null' + self.f_speed = self.speed if self.speed != None else 'null' + self.f_pattern = f"'{self.pattern}'" if self.pattern != None else 'null' def as_dict(self) -> dict[str, Any]: - return { 'type': self.type, 'id': self.id, 'node1': self.node1, 'node2': self.node2 } + return { 'type': self.type, 'id': self.id, 'node1': self.node1, 'node2': self.node2, 'power': self.power, 'head': self.head, 'speed': self.speed, 'pattern': self.pattern } def as_id_dict(self) -> dict[str, Any]: return { 'type': self.type, 'id': self.id } @@ -47,8 +63,8 @@ def set_pump(name: str, cs: ChangeSet) -> ChangeSet: raw_new[key] = new_dict[key] new = Pump(raw_new) - redo_sql = f"update pumps set node1 = {new.f_node1}, node2 = {new.f_node2} where id = {new.f_id};" - undo_sql = f"update pumps set node1 = {old.f_node1}, node2 = {old.f_node2} where id = {old.f_id};" + redo_sql = f"update pumps set node1 = {new.f_node1}, node2 = {new.f_node2}, power = {new.f_power}, head = {new.f_head}, speed = {new.f_speed}, pattern = {new.f_pattern} where id = {new.f_id};" + undo_sql = f"update pumps set node1 = {old.f_node1}, node2 = {old.f_node2}, power = {old.f_power}, head = {old.f_head}, speed = {old.f_speed}, pattern = {old.f_pattern} where id = {old.f_id};" redo_cs = g_update_prefix | new.as_dict() undo_cs = g_update_prefix | old.as_dict() @@ -60,7 +76,7 @@ def add_pump(name: str, cs: ChangeSet) -> ChangeSet: new = Pump(cs.operations[0]) redo_sql = f"insert into _link (id, type) values ({new.f_id}, {new.f_type});" - redo_sql += f"\ninsert into pumps (id, node1, node2) values ({new.f_id}, {new.f_node1}, {new.f_node2});" + redo_sql += f"\ninsert into pumps (id, node1, node2, power, head, speed, pattern) values ({new.f_id}, {new.f_node1}, {new.f_node2}, {new.f_power}, {new.f_head}, {new.f_speed}, {new.f_pattern});" undo_sql = f"delete from pumps where id = {new.f_id};" undo_sql += f"\ndelete from _link where id = {new.f_id};" @@ -78,7 +94,7 @@ def delete_pump(name: str, cs: ChangeSet) -> ChangeSet: redo_sql += f"\ndelete from _link where id = {old.f_id};" undo_sql = f"insert into _link (id, type) values ({old.f_id}, {old.f_type});" - undo_sql += f"\ninsert into pumps (id, node1, node2) values ({old.f_id}, {old.f_node1}, {old.f_node2});" + undo_sql += f"\ninsert into pumps (id, node1, node2, power, head, speed, pattern) values ({old.f_id}, {old.f_node1}, {old.f_node2}, {old.f_power}, {old.f_head}, {old.f_speed}, {old.f_pattern});" redo_cs = g_delete_prefix | old.as_id_dict() undo_cs = g_add_prefix | old.as_dict() diff --git a/script/sql/create/6.pumps.sql b/script/sql/create/6.pumps.sql index 128958f..1411d9c 100644 --- a/script/sql/create/6.pumps.sql +++ b/script/sql/create/6.pumps.sql @@ -5,28 +5,9 @@ create table pumps id varchar(32) primary key references _link(id) , node1 varchar(32) references _node(id) not null , node2 varchar(32) references _node(id) not null -); - -create table pumps_property_power -( - id varchar primary key references pumps(id) -, value varchar(32) not null -); - -create table pumps_property_speed -( - id varchar primary key references pumps(id) -, value varchar(32) not null -); - -create table pumps_property_head -( - id varchar primary key references pumps(id) -, head varchar(32) references _curve(id) not null -); - -create table pumps_property_pattern -( - id varchar primary key references pumps(id) -, pattern varchar(32) references _pattern(id) not null +, power numeric +, head varchar(32) references _curve(id) +, speed numeric +, pattern varchar(32) references _pattern(id) +, check (power is not null or head is not null) ); diff --git a/test_tjnetwork.py b/test_tjnetwork.py index 04cd9c8..34c48e1 100644 --- a/test_tjnetwork.py +++ b/test_tjnetwork.py @@ -165,7 +165,7 @@ class TestApi: add_junction(p, ChangeSet({'id': 'j2', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) add_junction(p, ChangeSet({'id': 'j3', 'x': 0.0, 'y': 10.0, 'elevation': 20.0})) add_pipe(p, ChangeSet({'id': 'p1', 'node1': 'j1', 'node2': 'j2', 'length': 100.0, 'diameter': 10.0, 'roughness': 0.1, 'minor_loss': 0.5, 'status': PIPE_STATUS_OPEN })) - add_pump(p, ChangeSet({'id': 'p2', 'node1': 'j1', 'node2': 'j2'})) + add_pump(p, ChangeSet({'id': 'p2', 'node1': 'j1', 'node2': 'j2', 'power': 0.0})) add_valve(p, ChangeSet({'id': 'v1', 'node1': 'j2', 'node2': 'j3', 'diameter': 10.0, 'v_type': VALVES_TYPE_FCV, 'setting': 0.1, 'minor_loss': 0.5 })) assert get_junction(p, 'j1')['links'] == ['p1', 'p2'] assert get_junction(p, 'j2')['links'] == ['p1', 'p2', 'v1'] @@ -322,7 +322,7 @@ class TestApi: add_reservoir(p, ChangeSet({'id': 'r2', 'x': 0.0, 'y': 10.0, 'head': 20.0})) add_reservoir(p, ChangeSet({'id': 'r3', 'x': 0.0, 'y': 10.0, 'head': 20.0})) add_pipe(p, ChangeSet({'id': 'p1', 'node1': 'r1', 'node2': 'r2', 'length': 100.0, 'diameter': 10.0, 'roughness': 0.1, 'minor_loss': 0.5, 'status': PIPE_STATUS_OPEN })) - add_pump(p, ChangeSet({'id': 'p2', 'node1': 'r1', 'node2': 'r2'})) + add_pump(p, ChangeSet({'id': 'p2', 'node1': 'r1', 'node2': 'r2', 'power': 0.0})) add_valve(p, ChangeSet({'id': 'v1', 'node1': 'r2', 'node2': 'r3', 'diameter': 10.0, 'v_type': VALVES_TYPE_FCV, 'setting': 0.1, 'minor_loss': 0.5 })) assert get_reservoir(p, 'r1')['links'] == ['p1', 'p2'] assert get_reservoir(p, 'r2')['links'] == ['p1', 'p2', 'v1'] @@ -497,7 +497,7 @@ class TestApi: add_tank(p, ChangeSet({'id': 't2', '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_tank(p, ChangeSet({'id': 't3', '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': 'p1', 'node1': 't1', 'node2': 't2', 'length': 100.0, 'diameter': 10.0, 'roughness': 0.1, 'minor_loss': 0.5, 'status': PIPE_STATUS_OPEN })) - add_pump(p, ChangeSet({'id': 'p2', 'node1': 't1', 'node2': 't2'})) + add_pump(p, ChangeSet({'id': 'p2', 'node1': 't1', 'node2': 't2', 'power': 0.0})) add_valve(p, ChangeSet({'id': 'v1', 'node1': 't2', 'node2': 't3', 'diameter': 10.0, 'v_type': VALVES_TYPE_FCV, 'setting': 0.1, 'minor_loss': 0.5 })) assert get_tank(p, 't1')['links'] == ['p1', 'p2'] assert get_tank(p, 't2')['links'] == ['p1', 'p2', 'v1'] @@ -846,17 +846,25 @@ class TestApi: assert is_junction(p, 'j3') assert is_junction(p, 'j4') - add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2'})) + add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2', 'power': 0.0})) p0 = get_pump(p, 'p0') assert p0['node1'] == 'j1' assert p0['node2'] == 'j2' + assert p0['power'] == 0.0 + assert p0['head'] == None + assert p0['speed'] == None + assert p0['pattern'] == None set_pump(p, ChangeSet({'id': 'p0', 'node1': 'j3', 'node2': 'j4'})) p0 = get_pump(p, 'p0') assert p0['node1'] == 'j3' assert p0['node2'] == 'j4' - add_pump(p, ChangeSet({'id': 'p1', 'node1': 'j1', 'node2': 'j2'})) + set_pump(p, ChangeSet({'id': 'p0', 'power': 100.0})) + p0 = get_pump(p, 'p0') + assert p0['power'] == 100.0 + + add_pump(p, ChangeSet({'id': 'p1', 'node1': 'j1', 'node2': 'j2', 'power': 0.0})) links = get_links(p) assert len(links) == 2 assert links[0] == 'p0' @@ -889,12 +897,13 @@ class TestApi: assert is_junction(p, 'j3') assert is_junction(p, 'j4') - cs = add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2'})).operations[0] + cs = add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2', 'power': 0.0})).operations[0] assert cs['operation'] == 'add' assert cs['type'] == PUMP assert cs['id'] == 'p0' assert cs['node1'] == 'j1' assert cs['node2'] == 'j2' + assert cs['power'] == 0.0 cs = execute_undo(p).operations[0] assert cs['operation'] == 'delete' @@ -919,7 +928,7 @@ class TestApi: links = get_links(p) assert len(links) == 0 - add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2'})) + add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2', 'power': 0.0})) links = get_links(p) assert len(links) == 1 @@ -968,6 +977,18 @@ class TestApi: assert cs['node1'] == 'j1' assert cs['node2'] == 'j2' + cs = set_pump(p, ChangeSet({'id': 'p0', 'power': 100.0})).operations[0] + assert cs['operation'] == 'update' + assert cs['type'] == PUMP + assert cs['id'] == 'p0' + assert cs['power'] == 100.0 + + cs = execute_undo(p).operations[0] + assert cs['operation'] == 'update' + assert cs['type'] == PUMP + assert cs['id'] == 'p0' + assert cs['power'] == 0.0 + self.leave(p) diff --git a/tjnetwork.py b/tjnetwork.py index 58fbcf0..06082be 100644 --- a/tjnetwork.py +++ b/tjnetwork.py @@ -261,7 +261,7 @@ def get_pump(name: str, id: str) -> dict[str, Any]: def set_pump(name: str, cs: ChangeSet) -> ChangeSet: return api.set_pump(name, cs) -# example: add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2'})) +# example: add_pump(p, ChangeSet({'id': 'p0', 'node1': 'j1', 'node2': 'j2', 'power': 0})) def add_pump(name: str, cs: ChangeSet) -> ChangeSet: return api.add_pump(name, cs)