@@ -96,6 +96,29 @@ def session(self, **config):
9696 return Session (connect (self .host , self .port , ** config ))
9797
9898
99+ class Result (list ):
100+
101+ def __init__ (self ):
102+ super (Result , self ).__init__ ()
103+ self .keys = None
104+ self .bench_test = None
105+
106+ def on_header (self , metadata ):
107+ self .keys = metadata ["fields" ]
108+ if self .bench_test :
109+ self .bench_test .start_recv = perf_counter ()
110+
111+ def on_record (self , values ):
112+ self .append (Record (self .keys , tuple (map (hydrated , values ))))
113+
114+ def on_footer (self , metadata ):
115+ if self .bench_test :
116+ self .bench_test .end_recv = perf_counter ()
117+
118+ def on_failure (self , metadata ):
119+ raise CypherError (metadata )
120+
121+
99122class Session (object ):
100123 """ Logical session carried out over an established TCP connection.
101124 Sessions should generally be constructed using the :meth:`.Driver.session`
@@ -118,56 +141,43 @@ def run(self, statement, parameters=None):
118141
119142 :param statement: Cypher statement to execute
120143 :param parameters: dictionary of parameters
121- :return: list of :class:`.Record` objects
144+ :return: Cypher result
145+ :rtype: :class:`.Result`
122146 """
123- t = BenchTest ()
124147
125148 # Ensure the statement is a Unicode value
126149 if isinstance (statement , bytes ):
127150 statement = statement .decode ("UTF-8" )
128151
129152 parameters = dict (parameters or {})
130153
154+ t = BenchTest ()
131155 t .init = perf_counter ()
132156
133- fields = []
134- records = []
135-
136- def on_header (metadata ):
137- fields .extend (metadata ["fields" ])
138- t .start_recv = perf_counter ()
139-
140- def on_record (values ):
141- records .append (Record (fields , tuple (map (hydrated , values ))))
142-
143- def on_footer (metadata ):
144- t .end_recv = perf_counter ()
145-
146- def on_failure (metadata ):
147- raise CypherError ("FAILURE" )
157+ result = Result ()
158+ result .bench_test = t
148159
149160 run_response = Response (self .connection )
150- run_response .on_success = on_header
151- run_response .on_failure = on_failure
161+ run_response .on_success = result . on_header
162+ run_response .on_failure = result . on_failure
152163
153164 pull_all_response = Response (self .connection )
154- pull_all_response .on_record = on_record
155- pull_all_response .on_success = on_footer
156- pull_all_response .on_failure = on_failure
165+ pull_all_response .on_record = result . on_record
166+ pull_all_response .on_success = result . on_footer
167+ pull_all_response .on_failure = result . on_failure
157168
158169 self .connection .append (RUN , (statement , parameters ), response = run_response )
159170 self .connection .append (PULL_ALL , response = pull_all_response )
160171 t .start_send = perf_counter ()
161172 self .connection .send ()
162173 t .end_send = perf_counter ()
163174
164- run_response .consume ()
165- pull_all_response .consume ()
166-
175+ self .connection .fetch_all (run_response )
176+ self .connection .fetch_all (pull_all_response )
167177 t .done = perf_counter ()
168178 self .bench_tests .append (t )
169179
170- return records
180+ return result
171181
172182 def close (self ):
173183 """ Shut down and close the session.
@@ -257,14 +267,14 @@ class Record(object):
257267 ``record["field"]``) or by attribute (``record.field``).
258268 """
259269
260- def __init__ (self , fields , values ):
261- self .__fields__ = fields
270+ def __init__ (self , keys , values ):
271+ self .__keys__ = keys
262272 self .__values__ = values
263273
264274 def __repr__ (self ):
265275 values = self .__values__
266276 s = []
267- for i , field in enumerate (self .__fields__ ):
277+ for i , field in enumerate (self .__keys__ ):
268278 s .append ("%s=%r" % (field , values [i ]))
269279 return "<Record %s>" % " " .join (s )
270280
@@ -278,20 +288,20 @@ def __ne__(self, other):
278288 return not self .__eq__ (other )
279289
280290 def __len__ (self ):
281- return self .__fields__ .__len__ ()
291+ return self .__keys__ .__len__ ()
282292
283293 def __getitem__ (self , item ):
284294 if isinstance (item , string ):
285295 return getattr (self , item )
286296 elif isinstance (item , integer ):
287- return getattr (self , self .__fields__ [item ])
297+ return getattr (self , self .__keys__ [item ])
288298 else :
289299 raise TypeError (item )
290300
291301 def __getattr__ (self , item ):
292302 try :
293- i = self .__fields__ .index (item )
303+ i = self .__keys__ .index (item )
294304 except ValueError :
295- raise AttributeError ("No field %r" % item )
305+ raise AttributeError ("No key %r" % item )
296306 else :
297307 return self .__values__ [i ]
0 commit comments