From f7ff8bc38410c2666665c4c70cc71c17f6eb7835 Mon Sep 17 00:00:00 2001 From: Alon Levy Date: Tue, 23 Dec 2014 21:53:46 +0200 Subject: use topo_diff for user input changes pretty large commit, but it mainly boils to - reusing the same format clone returns to the client for topo_diff bad bad code introduced mainly in client side, but server wasn't spared: - graph/commit_topo__diff massages the links too much - this should not be there at all, it should be in the correct format to begin with. server code duplication between clone & topo_diff post processing, should be factored out on the good side: single transaction whenever user presses enter, and the correct place to send back any accumulated diffs (other user changes). --- src/server/db_controller.py | 42 ++++++++++++++++++++++++++++++++++++------ src/server/neo4j_util.py | 4 ++-- 2 files changed, 38 insertions(+), 8 deletions(-) (limited to 'src/server') diff --git a/src/server/db_controller.py b/src/server/db_controller.py index fac4146a..b9e1ef8d 100644 --- a/src/server/db_controller.py +++ b/src/server/db_controller.py @@ -133,6 +133,8 @@ class DBO_topo_diff_commit(DB_composed_op): l_rm_set = topo_diff.link_set_rm n_rm_set = topo_diff.node_set_rm + self.n_add_map = len(n_add_map) > 0 + self.l_add_map = len(l_add_map) > 0 # # [!] order critical # @@ -152,6 +154,34 @@ class DBO_topo_diff_commit(DB_composed_op): op = DBO_rm_node_set(n_rm_set) self.add_sub_op(op) + def process_result_set(self): + ret_n_set = [] + ret_l_set = [] + it = iter(self) + + if self.n_add_map: + for _, _, row_set in it.next(): + for row in row_set: + n, n_lbl_set = row.items() # see query return statement + + assert None != n.get('id'), "db contains nodes with no id" + + n['__label_set'] = n_lbl_set + ret_n_set.append(n) + + if self.l_add_map: + for _, _, l_set in it.next(): + for l, l_src, l_dst, l_type in l_set: + l['__src_id'] = l_src + l['__dst_id'] = l_dst + l['__label_set'] = [l_type] # box single value returned by type() + + ret_l_set.append(l) + + return {'node_set': ret_n_set, + 'link_set': ret_l_set } + + class DBO_attr_diff_commit(DB_op): """ commit a Attr_Diff @@ -257,13 +287,13 @@ class DBO_add_node_set(DB_op): self.add_statement(q, q_param_set) def process_result_set(self): - id_set = [] + n_set = [] for _, _, row_set in self: for row in row_set: for clo in row: - id_set.append(clo) + n_set.append(clo) - return id_set + return n_set class DBO_add_link_set(DB_op): def __init__(self, link_map): @@ -276,13 +306,13 @@ class DBO_add_link_set(DB_op): self.add_statement(q, q_params) def process_result_set(self): - id_set = [] + l_set = [] for _, _, r_set in self: for row in r_set: for col_val in row: - id_set.append(col_val) + l_set.append(col_val) - return id_set + return l_set class DBO_load_node_set_by_DB_id(DB_op): def __init__(self, id_set): diff --git a/src/server/neo4j_util.py b/src/server/neo4j_util.py index 5bc65032..5cd920a1 100644 --- a/src/server/neo4j_util.py +++ b/src/server/neo4j_util.py @@ -185,7 +185,7 @@ def gen_query_create_from_node_map(node_map, input_to_DB_property_map=lambda _: assert len(label) > 2 and label[0].isupper() and label[1:].islower(), 'malformed label: ' + label q_arr = ['create (n:%s {node_attr})' % (quote__backtick(label)), - 'return n.id' + 'return n, labels(n)' ] q = ' '.join(q_arr) @@ -211,7 +211,7 @@ def gen_query_create_from_link_map(link_map, input_to_DB_property_map=lambda _: for l_type, l_set in link_map.items(): q = "match (src {id: {src}.id}),(dst {id: {dst}.id}) " + \ "create (src)-[r:%(__type)s {link_attr}]->(dst) " + \ - "return id(r)" + "return r, src.id, dst.id, type(r)" q = q % {'__type': quote__backtick(l_type)} for link in l_set: -- cgit v1.3.1