Skip to content

Commit bde6558

Browse files
committed
Expose the execution time metadata on ResultSummary.
1 parent 5711d2d commit bde6558

File tree

3 files changed

+19
-1
lines changed

3 files changed

+19
-1
lines changed

neo4j/v1/bolt.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -202,8 +202,11 @@ class BoltStatementResult(StatementResult):
202202
def __init__(self, session, run_response, pull_all_response):
203203
super(BoltStatementResult, self).__init__(session)
204204

205+
all_metadata = {}
206+
205207
def on_header(metadata):
206208
# Called on receipt of the result header.
209+
all_metadata.update(metadata)
207210
self._keys = tuple(metadata["fields"])
208211

209212
def on_record(values):
@@ -212,7 +215,8 @@ def on_record(values):
212215

213216
def on_footer(metadata):
214217
# Called on receipt of the result footer.
215-
self._summary = ResultSummary(self.statement, self.parameters, **metadata)
218+
all_metadata.update(metadata)
219+
self._summary = ResultSummary(self.statement, self.parameters, **all_metadata)
216220
self._session = None
217221

218222
def on_failure(metadata):

neo4j/v1/summary.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,12 @@ class ResultSummary(object):
5050
#: A :class:`.ProfiledPlan` instance
5151
profile = None
5252

53+
#: The time it took for the server to have the result available.
54+
result_available_after = None
55+
56+
#: The time it took for the server to consume the result.
57+
result_consumed_after = None
58+
5359
#: Notifications provide extra information for a user executing a statement.
5460
#: They can be warnings about problematic queries or other valuable information that can be
5561
#: presented in a client.
@@ -62,6 +68,8 @@ def __init__(self, statement, parameters, **metadata):
6268
self.metadata = metadata
6369
self.statement_type = metadata.get("type")
6470
self.counters = SummaryCounters(metadata.get("stats", {}))
71+
self.result_available_after = metadata.get("result_available_after")
72+
self.result_consumed_after = metadata.get("result_consumed_after")
6573
if "plan" in metadata:
6674
self.plan = make_plan(metadata["plan"])
6775
if "profile" in metadata:

test/test_session.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,12 @@ def test_can_obtain_notification_info(self):
255255
assert position.line == 1
256256
assert position.column == 1
257257

258+
@skipUnless(SERVER_VERSION >= (3, 1), "Execution times are not supported in 3.0.")
259+
def test_contains_time_information(self):
260+
with self.driver.session() as session:
261+
summary = session.run("UNWIND range(1,1000) AS n RETURN n AS number").consume()
262+
assert summary.result_consumed_after > 0
263+
assert summary.result_available_after > 0
258264

259265
class ResetTestCase(ServerTestCase):
260266

0 commit comments

Comments
 (0)