diff options
| author | Alon Levy <alon@pobox.com> | 2014-12-23 21:53:46 +0200 |
|---|---|---|
| committer | Alon Levy <alon@pobox.com> | 2014-12-23 22:03:17 +0200 |
| commit | f7ff8bc38410c2666665c4c70cc71c17f6eb7835 (patch) | |
| tree | 458bd97cf23a2672102d85babe1deaa2ec581233 /src/server/db_controller.py | |
| parent | 3e3944c42517a2745d9dd2312e8c3a571de41863 (diff) | |
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).
Diffstat (limited to 'src/server/db_controller.py')
| -rw-r--r-- | src/server/db_controller.py | 42 |
1 files changed, 36 insertions, 6 deletions
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): |
