summaryrefslogtreecommitdiff
path: root/redis/commands/graph/node.py
blob: 0ebe510ada0c6422186200ef63e687c9fbbf7adf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
from ..helpers import quote_string


class Node:
    """
    A node within the graph.
    """

    def __init__(self, node_id=None, alias=None, label=None, properties=None):
        """
        Create a new node.
        """
        self.id = node_id
        self.alias = alias
        if isinstance(label, list):
            label = [inner_label for inner_label in label if inner_label != ""]

        if (
            label is None
            or label == ""
            or (isinstance(label, list) and len(label) == 0)
        ):
            self.label = None
            self.labels = None
        elif isinstance(label, str):
            self.label = label
            self.labels = [label]
        elif isinstance(label, list) and all(
            [isinstance(inner_label, str) for inner_label in label]
        ):
            self.label = label[0]
            self.labels = label
        else:
            raise AssertionError(
                "label should be either None, string or a list of strings"
            )

        self.properties = properties or {}

    def to_string(self):
        res = ""
        if self.properties:
            props = ",".join(
                key + ":" + str(quote_string(val))
                for key, val in sorted(self.properties.items())
            )
            res += "{" + props + "}"

        return res

    def __str__(self):
        res = "("
        if self.alias:
            res += self.alias
        if self.labels:
            res += ":" + ":".join(self.labels)
        if self.properties:
            props = ",".join(
                key + ":" + str(quote_string(val))
                for key, val in sorted(self.properties.items())
            )
            res += "{" + props + "}"
        res += ")"

        return res

    def __eq__(self, rhs):
        # Quick positive check, if both IDs are set.
        if self.id is not None and rhs.id is not None and self.id != rhs.id:
            return False

        # Label should match.
        if self.label != rhs.label:
            return False

        # Quick check for number of properties.
        if len(self.properties) != len(rhs.properties):
            return False

        # Compare properties.
        if self.properties != rhs.properties:
            return False

        return True