Skip to content

Commit d3b8ffc

Browse files
committed
Expose version and timings in summary of driver
Note that in the js driver it makes more sense to just expose version in the metadata in ```javascript driver.onCompleted = function(meta) { console.log(meta.server); } ``` instead of putting it on session since it is the place where we are certain that the information has arrived.
1 parent b4da125 commit d3b8ffc

File tree

4 files changed

+63
-5
lines changed

4 files changed

+63
-5
lines changed

src/v1/result-summary.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class ResultSummary {
3737
this.plan = metadata.plan || metadata.profile ? new Plan(metadata.plan || metadata.profile) : false;
3838
this.profile = metadata.profile ? new ProfiledPlan(metadata.profile) : false;
3939
this.notifications = this._buildNotifications(metadata.notifications);
40+
this.resultConsumedAfter = metadata.result_consumed_after;
41+
this.resultAvailableAfter = metadata.result_available_after;
4042
}
4143

4244
_buildNotifications(notifications) {

src/v1/result.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,12 +35,14 @@ class Result {
3535
* @param {StreamObserver} streamObserver
3636
* @param {mixed} statement - Cypher statement to execute
3737
* @param {Object} parameters - Map with parameters to use in statement
38+
* @param metaSupplier function, when called provides metadata
3839
*/
39-
constructor(streamObserver, statement, parameters) {
40+
constructor(streamObserver, statement, parameters, metaSupplier) {
4041
this._streamObserver = streamObserver;
4142
this._p = null;
4243
this._statement = statement;
4344
this._parameters = parameters || {};
45+
this._metaSupplier = metaSupplier || function(){return {};};
4446
}
4547

4648
/**
@@ -102,7 +104,15 @@ class Result {
102104
*/
103105
subscribe(observer) {
104106
let onCompletedOriginal = observer.onCompleted;
107+
let self = this;
105108
let onCompletedWrapper = (metadata) => {
109+
110+
let additionalMeta = self._metaSupplier();
111+
for(var key in additionalMeta) {
112+
if (additionalMeta.hasOwnProperty(key)) {
113+
metadata[key] = additionalMeta[key];
114+
}
115+
}
106116
let sum = new ResultSummary(this._statement, this._parameters, metadata);
107117
onCompletedOriginal.call(observer, sum);
108118
};

src/v1/session.js

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import StreamObserver from './internal/stream-observer';
2121
import Result from './result';
2222
import Transaction from './transaction';
23+
import {Integer, int} from "./integer";
2324
import {newError} from "./error";
2425

2526
/**
@@ -53,7 +54,7 @@ class Session {
5354
parameters = statement.parameters || {};
5455
statement = statement.text;
5556
}
56-
let streamObserver = new StreamObserver();
57+
let streamObserver = new _RunObserver();
5758
if (!this._hasTx) {
5859
this._conn.run(statement, parameters, streamObserver);
5960
this._conn.pullAll(streamObserver);
@@ -63,7 +64,7 @@ class Session {
6364
+ "session with an open transaction; either run from within the "
6465
+ "transaction or use a different session."));
6566
}
66-
return new Result( streamObserver, statement, parameters );
67+
return new Result( streamObserver, statement, parameters, () => streamObserver.meta() );
6768
}
6869

6970
/**
@@ -103,4 +104,25 @@ class Session {
103104
}
104105
}
105106

107+
/** Internal stream observer used for transactional results*/
108+
class _RunObserver extends StreamObserver {
109+
constructor() {
110+
super();
111+
this._meta = {};
112+
}
113+
114+
onCompleted(meta) {
115+
super.onCompleted(meta);
116+
for(var key in meta){
117+
if(meta.hasOwnProperty(key)){
118+
this._meta[key]=meta[key];
119+
}
120+
}
121+
}
122+
123+
meta() {
124+
return this._meta;
125+
}
126+
}
127+
106128
export default Session;

test/v1/session.test.js

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,13 @@ var Session = require("../../lib/v1/session");
2323

2424
describe('session', function () {
2525

26-
var driver, session;
26+
var driver, session, server;
2727

2828
beforeEach(function (done) {
2929
driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "neo4j"));
30+
driver.onCompleted = function (meta) {
31+
server = meta['server'];
32+
};
3033
session = driver.session();
3134

3235
session.run("MATCH (n) DETACH DELETE n").then(done);
@@ -158,6 +161,28 @@ describe('session', function () {
158161
});
159162
});
160163

164+
it('should expose execution time information when using 3.1 and onwards', function (done) {
165+
166+
//lazy way of checking the version number
167+
//if server has been set we know it is at least
168+
//3.1 (todo actually parse the version string)
169+
if (!server) {
170+
done();
171+
return;
172+
}
173+
// Given
174+
var statement = "UNWIND range(1,10000) AS n RETURN n AS number";
175+
// When & Then
176+
177+
session.run(statement)
178+
.then(function (result) {
179+
var sum = result.summary;
180+
expect(sum.resultAvailableAfter.toInt()).toBeGreaterThan(0);
181+
expect(sum.resultConsumedAfter.toInt()).toBeGreaterThan(0);
182+
done();
183+
});
184+
});
185+
161186
it('should expose empty parameter map on call with no parameters', function (done) {
162187
// Given
163188
var statement = "CREATE (n:Label {prop:'string'}) RETURN n";
@@ -305,7 +330,6 @@ describe('session', function () {
305330
done();
306331
})
307332
});
308-
309333
});
310334

311335

0 commit comments

Comments
 (0)