Skip to content

Commit d126865

Browse files
authored
add multi label support (#144)
* add multi label support * add validation * validate label value * fix error text * fix error text * fix lint * fix lint * fix label api * handle empty strings * fix lint
1 parent 5a2b7e9 commit d126865

File tree

4 files changed

+54
-7
lines changed

4 files changed

+54
-7
lines changed

redisgraph/node.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,21 @@ def __init__(self, node_id=None, alias=None, label=None, properties=None):
1111
"""
1212
self.id = node_id
1313
self.alias = alias
14-
self.label = label
14+
15+
if isinstance(label, list):
16+
label = [inner_label for inner_label in label if inner_label != ""]
17+
18+
if label is None or label == "" or (isinstance(label, list) and len(label) == 0):
19+
self.label = None
20+
self.labels = None
21+
elif isinstance(label, str):
22+
self.label = label
23+
self.labels = [label]
24+
elif isinstance(label, list) and all([isinstance(inner_label, str) for inner_label in label]):
25+
self.label = label[0]
26+
self.labels = label
27+
else:
28+
raise AssertionError("label should be either None, string or a list of strings")
1529
self.properties = properties or {}
1630

1731
def toString(self):
@@ -26,8 +40,8 @@ def __str__(self):
2640
res = '('
2741
if self.alias:
2842
res += self.alias
29-
if self.label:
30-
res += ':' + self.label
43+
if self.labels:
44+
res += ":" + ":".join(self.labels)
3145
if self.properties:
3246
props = ','.join(key+':'+str(quote_string(val)) for key, val in sorted(self.properties.items()))
3347
res += '{' + props + '}'

redisgraph/query_result.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,13 @@ def parse_node(self, cell):
142142
# [[name, value type, value] X N]
143143

144144
node_id = int(cell[0])
145-
label = None
146-
if len(cell[1]) != 0:
147-
label = self.graph.get_label(cell[1][0])
145+
labels = None
146+
if len(cell[1]) > 0:
147+
labels = []
148+
for inner_label in cell[1]:
149+
labels.append(self.graph.get_label(inner_label))
148150
properties = self.parse_entity_properties(cell[2])
149-
return Node(node_id=node_id, label=label, properties=properties)
151+
return Node(node_id=node_id, label=labels, properties=properties)
150152

151153
def parse_edge(self, cell):
152154
# Edge ID (integer),

tests/functional/test_all.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,34 @@ def test_cache_sync(self):
359359
assert(A._relationshipTypes[0] == 'S')
360360
assert(A._relationshipTypes[1] == 'R')
361361

362+
def test_multi_label(self):
363+
redis_graph = Graph('g', self.r)
364+
365+
node = Node(label=['l', 'll'])
366+
redis_graph.add_node(node)
367+
368+
redis_graph.commit()
369+
370+
query = 'MATCH (n) RETURN n'
371+
372+
result = redis_graph.query(query)
373+
374+
result_node = result.result_set[0][0]
375+
376+
self.assertEqual(result_node, node)
377+
378+
try:
379+
Node(label=1)
380+
self.assertTrue(False)
381+
except AssertionError:
382+
self.assertTrue(True)
383+
384+
try:
385+
Node(label=['l', 1])
386+
self.assertTrue(False)
387+
except AssertionError:
388+
self.assertTrue(True)
389+
362390

363391
if __name__ == '__main__':
364392
unittest.main()

tests/unit/test_node.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,12 @@ def setUp(self):
1111
self.props_only = node.Node(properties={"a": "a", "b": 10})
1212
self.no_label = node.Node(node_id=1, alias="alias",
1313
properties={"a": "a"})
14+
self.multi_label = node.Node(node_id=1, alias="alias", label=["l", "ll"])
1415

1516
def test_toString(self):
1617
self.assertEqual(self.no_args.toString(), "")
1718
self.assertEqual(self.no_props.toString(), "")
19+
self.assertEqual(self.multi_label.toString(), "")
1820
self.assertEqual(self.props_only.toString(), '{a:"a",b:10}')
1921
self.assertEqual(self.no_label.toString(), '{a:"a"}')
2022

@@ -23,6 +25,7 @@ def test_stringify(self):
2325
self.assertEqual(str(self.no_props), "(alias:l)")
2426
self.assertEqual(str(self.props_only), '({a:"a",b:10})')
2527
self.assertEqual(str(self.no_label), '(alias{a:"a"})')
28+
self.assertEqual(str(self.multi_label), "(alias:l:ll)")
2629

2730
def test_comparision(self):
2831

0 commit comments

Comments
 (0)