Skip to content

Commit 2dc375b

Browse files
authored
Merge pull request #133 from pontusmelke/1.0-version-and-timings
Expose version and timings in summary of driver
2 parents b4da125 + d3b8ffc commit 2dc375b

File tree

4 files changed

+63
-5
lines changed

4 files changed

+63
-5
lines changed

src/v1/result-summary.js

+2
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

+11-1
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

+24-2
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

+26-2
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)