From b6824dd09a58d2e400851fc310b416f4311bd030 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Wed, 15 Oct 2014 18:36:02 +0200 Subject: model.graph package --- src-py/model/graph.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src-py/model/graph.py (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py new file mode 100644 index 00000000..9891c4ef --- /dev/null +++ b/src-py/model/graph.py @@ -0,0 +1,37 @@ +class Attribute_Diff(): + """ + Represents a change to note attributes, where nodes can represent + either logical nodes or logical links, and attributes can be added, + changed or removed + """ + pass + +class Topo_Diff(): + """ + Represents a change to the graph topology + """ + + def __init__(self, link_set_rm=[], + node_set_rm=[], + node_set_add=[], + link_set_add=[]): + self.link_set_rm = link_set_rm + self.node_set_rm = node_set_rm + self.node_set_add = node_set_add + self.link_set_add = link_set_add + + @property + def link_set_rm(self): + return self.link_set_rm + + @property + def node_set_rm(self): + return self.node_set_rm + + @property + def link_set_add(self): + return self.link_set_add + + @property + def node_set_add(self): + return self.node_set_add -- cgit v1.3.1 From 3d0306271a427f7a2e47aea18429c1cad8e74bee Mon Sep 17 00:00:00 2001 From: LV-426 Date: Wed, 15 Oct 2014 22:11:44 +0200 Subject: Attribute_Diff --- src-py/model/graph.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index 9891c4ef..9ad4601c 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -4,7 +4,11 @@ class Attribute_Diff(): either logical nodes or logical links, and attributes can be added, changed or removed """ - pass + def __init__(self, id_to_attr_diff_map={}): + """ + @param id_to_attr_diff_map + """ + self.id_to_attr_diff_map = id_to_attr_diff_map class Topo_Diff(): """ -- cgit v1.3.1 From 7095cc48865cc46ad20f28de79ba62d80e8d2153 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Mon, 20 Oct 2014 19:34:34 +0200 Subject: Attr_Diff: - add_node_attr_write() - add_node_attr_rm() --- src-py/model/graph.py | 33 +++++++++++++++++++++++++++------ src-py/test_db_controller.py | 2 +- 2 files changed, 28 insertions(+), 7 deletions(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index 9ad4601c..52ed39b1 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -1,14 +1,35 @@ -class Attribute_Diff(): +class Attr_Diff(dict): """ Represents a change to note attributes, where nodes can represent either logical nodes or logical links, and attributes can be added, changed or removed + + Example: + attr_diff = {n_id: {'attr_write': {'attr_0': 0, + 'attr_1': 'a'}, + 'attr_remove': ['attr_2'] } + } """ - def __init__(self, id_to_attr_diff_map={}): - """ - @param id_to_attr_diff_map - """ - self.id_to_attr_diff_map = id_to_attr_diff_map + def __init__(self): + pass + + def init_node_attr_diff(self, n_id): + ret = {'attr_write': {}, + 'attr_remove': []} + self[n_id] = ret + return ret + + def add_node_attr_write(self, n_id, attr_name, attr_val): + n_attr_diff = self.get(n_id) + if None == n_attr_diff: + n_attr_diff = self.init_node_attr_diff(n_id) + n_attr_diff['attr_write'][attr_name] = attr_val + + def add_node_attr_rm(self, n_id, attr_name): + n_attr_diff = self.get(n_id) + if None == n_attr_diff: + n_attr_diff = self.init_node_attr_diff(n_id) + n_attr_diff['attr_remove'].append(attr_name) class Topo_Diff(): """ diff --git a/src-py/test_db_controller.py b/src-py/test_db_controller.py index 502768a3..4af4cabc 100644 --- a/src-py/test_db_controller.py +++ b/src-py/test_db_controller.py @@ -167,7 +167,7 @@ class TestDBController(unittest.TestCase): op.add_statement("non-valid statement #1", {}) op.add_statement("non-valid statement #2", {}) - self.db_ctl.exec_op(op) + self.assertRaises(Neo4JException, self.db_ctl.exec_op, op) self.assertEqual(len(op.result_set), 2) self.assertEqual(len(op.error_set), 1) -- cgit v1.3.1 From c97f56e93d3bb3a7b838093b0ecb4fec9c9e0d34 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Mon, 20 Oct 2014 19:34:43 +0200 Subject: misc --- src-py/model/graph.py | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index 52ed39b1..8942285d 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -31,7 +31,7 @@ class Attr_Diff(dict): n_attr_diff = self.init_node_attr_diff(n_id) n_attr_diff['attr_remove'].append(attr_name) -class Topo_Diff(): +class Topo_Diff(object): """ Represents a change to the graph topology """ @@ -45,18 +45,15 @@ class Topo_Diff(): self.node_set_add = node_set_add self.link_set_add = link_set_add - @property - def link_set_rm(self): - return self.link_set_rm - - @property - def node_set_rm(self): - return self.node_set_rm - - @property - def link_set_add(self): - return self.link_set_add + def check_validity(self, topo_diff_dict): + """ + Topo_Diff may represent invalid operations, eg. adding a link while + removing it's end-point - this stub should check for that + """ + pass - @property - def node_set_add(self): - return self.node_set_add + @staticmethod + def from_dict(topo_diff_dict): + ret = Topo_Diff() + ret.__dict__ = topo_diff_dict + return ret -- cgit v1.3.1 From e5bb0ee5976f2f1348387ed6ed57cc43e34caa7c Mon Sep 17 00:00:00 2001 From: LV-426 Date: Sun, 9 Nov 2014 12:10:57 +0200 Subject: Topo_Diff - support omitted-argument construction --- src-py/model/graph.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index 8942285d..bc642a69 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -54,6 +54,15 @@ class Topo_Diff(object): @staticmethod def from_dict(topo_diff_dict): + """ + construct from dict - no node/link constructor set must be provided + """ ret = Topo_Diff() - ret.__dict__ = topo_diff_dict + + # merge keys - this allows obj constructor argument ommision, + # such as when constructing from POST JSON data + for k, _ in ret.__dict__.items(): + v = topo_diff_dict.get(k) + if None != v: + ret.__dict__[k] = v return ret -- cgit v1.3.1 From cfe10b93a655d433d195440cfd1bf4a239a5da08 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Mon, 8 Dec 2014 22:34:02 +0200 Subject: Topo_Diff misc --- src-py/model/graph.py | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index bc642a69..27f168ed 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -18,7 +18,7 @@ class Attr_Diff(dict): 'attr_remove': []} self[n_id] = ret return ret - + def add_node_attr_write(self, n_id, attr_name, attr_val): n_attr_diff = self.get(n_id) if None == n_attr_diff: @@ -35,16 +35,19 @@ class Topo_Diff(object): """ Represents a change to the graph topology """ - def __init__(self, link_set_rm=[], - node_set_rm=[], - node_set_add=[], - link_set_add=[]): + node_set_rm=[], + node_set_add=[], + link_set_add=[]): + self.link_set_rm = link_set_rm self.node_set_rm = node_set_rm self.node_set_add = node_set_add self.link_set_add = link_set_add + def __str__(self): + return __name__ + ': ' + ', '.join('%s: %d items' % (k, len(v)) for k, v in self.__dict__.items()) + def check_validity(self, topo_diff_dict): """ Topo_Diff may represent invalid operations, eg. adding a link while @@ -59,10 +62,10 @@ class Topo_Diff(object): """ ret = Topo_Diff() - # merge keys - this allows obj constructor argument ommision, - # such as when constructing from POST JSON data + # merge keys - this allows constructor argument omission (link_set_rm, + # node_set_rm, etc.) such as when constructing from POST JSON data for k, _ in ret.__dict__.items(): - v = topo_diff_dict.get(k) + v = topo_diff_dict.get(k) if None != v: ret.__dict__[k] = v return ret -- cgit v1.3.1 From 404828c55672cc84f7ded569d8cc42b5afa140ff Mon Sep 17 00:00:00 2001 From: LV-426 Date: Wed, 10 Dec 2014 15:17:07 +0200 Subject: Tokp_Diff __str__() --- src-py/model/graph.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index 27f168ed..86a195d4 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -46,7 +46,7 @@ class Topo_Diff(object): self.link_set_add = link_set_add def __str__(self): - return __name__ + ': ' + ', '.join('%s: %d items' % (k, len(v)) for k, v in self.__dict__.items()) + return __name__ + ': ' + ', '.join('%s: %s' % (k, v) for k, v in self.__dict__.items()) def check_validity(self, topo_diff_dict): """ -- cgit v1.3.1 From 43fc57a01028b374234042ab59fdbdd48157a88e Mon Sep 17 00:00:00 2001 From: LV-426 Date: Sun, 14 Dec 2014 22:45:27 +0200 Subject: Attr_Diff: __type_node, __type_link separation --- src-py/db_controller.py | 9 ++++++--- src-py/model/graph.py | 49 ++++++++++++++++++++++++++++++++++++++----------- src-py/rhizi_api.py | 9 +++++++-- 3 files changed, 51 insertions(+), 16 deletions(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/db_controller.py b/src-py/db_controller.py index 2ca7b551..c17fd0cd 100644 --- a/src-py/db_controller.py +++ b/src-py/db_controller.py @@ -161,10 +161,10 @@ class DBO_attr_diff_commit(DB_op): def __init__(self, attr_diff): super(DBO_attr_diff_commit, self).__init__() - for id_attr, n_attr_diff in attr_diff.items(): + for id_attr, n_attr_diff in attr_diff.type__node.items(): # TODO parameterize multiple attr removal - r_attr_set = n_attr_diff['attr_remove'] - w_attr_set = n_attr_diff['attr_write'] + r_attr_set = n_attr_diff['__attr_remove'] + w_attr_set = n_attr_diff['__attr_write'] assert len(r_attr_set) > 0 or len(w_attr_set) > 0 @@ -184,6 +184,9 @@ class DBO_attr_diff_commit(DB_op): q = " ".join(q_arr) self.add_statement(q, q_param_set) + for id_attr, n_attr_diff in attr_diff.type__link.items(): + pass # TODO: handl link attr_diffs + def process_result_set(self): ret = {} for _, _, r_set in self: diff --git a/src-py/model/graph.py b/src-py/model/graph.py index 86a195d4..b40b805a 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -5,31 +5,58 @@ class Attr_Diff(dict): changed or removed Example: - attr_diff = {n_id: {'attr_write': {'attr_0': 0, - 'attr_1': 'a'}, - 'attr_remove': ['attr_2'] } + attr_diff = {'__type_node' : {n_id: {'__attr_write': {'attr_0': 0, + 'attr_1': 'a'}, + '__attr_remove': ['attr_2'] }} + '__type_link' : {l_id: ... } } """ def __init__(self): - pass + self['__type_node'] = {} + self['__type_link'] = {} def init_node_attr_diff(self, n_id): - ret = {'attr_write': {}, - 'attr_remove': []} - self[n_id] = ret + ret = {'__attr_write': {}, + '__attr_remove': []} + self['__type_node'][n_id] = ret + return ret + + @staticmethod + def from_json_dict(json_dict): + ret = Attr_Diff() + for obj_type in ret.keys(): + obj_ad_set = json_dict.get(obj_type) + if None != obj_ad_set: + for o_id, ad in obj_ad_set.items(): + if None != ad.get('__attr_write'): + for k, v in ad['__attr_write'].items(): + ret.add_node_attr_write(o_id, k, v) + if None != ad.get('__attr_remove'): + for k in ad['__attr_remove']: + ret.add_node_attr_rm(o_id, k) return ret + @property + def type__node(self): + return self['__type_node'] + + @property + def type__link(self): + return self['__type_link'] + def add_node_attr_write(self, n_id, attr_name, attr_val): - n_attr_diff = self.get(n_id) + + + n_attr_diff = self['__type_node'].get(n_id) if None == n_attr_diff: n_attr_diff = self.init_node_attr_diff(n_id) - n_attr_diff['attr_write'][attr_name] = attr_val + n_attr_diff['__attr_write'][attr_name] = attr_val def add_node_attr_rm(self, n_id, attr_name): - n_attr_diff = self.get(n_id) + n_attr_diff = self['__type_node'].get(n_id) if None == n_attr_diff: n_attr_diff = self.init_node_attr_diff(n_id) - n_attr_diff['attr_remove'].append(attr_name) + n_attr_diff['__attr_remove'].append(attr_name) class Topo_Diff(object): """ diff --git a/src-py/rhizi_api.py b/src-py/rhizi_api.py index 0c1b68b5..b89e8c18 100644 --- a/src-py/rhizi_api.py +++ b/src-py/rhizi_api.py @@ -179,9 +179,14 @@ def diff_commit__attr(): """ commit a graph attribute diff """ - attr_diff = request.get_json()['attr_diff'] - __sanitize_input(attr_diff) + def sanitize_input(req): + attr_diff_dict = request.get_json()['attr_diff'] + attr_diff = Attr_Diff.from_json_dict(attr_diff_dict) + + sanitize_input__attr_diff(attr_diff) + return attr_diff; + attr_diff = sanitize_input(request) op = dbc.DBO_attr_diff_commit(attr_diff) return __common_exec(op) -- cgit v1.3.1 From 292e45dd6590ada4a5155ec4cfe9446610eaf502 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Sun, 14 Dec 2014 22:48:13 +0200 Subject: rename from_dict -> from_json_dict --- src-py/model/graph.py | 4 ++-- src-py/rhizi_api.py | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index b40b805a..ebe8b31e 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -83,7 +83,7 @@ class Topo_Diff(object): pass @staticmethod - def from_dict(topo_diff_dict): + def from_json_dict(json_dict): """ construct from dict - no node/link constructor set must be provided """ @@ -92,7 +92,7 @@ class Topo_Diff(object): # merge keys - this allows constructor argument omission (link_set_rm, # node_set_rm, etc.) such as when constructing from POST JSON data for k, _ in ret.__dict__.items(): - v = topo_diff_dict.get(k) + v = json_dict.get(k) if None != v: ret.__dict__[k] = v return ret diff --git a/src-py/rhizi_api.py b/src-py/rhizi_api.py index b89e8c18..228fcd66 100644 --- a/src-py/rhizi_api.py +++ b/src-py/rhizi_api.py @@ -151,7 +151,7 @@ def diff_commit__set(): def sanitize_input(req): diff_set_dict = request.get_json()['diff_set'] topo_diff_dict = diff_set_dict['__diff_set_topo'][0] - topo_diff = Topo_Diff.from_dict(topo_diff_dict) + topo_diff = Topo_Diff.from_json_dict(topo_diff_dict) sanitize_input__topo_diff(topo_diff) return topo_diff; @@ -166,7 +166,7 @@ def diff_commit__topo(): """ def sanitize_input(req): topo_diff_dict = request.get_json()['topo_diff'] - topo_diff = Topo_Diff.from_dict(topo_diff_dict) + topo_diff = Topo_Diff.from_json_dict(topo_diff_dict) sanitize_input__topo_diff(topo_diff) return topo_diff; -- cgit v1.3.1 From 74d413161c9e847c8ff8f02737bcb66eb71b742b Mon Sep 17 00:00:00 2001 From: LV-426 Date: Sun, 14 Dec 2014 23:11:33 +0200 Subject: assert ID attr_name not used in Attr_Diff --- src-py/model/graph.py | 1 + 1 file changed, 1 insertion(+) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index ebe8b31e..efc403d4 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -46,6 +46,7 @@ class Attr_Diff(dict): def add_node_attr_write(self, n_id, attr_name, attr_val): + assert 'id' != attr_name.lower(), 'Attr_Diff: attempt to write to \'id\' attribute' n_attr_diff = self['__type_node'].get(n_id) if None == n_attr_diff: -- cgit v1.3.1 From e6144b232e3ff626d654bf274025f5d55a6bca84 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Sun, 14 Dec 2014 23:12:02 +0200 Subject: link attr operations not yet supported... --- src-py/model/graph.py | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'src-py/model/graph.py') diff --git a/src-py/model/graph.py b/src-py/model/graph.py index efc403d4..f197921d 100644 --- a/src-py/model/graph.py +++ b/src-py/model/graph.py @@ -59,6 +59,12 @@ class Attr_Diff(dict): n_attr_diff = self.init_node_attr_diff(n_id) n_attr_diff['__attr_remove'].append(attr_name) + def add_link_attr_write(self, l_id, attr_name, attr_val): + assert False, 'unimplemented' + + def add_link_attr_rm(self, l_id, attr_name): + assert False, 'unimplemented' + class Topo_Diff(object): """ Represents a change to the graph topology -- cgit v1.3.1