11from .node import Node
22from .edge import Edge
33from .path import Path
4+ from .exceptions import VersionMismatchException
45from prettytable import PrettyTable
56from redis import ResponseError
67
8+ LABELS_ADDED = 'Labels added'
9+ NODES_CREATED = 'Nodes created'
10+ NODES_DELETED = 'Nodes deleted'
11+ RELATIONSHIPS_DELETED = 'Relationships deleted'
12+ PROPERTIES_SET = 'Properties set'
13+ RELATIONSHIPS_CREATED = 'Relationships created'
14+ INDICES_CREATED = "Indices created"
15+ INDICES_DELETED = "Indices deleted"
16+ CACHED_EXECUTION = "Cached execution"
17+ INTERNAL_EXECUTION_TIME = 'internal execution time'
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 ]
722
823class ResultSetColumnTypes (object ):
924 COLUMN_UNKNOWN = 0
1025 COLUMN_SCALAR = 1
1126 COLUMN_NODE = 2 # Unused as of RedisGraph v2.1.0, retained for backwards compatibility.
1227 COLUMN_RELATION = 3 # Unused as of RedisGraph v2.1.0, retained for backwards compatibility.
1328
14-
1529class ResultSetScalarTypes (object ):
1630 VALUE_UNKNOWN = 0
1731 VALUE_NULL = 1
@@ -25,31 +39,33 @@ class ResultSetScalarTypes(object):
2539 VALUE_PATH = 9
2640
2741class 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'
3842
3943 def __init__ (self , graph , response ):
4044 self .graph = graph
4145 self .header = []
4246 self .result_set = []
4347
44- # If we encountered a run-time error, the last response element will be an exception.
45- if isinstance (response [- 1 ], ResponseError ):
46- raise response [- 1 ]
48+ # incase of an error an exception will be raised
49+ self ._check_for_errors (response )
4750
4851 if len (response ) == 1 :
4952 self .parse_statistics (response [0 ])
5053 else :
51- self . parse_results ( response )
54+ # start by parsing statistics, matches the one we have
5255 self .parse_statistics (response [- 1 ]) # Last element.
56+ self .parse_results (response )
57+
58+ def _check_for_errors (self , response ):
59+ if isinstance (response [0 ], ResponseError ):
60+ error = response [0 ]
61+ if str (error ) == "version mismatch" :
62+ version = response [1 ]
63+ error = VersionMismatchException (version )
64+ raise error
65+
66+ # If we encountered a run-time error, the last response element will be an exception.
67+ if isinstance (response [- 1 ], ResponseError ):
68+ raise response [- 1 ]
5369
5470 def parse_results (self , raw_result_set ):
5571 self .header = self .parse_header (raw_result_set )
@@ -63,10 +79,12 @@ def parse_results(self, raw_result_set):
6379 def parse_statistics (self , raw_statistics ):
6480 self .statistics = {}
6581
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 :
82+ # decode statistics
83+ for idx , stat in enumerate (raw_statistics ):
84+ if isinstance (stat , bytes ):
85+ raw_statistics [idx ] = stat .decode ()
86+
87+ for s in STATS :
7088 v = self ._get_value (s , raw_statistics )
7189 if v is not None :
7290 self .statistics [s ] = v
@@ -223,53 +241,51 @@ def is_empty(self):
223241 @staticmethod
224242 def _get_value (prop , statistics ):
225243 for stat in statistics :
226- if isinstance (stat , bytes ):
227- stat = stat .decode ()
228244 if prop in stat :
229245 return float (stat .split (': ' )[1 ].split (' ' )[0 ])
230246
231-
232247 return None
233248
234249 def _get_stat (self , stat ):
235250 return self .statistics [stat ] if stat in self .statistics else 0
236251
237252 @property
238253 def labels_added (self ):
239- return self ._get_stat (self . LABELS_ADDED )
254+ return self ._get_stat (LABELS_ADDED )
240255
241256 @property
242257 def nodes_created (self ):
243- return self ._get_stat (self . NODES_CREATED )
258+ return self ._get_stat (NODES_CREATED )
244259
245260 @property
246261 def nodes_deleted (self ):
247- return self ._get_stat (self . NODES_DELETED )
262+ return self ._get_stat (NODES_DELETED )
248263
249264 @property
250265 def properties_set (self ):
251- return self ._get_stat (self . PROPERTIES_SET )
266+ return self ._get_stat (PROPERTIES_SET )
252267
253268 @property
254269 def relationships_created (self ):
255- return self ._get_stat (self . RELATIONSHIPS_CREATED )
270+ return self ._get_stat (RELATIONSHIPS_CREATED )
256271
257272 @property
258273 def relationships_deleted (self ):
259- return self ._get_stat (self . RELATIONSHIPS_DELETED )
274+ return self ._get_stat (RELATIONSHIPS_DELETED )
260275
261276 @property
262277 def indices_created (self ):
263- return self ._get_stat (self . INDICES_CREATED )
278+ return self ._get_stat (INDICES_CREATED )
264279
265280 @property
266281 def indices_deleted (self ):
267- return self ._get_stat (self . INDICES_DELETED )
282+ return self ._get_stat (INDICES_DELETED )
268283
269284 @property
270285 def cached_execution (self ):
271- return self ._get_stat (self . CACHED_EXECUTION ) == 1
286+ return self ._get_stat (CACHED_EXECUTION ) == 1
272287
273288 @property
274289 def run_time_ms (self ):
275- return self ._get_stat (self .INTERNAL_EXECUTION_TIME )
290+ return self ._get_stat (INTERNAL_EXECUTION_TIME )
291+
0 commit comments