Skip to content

Commit a76a8b5

Browse files
fbivillebigmontz
authored andcommitted
Comply to ExecuteQuery ADR latest revision (neo4j#1059)
Align naming of the default bookmark manager getter with the prescribed one in the latest version of the ADR. Allow filtering of records by skipping `undefined` results. This avoid loading all mapped records into memory when some should be discarded.
1 parent 5cf514c commit a76a8b5

File tree

6 files changed

+52
-19
lines changed

6 files changed

+52
-19
lines changed

packages/core/src/driver.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ class QueryConfig<T = EagerResult> {
334334
* A BookmarkManager is a piece of software responsible for keeping casual consistency between different pieces of work by sharing bookmarks
335335
* between the them.
336336
*
337-
* By default, it uses the driver's non mutable driver level bookmark manager. See, {@link Driver.queryBookmarkManager}
337+
* By default, it uses the driver's non mutable driver level bookmark manager. See, {@link Driver.defaultExecuteQueryBookmarkManager}
338338
*
339339
* Can be set to null to disable causal chaining.
340340
* @type {BookmarkManager|null}
@@ -361,7 +361,7 @@ class Driver {
361361
private readonly _createConnectionProvider: CreateConnectionProvider
362362
private _connectionProvider: ConnectionProvider | null
363363
private readonly _createSession: CreateSession
364-
private readonly _queryBookmarkManager: BookmarkManager
364+
private readonly _defaultExecuteQueryBookmarkManager: BookmarkManager
365365
private readonly _queryExecutor: QueryExecutor
366366

367367
/**
@@ -392,7 +392,7 @@ class Driver {
392392
this._log = log
393393
this._createConnectionProvider = createConnectionProvider
394394
this._createSession = createSession
395-
this._queryBookmarkManager = bookmarkManager()
395+
this._defaultExecuteQueryBookmarkManager = bookmarkManager()
396396
this._queryExecutor = createQueryExecutor(this.session.bind(this))
397397

398398
/**
@@ -412,8 +412,8 @@ class Driver {
412412
* @type {BookmarkManager}
413413
* @returns {BookmarkManager}
414414
*/
415-
get queryBookmarkManager (): BookmarkManager {
416-
return this._queryBookmarkManager
415+
get defaultExecuteQueryBookmarkManager (): BookmarkManager {
416+
return this._defaultExecuteQueryBookmarkManager
417417
}
418418

419419
/**
@@ -495,7 +495,7 @@ class Driver {
495495
* @see https://github.com/neo4j/neo4j-javascript-driver/discussions/1052
496496
*/
497497
async executeQuery<T = EagerResult> (query: Query, parameters?: any, config: QueryConfig<T> = {}): Promise<T> {
498-
const bookmarkManager = config.bookmarkManager === null ? undefined : (config.bookmarkManager ?? this.queryBookmarkManager)
498+
const bookmarkManager = config.bookmarkManager === null ? undefined : (config.bookmarkManager ?? this.defaultExecuteQueryBookmarkManager)
499499
const resultTransformer = (config.resultTransformer ?? resultTransformers.eagerResultTransformer()) as ResultTransformer<T>
500500
const routingConfig: string = config.routing ?? routing.WRITERS
501501

packages/core/src/result-transformers.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class ResultTransformers {
137137
*/
138138
mappedResultTransformer <
139139
R = Record, T = { records: R[], keys: string[], summary: ResultSummary }
140-
>(config: { map?: (rec: Record) => R, collect?: (records: R[], summary: ResultSummary, keys: string[]) => T }): ResultTransformer<T> {
140+
>(config: { map?: (rec: Record) => R | undefined, collect?: (records: R[], summary: ResultSummary, keys: string[]) => T }): ResultTransformer<T> {
141141
if (config == null || (config.collect == null && config.map == null)) {
142142
throw newError('Requires a map or/and a collect functions.')
143143
}
@@ -151,7 +151,10 @@ class ResultTransformers {
151151
},
152152
onNext (record: Record) {
153153
if (config.map != null) {
154-
state.records.push(config.map(record))
154+
const mappedRecord = config.map(record)
155+
if (mappedRecord !== undefined) {
156+
state.records.push(mappedRecord)
157+
}
155158
} else {
156159
state.records.push(record as unknown as R)
157160
}

packages/core/test/driver.test.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -372,7 +372,7 @@ describe('Driver', () => {
372372
expect(eagerResult).toEqual(expected)
373373
expect(spiedExecute).toBeCalledWith({
374374
resultTransformer: resultTransformers.eagerResultTransformer(),
375-
bookmarkManager: driver?.queryBookmarkManager,
375+
bookmarkManager: driver?.defaultExecuteQueryBookmarkManager,
376376
routing: routing.WRITERS,
377377
database: undefined,
378378
impersonatedUser: undefined
@@ -398,7 +398,7 @@ describe('Driver', () => {
398398
expect(summary).toEqual(expected.summary)
399399
expect(spiedExecute).toBeCalledWith({
400400
resultTransformer: resultTransformers.eagerResultTransformer(),
401-
bookmarkManager: driver?.queryBookmarkManager,
401+
bookmarkManager: driver?.defaultExecuteQueryBookmarkManager,
402402
routing: routing.WRITERS,
403403
database: undefined,
404404
impersonatedUser: undefined
@@ -522,7 +522,7 @@ describe('Driver', () => {
522522
return () => {
523523
const defaultConfig = {
524524
resultTransformer: resultTransformers.eagerResultTransformer(),
525-
bookmarkManager: driver?.queryBookmarkManager,
525+
bookmarkManager: driver?.defaultExecuteQueryBookmarkManager,
526526
routing: routing.WRITERS,
527527
database: undefined,
528528
impersonatedUser: undefined

packages/core/test/result-transformers.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,33 @@ describe('resultTransformers', () => {
191191
expect(collect).toHaveBeenCalledWith(rawRecords.map(rec => new Record(keys, rec)), new ResultSummary(query, params, meta), keys)
192192
})
193193

194+
it('should skip the undefined records', async () => {
195+
const {
196+
rawRecords,
197+
result,
198+
keys
199+
} = scenario()
200+
let firstCall = true
201+
const map = jest.fn((record) => {
202+
if (firstCall) {
203+
firstCall = false
204+
return undefined
205+
}
206+
return record.get('a') as number
207+
})
208+
209+
const transform = resultTransformers.mappedResultTransformer({ map })
210+
211+
const { records: as }: { records: number[] } = await transform(result)
212+
213+
const [,...tailRecords] = rawRecords
214+
expect(as).toEqual(tailRecords.map(record => record[keys.indexOf('a')]))
215+
expect(map).toHaveBeenCalledTimes(rawRecords.length)
216+
for (const rawRecord of rawRecords) {
217+
expect(map).toHaveBeenCalledWith(new Record(keys, rawRecord))
218+
}
219+
})
220+
194221
it.each([
195222
undefined,
196223
null,

packages/neo4j-driver-deno/lib/core/driver.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ class QueryConfig<T = EagerResult> {
334334
* A BookmarkManager is a piece of software responsible for keeping casual consistency between different pieces of work by sharing bookmarks
335335
* between the them.
336336
*
337-
* By default, it uses the driver's non mutable driver level bookmark manager. See, {@link Driver.queryBookmarkManager}
337+
* By default, it uses the driver's non mutable driver level bookmark manager. See, {@link Driver.defaultExecuteQueryBookmarkManager}
338338
*
339339
* Can be set to null to disable causal chaining.
340340
* @type {BookmarkManager|null}
@@ -361,7 +361,7 @@ class Driver {
361361
private readonly _createConnectionProvider: CreateConnectionProvider
362362
private _connectionProvider: ConnectionProvider | null
363363
private readonly _createSession: CreateSession
364-
private readonly _queryBookmarkManager: BookmarkManager
364+
private readonly _defaultExecuteQueryBookmarkManager: BookmarkManager
365365
private readonly _queryExecutor: QueryExecutor
366366

367367
/**
@@ -392,7 +392,7 @@ class Driver {
392392
this._log = log
393393
this._createConnectionProvider = createConnectionProvider
394394
this._createSession = createSession
395-
this._queryBookmarkManager = bookmarkManager()
395+
this._defaultExecuteQueryBookmarkManager = bookmarkManager()
396396
this._queryExecutor = createQueryExecutor(this.session.bind(this))
397397

398398
/**
@@ -412,8 +412,8 @@ class Driver {
412412
* @type {BookmarkManager}
413413
* @returns {BookmarkManager}
414414
*/
415-
get queryBookmarkManager (): BookmarkManager {
416-
return this._queryBookmarkManager
415+
get defaultExecuteQueryBookmarkManager (): BookmarkManager {
416+
return this._defaultExecuteQueryBookmarkManager
417417
}
418418

419419
/**
@@ -495,7 +495,7 @@ class Driver {
495495
* @see https://github.com/neo4j/neo4j-javascript-driver/discussions/1052
496496
*/
497497
async executeQuery<T = EagerResult> (query: Query, parameters?: any, config: QueryConfig<T> = {}): Promise<T> {
498-
const bookmarkManager = config.bookmarkManager === null ? undefined : (config.bookmarkManager ?? this.queryBookmarkManager)
498+
const bookmarkManager = config.bookmarkManager === null ? undefined : (config.bookmarkManager ?? this.defaultExecuteQueryBookmarkManager)
499499
const resultTransformer = (config.resultTransformer ?? resultTransformers.eagerResultTransformer()) as ResultTransformer<T>
500500
const routingConfig: string = config.routing ?? routing.WRITERS
501501

packages/neo4j-driver-deno/lib/core/result-transformers.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class ResultTransformers {
137137
*/
138138
mappedResultTransformer <
139139
R = Record, T = { records: R[], keys: string[], summary: ResultSummary }
140-
>(config: { map?: (rec: Record) => R, collect?: (records: R[], summary: ResultSummary, keys: string[]) => T }): ResultTransformer<T> {
140+
>(config: { map?: (rec: Record) => R | undefined, collect?: (records: R[], summary: ResultSummary, keys: string[]) => T }): ResultTransformer<T> {
141141
if (config == null || (config.collect == null && config.map == null)) {
142142
throw newError('Requires a map or/and a collect functions.')
143143
}
@@ -151,7 +151,10 @@ class ResultTransformers {
151151
},
152152
onNext (record: Record) {
153153
if (config.map != null) {
154-
state.records.push(config.map(record))
154+
const mappedRecord = config.map(record)
155+
if (mappedRecord !== undefined) {
156+
state.records.push(mappedRecord)
157+
}
155158
} else {
156159
state.records.push(record as unknown as R)
157160
}

0 commit comments

Comments
 (0)