-
Notifications
You must be signed in to change notification settings - Fork 2
/
predicates.py
146 lines (132 loc) · 5.33 KB
/
predicates.py
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
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
class Predicates:
"""
L{Predicates} contains the methods to perform filtering on node
attributes in the graph, such as counting number of nodes that have
an attribute less than a particular value.
"""
def __init__(self, gs):
self.gs = gs
def __str2float(self, value):
"""
Private helper function that tries to convert a string representing a
number to a floating point number. If the string does not represent a
number, returns the string "ERROR".
@type value: String that represents a number.
@param value: String to convert to a float.
@rtype: Float
@return: The converted string as a float, or
"ERROR" if an error occurred.
"""
try:
float_val = float(value)
return float_val
except ValueError:
return "ERROR"
def filter(self, node_list, attr, value, op):
"""
Function that takes a list of nodes, an
attribute to filter on, a value to filter on, and an
operation string. Returns a filtered list of nodes that
satisfy the predicate consisting of the attribute,
value and operation.
@type node_list: List
@param node_list: List of nodes. Each node is a tuple consisting
of an id and a dictionary of attributes.
@type attr: String
@param attr: Attribute used to filter node
@type value: String that represents a number.
@param value: Value to compare the node attributes against.
@type op: String that is either "<", "=", or ">".
@param op: Operation to perform when comparing each node attribute
against value.
@rtype: List
@return: Filtered list of nodes that satisfy the predicate.
"""
val = self.__str2float(value)
if val == "ERROR":
print "ERROR : Comparison Value must be an number..."
return []
if op == "<":
return self.__filter_less(node_list, attr, val)
elif op == ">":
return self.__filter_greater(node_list, attr, val)
elif op == "=":
return self.__filter_equal(node_list, attr, val)
else:
print "ERROR : Invalid predicate operation..."
return []
def __filter_less(self, node_list, attr, val):
"""
Private helper function that takes a list of nodes, an
attribute to filter on, and a value to filter on.
Returns a filtered list of nodes whose attributes
are less than the passed value.
@type node_list: List
@param node_list: List of nodes. Each node is a tuple consisting
of an id and a dictionary of attributes.
@type attr: String
@param attr: Attribute used to filter node
@type val: Float
@param val: Value to compare the node attributes against.
@rtype: List
@return: Filtered list of nodes that satisfy the predicate.
"""
ret = []
for n in node_list:
attr_val = self.__str2float(n[1][attr])
if attr_val == "ERROR":
print "ERROR : Got attribute value that is not a number..."
continue
if attr_val < val:
ret.append(n)
return ret
def __filter_greater(self, node_list, attr, val):
"""
Private helper function that takes a list of nodes, an
attribute to filter on, and a value to filter on.
Returns a filtered list of nodes whose attributes
are greater than the passed value.
@type node_list: List
@param node_list: List of nodes. Each node is a tuple consisting
of an id and a dictionary of attributes.
@type attr: String
@param attr: Attribute used to filter node
@type val: Float
@param val: Value to compare the node attributes against.
@rtype: List
@return: Filtered list of nodes that satisfy the predicate.
"""
ret = []
for n in node_list:
attr_val = self.__str2float(n[1][attr])
if attr_val == "ERROR":
print "ERROR : Got attribute value that is not a number..."
continue
if attr_val > val:
ret.append(n)
return ret
def __filter_equal(self, node_list, attr, val):
"""
Private helper function that takes a list of nodes, an
attribute to filter on, and a value to filter on.
Returns a filtered list of nodes whose attributes
are equal to the passed value.
@type node_list: List
@param node_list: List of nodes. Each node is a tuple consisting
of an id and a dictionary of attributes.
@type attr: String
@param attr: Attribute used to filter node
@type val: Float
@param val: Value to compare the node attributes against.
@rtype: List
@return: Filtered list of nodes that satisfy the predicate.
"""
ret = []
for n in node_list:
attr_val = self.__str2float(n[1][attr])
if attr_val == "ERROR":
print "ERROR : Got attribute value that is not a number..."
continue
if attr_val == val:
ret.append(n)
return ret