Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /