4
4
from prettytable import PrettyTable
5
5
from redis import ResponseError
6
6
7
+ LABELS_ADDED = 'Labels added'
8
+ NODES_CREATED = 'Nodes created'
9
+ NODES_DELETED = 'Nodes deleted'
10
+ RELATIONSHIPS_DELETED = 'Relationships deleted'
11
+ PROPERTIES_SET = 'Properties set'
12
+ RELATIONSHIPS_CREATED = 'Relationships created'
13
+ INDICES_CREATED = "Indices created"
14
+ INDICES_DELETED = "Indices deleted"
15
+ CACHED_EXECUTION = "Cached execution"
16
+ INTERNAL_EXECUTION_TIME = 'internal execution time'
17
+ GRAPH_VERSION = 'Graph version'
18
+
19
+ STATS = [LABELS_ADDED , NODES_CREATED , PROPERTIES_SET , RELATIONSHIPS_CREATED ,
20
+ NODES_DELETED , RELATIONSHIPS_DELETED , INDICES_CREATED , INDICES_DELETED ,
21
+ CACHED_EXECUTION , INTERNAL_EXECUTION_TIME , GRAPH_VERSION ]
7
22
8
23
class ResultSetColumnTypes (object ):
9
24
COLUMN_UNKNOWN = 0
10
25
COLUMN_SCALAR = 1
11
26
COLUMN_NODE = 2 # Unused as of RedisGraph v2.1.0, retained for backwards compatibility.
12
27
COLUMN_RELATION = 3 # Unused as of RedisGraph v2.1.0, retained for backwards compatibility.
13
28
14
-
15
29
class ResultSetScalarTypes (object ):
16
30
VALUE_UNKNOWN = 0
17
31
VALUE_NULL = 1
@@ -25,16 +39,6 @@ class ResultSetScalarTypes(object):
25
39
VALUE_PATH = 9
26
40
27
41
class QueryResult (object ):
28
- LABELS_ADDED = 'Labels added'
29
- NODES_CREATED = 'Nodes created'
30
- NODES_DELETED = 'Nodes deleted'
31
- RELATIONSHIPS_DELETED = 'Relationships deleted'
32
- PROPERTIES_SET = 'Properties set'
33
- RELATIONSHIPS_CREATED = 'Relationships created'
34
- INDICES_CREATED = "Indices created"
35
- INDICES_DELETED = "Indices deleted"
36
- CACHED_EXECUTION = "Cached execution"
37
- INTERNAL_EXECUTION_TIME = 'internal execution time'
38
42
39
43
def __init__ (self , graph , response ):
40
44
self .graph = graph
@@ -48,9 +52,18 @@ def __init__(self, graph, response):
48
52
if len (response ) == 1 :
49
53
self .parse_statistics (response [0 ])
50
54
else :
51
- self .parse_results (response )
55
+ # start by parsing statistics, see if the reported graph version
56
+ # matches the one we have
52
57
self .parse_statistics (response [- 1 ]) # Last element.
53
58
59
+ if (graph .version != self .graph_version ):
60
+ # graph version miss-match, this is an indication that
61
+ # the graph schema was modified, sync it.
62
+ graph .version = self .graph_version
63
+ graph ._refresh_schema ()
64
+
65
+ self .parse_results (response )
66
+
54
67
def parse_results (self , raw_result_set ):
55
68
self .header = self .parse_header (raw_result_set )
56
69
@@ -63,10 +76,12 @@ def parse_results(self, raw_result_set):
63
76
def parse_statistics (self , raw_statistics ):
64
77
self .statistics = {}
65
78
66
- stats = [self .LABELS_ADDED , self .NODES_CREATED , self .PROPERTIES_SET , self .RELATIONSHIPS_CREATED ,
67
- self .NODES_DELETED , self .RELATIONSHIPS_DELETED , self .INDICES_CREATED , self .INDICES_DELETED ,
68
- self .CACHED_EXECUTION , self .INTERNAL_EXECUTION_TIME ]
69
- for s in stats :
79
+ # decode statistics
80
+ for idx , stat in enumerate (raw_statistics ):
81
+ if isinstance (stat , bytes ):
82
+ raw_statistics [idx ] = stat .decode ()
83
+
84
+ for s in STATS :
70
85
v = self ._get_value (s , raw_statistics )
71
86
if v is not None :
72
87
self .statistics [s ] = v
@@ -223,53 +238,55 @@ def is_empty(self):
223
238
@staticmethod
224
239
def _get_value (prop , statistics ):
225
240
for stat in statistics :
226
- if isinstance (stat , bytes ):
227
- stat = stat .decode ()
228
241
if prop in stat :
229
242
return float (stat .split (': ' )[1 ].split (' ' )[0 ])
230
243
231
-
232
244
return None
233
245
234
246
def _get_stat (self , stat ):
235
247
return self .statistics [stat ] if stat in self .statistics else 0
236
248
237
249
@property
238
250
def labels_added (self ):
239
- return self ._get_stat (self . LABELS_ADDED )
251
+ return self ._get_stat (LABELS_ADDED )
240
252
241
253
@property
242
254
def nodes_created (self ):
243
- return self ._get_stat (self . NODES_CREATED )
255
+ return self ._get_stat (NODES_CREATED )
244
256
245
257
@property
246
258
def nodes_deleted (self ):
247
- return self ._get_stat (self . NODES_DELETED )
259
+ return self ._get_stat (NODES_DELETED )
248
260
249
261
@property
250
262
def properties_set (self ):
251
- return self ._get_stat (self . PROPERTIES_SET )
263
+ return self ._get_stat (PROPERTIES_SET )
252
264
253
265
@property
254
266
def relationships_created (self ):
255
- return self ._get_stat (self . RELATIONSHIPS_CREATED )
267
+ return self ._get_stat (RELATIONSHIPS_CREATED )
256
268
257
269
@property
258
270
def relationships_deleted (self ):
259
- return self ._get_stat (self . RELATIONSHIPS_DELETED )
271
+ return self ._get_stat (RELATIONSHIPS_DELETED )
260
272
261
273
@property
262
274
def indices_created (self ):
263
- return self ._get_stat (self . INDICES_CREATED )
275
+ return self ._get_stat (INDICES_CREATED )
264
276
265
277
@property
266
278
def indices_deleted (self ):
267
- return self ._get_stat (self . INDICES_DELETED )
279
+ return self ._get_stat (INDICES_DELETED )
268
280
269
281
@property
270
282
def cached_execution (self ):
271
- return self ._get_stat (self . CACHED_EXECUTION ) == 1
283
+ return self ._get_stat (CACHED_EXECUTION ) == 1
272
284
273
285
@property
274
286
def run_time_ms (self ):
275
- return self ._get_stat (self .INTERNAL_EXECUTION_TIME )
287
+ return self ._get_stat (INTERNAL_EXECUTION_TIME )
288
+
289
+ @property
290
+ def graph_version (self ):
291
+ return self ._get_stat (GRAPH_VERSION )
292
+
0 commit comments