diff --git a/.gitignore b/.gitignore index f2d4f4407..1991cef02 100644 --- a/.gitignore +++ b/.gitignore @@ -10,3 +10,4 @@ node_modules .idea docs/build .npmrc +*.iml diff --git a/src/v1/internal/stream-observer.js b/src/v1/internal/stream-observer.js index eda799909..fa6b076f1 100644 --- a/src/v1/internal/stream-observer.js +++ b/src/v1/internal/stream-observer.js @@ -16,7 +16,6 @@ * See the License for the specific language governing permissions and * limitations under the License. */ - import Record from "../record"; /** @@ -44,6 +43,7 @@ class StreamObserver { this._errorTransformer = errorTransformer; this._observer = null; this._conn = null; + this._meta = {}; } /** @@ -83,6 +83,20 @@ class StreamObserver { this._tail = meta; } } + this._copyMetadataOnCompletion( meta ); + } + + _copyMetadataOnCompletion(meta) { + for (var key in meta) { + if (meta.hasOwnProperty(key)) { + this._meta[key] = meta[key]; + } + } + } + + serverMetadata() { + const serverMeta = {server: this._conn.server}; + return Object.assign({}, this._meta, serverMeta); } resolveConnection(conn) { diff --git a/src/v1/session.js b/src/v1/session.js index 3b3fa26d5..15c491fd6 100644 --- a/src/v1/session.js +++ b/src/v1/session.js @@ -71,7 +71,7 @@ class Session { } _run(statement, parameters, statementRunner) { - const streamObserver = new _RunObserver(this._onRunFailure()); + const streamObserver = new StreamObserver(this._onRunFailure()); const connectionHolder = this._connectionHolderWithMode(this._mode); if (!this._hasTx) { connectionHolder.initializeConnection(); @@ -86,7 +86,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, () => streamObserver.meta(), connectionHolder); + return new Result(streamObserver, statement, parameters, () => streamObserver.serverMetadata(), connectionHolder); } /** @@ -217,28 +217,6 @@ class Session { } } -/** Internal stream observer used for transactional results*/ -class _RunObserver extends StreamObserver { - constructor(onError) { - super(onError); - this._meta = {}; - } - - onCompleted(meta) { - super.onCompleted(meta); - for(var key in meta){ - if(meta.hasOwnProperty(key)){ - this._meta[key]=meta[key]; - } - } - } - - meta() { - const serverMeta = {server: this._conn.server}; - return Object.assign({}, this._meta, serverMeta); - } -} - function _createTransactionExecutor(config) { const maxRetryTimeMs = (config && config.maxTransactionRetryTime) ? config.maxTransactionRetryTime : null; return new TransactionExecutor(maxRetryTimeMs); diff --git a/src/v1/transaction.js b/src/v1/transaction.js index 37aab1a77..37b6ba6a1 100644 --- a/src/v1/transaction.js +++ b/src/v1/transaction.js @@ -153,11 +153,6 @@ class _TransactionStreamObserver extends StreamObserver { const bookmark = meta.bookmark; this._tx._onBookmark(bookmark); } - - serverMeta() { - const serverMeta = {server: this._conn.server}; - return serverMeta; - } } /** internal state machine of the transaction*/ @@ -179,7 +174,7 @@ let _states = { conn.sync(); }).catch(error => observer.onError(error)); - return _newRunResult(observer, statement, parameters, () => observer.serverMeta()); + return _newRunResult(observer, statement, parameters, () => observer.serverMetadata()); } }, diff --git a/test/v1/transaction.test.js b/test/v1/transaction.test.js index 0a52b67e5..c69d44ae7 100644 --- a/test/v1/transaction.test.js +++ b/test/v1/transaction.test.js @@ -61,7 +61,21 @@ describe('transaction', () => { }).catch(console.log); }); - it('should handle interactive session', done => { + it('should populate resultAvailableAfter for transaction#run when using 3.1 and onwards', done => { + if (neo4jVersionOlderThan31(done)) { + return; + } + const tx = session.beginTransaction(); + tx.run("CREATE (:TXNode1)").then(result => { + tx.commit().then(() => { + expect(result.summary.resultAvailableAfter).toBeDefined(); + expect(result.summary.resultAvailableAfter.toInt()).not.toBeLessThan(0); + done(); + }).catch(console.log); + }).catch(console.log); + }); + + it('should handle interactive session', done => { const tx = session.beginTransaction(); tx.run("RETURN 'foo' AS res").then(result => { tx.run("CREATE ({name: {param}})", {param: result.records[0].get('res')}).then(() => {