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/__init__.py | 0 src-py/model/graph.py | 37 +++++++++++++++++++++++++++++++++++++ src-py/model/model.py | 9 +++++++++ 3 files changed, 46 insertions(+) create mode 100644 src-py/model/__init__.py create mode 100644 src-py/model/graph.py create mode 100644 src-py/model/model.py (limited to 'src-py/model') diff --git a/src-py/model/__init__.py b/src-py/model/__init__.py new file mode 100644 index 00000000..e69de29b 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 diff --git a/src-py/model/model.py b/src-py/model/model.py new file mode 100644 index 00000000..9ee61397 --- /dev/null +++ b/src-py/model/model.py @@ -0,0 +1,9 @@ +class link(): + """ + documentation anchor - this class currently carries no implementation + and only acts as a documentation anchor + + link['__src'] - meta attribute for link source + link['__dst'] - meta attribute for link destination + """ + pass -- 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') 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') 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') 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 8d35498c06d3e832bdbcad2916efe2df9b23492d Mon Sep 17 00:00:00 2001 From: LV-426 Date: Tue, 21 Oct 2014 19:56:58 +0200 Subject: introducing the Link_Ptr concept - able to fuzzy point at a link by src_id, dst_id or both --- src-py/db_controller.py | 40 +++++++++++++++++++++++++--------------- src-py/model/model.py | 25 +++++++++++++++++++++++-- src-py/test_db_controller.py | 29 +++++++++++++++++++---------- 3 files changed, 67 insertions(+), 27 deletions(-) (limited to 'src-py/model') diff --git a/src-py/db_controller.py b/src-py/db_controller.py index 7cd1af7b..ceb5267c 100644 --- a/src-py/db_controller.py +++ b/src-py/db_controller.py @@ -264,28 +264,38 @@ class DBO_match_node_set_by_id_attribute(DBO_match_node_id_set): super(DBO_match_node_set_by_id_attribute, self).__init__(filter_attr_map={'id': id_set}) -class DBO_match_link_set_by_src_or_dst_id_attributes(DB_op): - def __init__(self, src_id=None, dst_id=None): +class DBO_load_link_set(DB_op): + def __init__(self, link_ptr_set): """ - match a set of links by source/target node id attributes + match a set of sets of links by source/target node id attributes + This class should be instantiated through a static factory function + + @link_ptr_set link pointer set @return: a set of loaded links """ - assert None != src_id or None != dst_id + super(DBO_load_link_set, self).__init__() + + for l_ptr in link_ptr_set: + if not l_ptr.src_id: + q = "match ()-[r]->({id: {dst_id}}) return r" + q_params = {'dst_id': l_ptr.dst_id} + elif not l_ptr.dst_id: + q = "match ({id: {src_id}})-[r]->() return r" + q_params = {'src_id': l_ptr.src_id} + else: + q = "match ({id: {src_id}})-[r]->({id: {dst_id}}) return r" + q_params = {'src_id': l_ptr.src_id, 'dst_id': l_ptr.dst_id} - super(DBO_match_link_set_by_src_or_dst_id_attributes, self).__init__() + self.add_statement(q, q_params) - if not src_id: - q = "match ()-[r]->({id: {dst_id}}) return r" - q_params = {'dst_id': dst_id} - elif not dst_id: - q = "match ({id: {src_id}})-[r]->() return r" - q_params = {'src_id': src_id} - else: - q = "match ({id: {src_id}})-[r]->({id: {dst_id}}) return r" - q_params = {'src_id': src_id, 'dst_id': dst_id} + @staticmethod + def init_from_link_ptr(l_ptr): + return DBO_load_link_set([l_ptr]) - self.add_statement(q, q_params) + @staticmethod + def init_from_link_ptr_set(l_ptr_set): + return DBO_load_link_set(l_ptr_set) class DBO_match_link_id_set(DB_op): def __init__(self, filter_type=None, filter_attr_map={}): diff --git a/src-py/model/model.py b/src-py/model/model.py index 9ee61397..701074ab 100644 --- a/src-py/model/model.py +++ b/src-py/model/model.py @@ -1,4 +1,4 @@ -class link(): +class Link(): """ documentation anchor - this class currently carries no implementation and only acts as a documentation anchor @@ -6,4 +6,25 @@ class link(): link['__src'] - meta attribute for link source link['__dst'] - meta attribute for link destination """ - pass + + class Link_Ptr(dict): + def __init__(self, src_id=None, dst_id=None): + assert None != src_id or None != dst_id + + self['__src'] = src_id + self['__dst'] = dst_id + + @property + def src_id(self): + return self['__src'] + + @property + def dst_id(self): + return self['__dst'] + + @staticmethod + def link_ptr(src_id=None, dst_id=None): + """ + init from src_id or dst_id attributes - at least one must be provided + """ + return Link.Link_Ptr(src_id, dst_id) diff --git a/src-py/test_db_controller.py b/src-py/test_db_controller.py index 4af4cabc..cdc0c5e9 100644 --- a/src-py/test_db_controller.py +++ b/src-py/test_db_controller.py @@ -122,19 +122,28 @@ class TestDBController(unittest.TestCase): id_set = self.db_ctl.exec_op(op) self.assertEqual(len(id_set), 0) - def test_match_link_set_by_src_or_dst_id_attributes(self): - op = dbc.DBO_match_link_set_by_src_or_dst_id_attributes(src_id='person_00', dst_id='skill_00') - n_set = self.db_ctl.exec_op(op) - self.assertEqual(len(n_set), 1) + def test_load_link_set(self): + l_ptr = Link.link_ptr(src_id='person_00', dst_id='skill_00') + op = dbc.DBO_load_link_set.init_from_link_ptr(l_ptr) + l_set = self.db_ctl.exec_op(op) + self.assertEqual(len(l_set), 1) - op = dbc.DBO_match_link_set_by_src_or_dst_id_attributes(src_id='person_00') - n_set = self.db_ctl.exec_op(op) - self.assertEqual(len(n_set), 2) + l_ptr = Link.link_ptr(src_id='person_00') + op = dbc.DBO_load_link_set.init_from_link_ptr(l_ptr) + l_set = self.db_ctl.exec_op(op) + self.assertEqual(len(l_set), 2) - op = dbc.DBO_match_link_set_by_src_or_dst_id_attributes(dst_id='skill_00') - n_set = self.db_ctl.exec_op(op) - self.assertEqual(len(n_set), 1) + l_ptr = Link.link_ptr(dst_id='skill_00') + op = dbc.DBO_load_link_set.init_from_link_ptr(l_ptr) + l_set = self.db_ctl.exec_op(op) + self.assertEqual(len(l_set), 1) + # load sets + l_ptr_set = [Link.link_ptr(s,d) for (s,d) in [('person_00', 'skill_00'), ('person_00', 'skill_01')]] + op = dbc.DBO_load_link_set.init_from_link_ptr_set(l_ptr_set) + l_set = self.db_ctl.exec_op(op) + self.assertEqual(len(l_set), 2) + def test_load_node_set_by_DB_id(self): """ test node DB id life cycle -- 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') 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') 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') 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 0950293605eecff2de9cdadccf1def2d7d9b73bc Mon Sep 17 00:00:00 2001 From: LV-426 Date: Wed, 10 Dec 2014 15:16:06 +0200 Subject: distinguish __src (obj) vs. __src_id (str) --- src-py/db_controller.py | 4 ++-- src-py/model/model.py | 25 ++++++++++++++++--------- src-py/neo4j_util.py | 16 ++++++++-------- src-py/rhizi_api.py | 4 ++-- 4 files changed, 28 insertions(+), 21 deletions(-) (limited to 'src-py/model') diff --git a/src-py/db_controller.py b/src-py/db_controller.py index 460686a5..2d4fe8ce 100644 --- a/src-py/db_controller.py +++ b/src-py/db_controller.py @@ -426,8 +426,8 @@ class DBO_rz_clone(DB_op): continue l = l_tuple[1] - l['__src'] = n['id'] - l['__dst'] = l_tuple[0] + l['__src_id'] = n['id'] + l['__dst_id'] = l_tuple[0] l['__label_set'] = [l_tuple[2]] # box single value returned by type() ret_l_set.append(l) diff --git a/src-py/model/model.py b/src-py/model/model.py index 701074ab..33cf9e6a 100644 --- a/src-py/model/model.py +++ b/src-py/model/model.py @@ -3,24 +3,31 @@ class Link(): documentation anchor - this class currently carries no implementation and only acts as a documentation anchor - link['__src'] - meta attribute for link source - link['__dst'] - meta attribute for link destination + link['__src'] - meta attribute for link source object + link['__dst'] - meta attribute for link destination object """ - + + def __init__(self, src=None, dst=None): + assert False, 'currently unused' + class Link_Ptr(dict): + """ + link['__src_id'] - meta attribute for link source id + link['__dst_id'] - meta attribute for link destination id + """ def __init__(self, src_id=None, dst_id=None): assert None != src_id or None != dst_id - - self['__src'] = src_id - self['__dst'] = dst_id - + + self['__src_id'] = src_id + self['__dst_id'] = dst_id + @property def src_id(self): - return self['__src'] + return self['__src_id'] @property def dst_id(self): - return self['__dst'] + return self['__dst_id'] @staticmethod def link_ptr(src_id=None, dst_id=None): diff --git a/src-py/neo4j_util.py b/src-py/neo4j_util.py index cc3d53d8..a203207f 100644 --- a/src-py/neo4j_util.py +++ b/src-py/neo4j_util.py @@ -199,16 +199,16 @@ def gen_query_create_from_link_map(link_map, input_to_DB_property_map=lambda _: for link in l_set: __type_check_link(link) - n_src = link['__src'] - n_dst = link['__dst'] + src_id = link['__src_id'] + dst_id = link['__dst_id'] # TODO: use object based link representation prop_dict = link.copy() - del prop_dict['__dst'] - del prop_dict['__src'] + del prop_dict['__dst_id'] + del prop_dict['__src_id'] - q_params = {'src': { 'id': n_src} , - 'dst': { 'id': n_dst} , + q_params = {'src': { 'id': src_id} , + 'dst': { 'id': dst_id} , 'link_attr' : input_to_DB_property_map(prop_dict)} ret.append((q, q_params)) @@ -239,8 +239,8 @@ def meta_attr_list_to_meta_attr_map(e_set, meta_attr='__label_set'): return ret def __type_check_link(link): - assert link.has_key('__src') - assert link.has_key('__dst') + assert link.has_key('__src_id') + assert link.has_key('__dst_id') def __type_check_link_or_node_map(x_map): for k, v in x_map.iteritems(): # do some type sanity checking diff --git a/src-py/rhizi_api.py b/src-py/rhizi_api.py index 8d787a5c..ef904a37 100644 --- a/src-py/rhizi_api.py +++ b/src-py/rhizi_api.py @@ -127,8 +127,8 @@ def load_link_set_by_link_ptr_set(): l_ptr_set = [] for lptr_dict in l_ptr_set_raw: - src_id = lptr_dict.get('__src') - dst_id = lptr_dict.get('__dst') + src_id = lptr_dict.get('__src_id') + dst_id = lptr_dict.get('__dst_id') l_ptr_set += [Link.Link_Ptr(src_id=src_id, dst_id=dst_id) ] return l_ptr_set -- 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') 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') 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') 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') 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