Skip to content

Expose version and timings in summary of driver #133

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 5, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/v1/result-summary.js
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@ class ResultSummary {
this.plan = metadata.plan || metadata.profile ? new Plan(metadata.plan || metadata.profile) : false;
this.profile = metadata.profile ? new ProfiledPlan(metadata.profile) : false;
this.notifications = this._buildNotifications(metadata.notifications);
this.resultConsumedAfter = metadata.result_consumed_after;
this.resultAvailableAfter = metadata.result_available_after;
}

_buildNotifications(notifications) {
Expand Down
12 changes: 11 additions & 1 deletion src/v1/result.js
Original file line number Diff line number Diff line change
Expand Up @@ -35,12 +35,14 @@ class Result {
* @param {StreamObserver} streamObserver
* @param {mixed} statement - Cypher statement to execute
* @param {Object} parameters - Map with parameters to use in statement
* @param metaSupplier function, when called provides metadata
*/
constructor(streamObserver, statement, parameters) {
constructor(streamObserver, statement, parameters, metaSupplier) {
this._streamObserver = streamObserver;
this._p = null;
this._statement = statement;
this._parameters = parameters || {};
this._metaSupplier = metaSupplier || function(){return {};};
}

/**
Expand Down Expand Up @@ -102,7 +104,15 @@ class Result {
*/
subscribe(observer) {
let onCompletedOriginal = observer.onCompleted;
let self = this;
let onCompletedWrapper = (metadata) => {

let additionalMeta = self._metaSupplier();
for(var key in additionalMeta) {
if (additionalMeta.hasOwnProperty(key)) {
metadata[key] = additionalMeta[key];
}
}
let sum = new ResultSummary(this._statement, this._parameters, metadata);
onCompletedOriginal.call(observer, sum);
};
Expand Down
26 changes: 24 additions & 2 deletions src/v1/session.js
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import StreamObserver from './internal/stream-observer';
import Result from './result';
import Transaction from './transaction';
import {Integer, int} from "./integer";
import {newError} from "./error";

/**
Expand Down Expand Up @@ -53,7 +54,7 @@ class Session {
parameters = statement.parameters || {};
statement = statement.text;
}
let streamObserver = new StreamObserver();
let streamObserver = new _RunObserver();
if (!this._hasTx) {
this._conn.run(statement, parameters, streamObserver);
this._conn.pullAll(streamObserver);
Expand All @@ -63,7 +64,7 @@ class Session {
+ "session with an open transaction; either run from within the "
+ "transaction or use a different session."));
}
return new Result( streamObserver, statement, parameters );
return new Result( streamObserver, statement, parameters, () => streamObserver.meta() );
}

/**
Expand Down Expand Up @@ -103,4 +104,25 @@ class Session {
}
}

/** Internal stream observer used for transactional results*/
class _RunObserver extends StreamObserver {
constructor() {
super();
this._meta = {};
}

onCompleted(meta) {
super.onCompleted(meta);
for(var key in meta){
if(meta.hasOwnProperty(key)){
this._meta[key]=meta[key];
}
}
}

meta() {
return this._meta;
}
}

export default Session;
28 changes: 26 additions & 2 deletions test/v1/session.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,13 @@ var Session = require("../../lib/v1/session");

describe('session', function () {

var driver, session;
var driver, session, server;

beforeEach(function (done) {
driver = neo4j.driver("bolt://localhost", neo4j.auth.basic("neo4j", "neo4j"));
driver.onCompleted = function (meta) {
server = meta['server'];
};
session = driver.session();

session.run("MATCH (n) DETACH DELETE n").then(done);
Expand Down Expand Up @@ -158,6 +161,28 @@ describe('session', function () {
});
});

it('should expose execution time information when using 3.1 and onwards', function (done) {

//lazy way of checking the version number
//if server has been set we know it is at least
//3.1 (todo actually parse the version string)
if (!server) {
done();
return;
}
// Given
var statement = "UNWIND range(1,10000) AS n RETURN n AS number";
// When & Then

session.run(statement)
.then(function (result) {
var sum = result.summary;
expect(sum.resultAvailableAfter.toInt()).toBeGreaterThan(0);
expect(sum.resultConsumedAfter.toInt()).toBeGreaterThan(0);
done();
});
});

it('should expose empty parameter map on call with no parameters', function (done) {
// Given
var statement = "CREATE (n:Label {prop:'string'}) RETURN n";
Expand Down Expand Up @@ -305,7 +330,6 @@ describe('session', function () {
done();
})
});

});