Skip to content

Commit b57cfcb

Browse files
authored
Merge pull request #868 from orbitjs/record-transform-buffer-refactor
Extract RecordTransformBuffer interface
2 parents 2dc44ef + 902ebfd commit b57cfcb

10 files changed

+586
-328
lines changed

packages/@orbit/indexeddb/src/indexeddb-cache.ts

+19-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@ import {
1313
AsyncRecordCacheSettings,
1414
RecordCacheQueryOptions,
1515
RecordCacheTransformOptions,
16-
RecordCacheUpdateDetails
16+
RecordCacheUpdateDetails,
17+
RecordTransformBuffer,
18+
SimpleRecordTransformBuffer
1719
} from '@orbit/record-cache';
1820
import { supportsIndexedDB } from './lib/indexeddb';
1921
import { RequestOptions } from '@orbit/data';
@@ -564,6 +566,22 @@ export class IndexedDBCache<
564566
// Protected methods
565567
/////////////////////////////////////////////////////////////////////////////
566568

569+
/**
570+
* Override `_getTransformBuffer` on base `AsyncRecordCache` to provide a
571+
* `transformBuffer` if a custom one hasn't been provided via the constructor
572+
* setting.
573+
*/
574+
protected _getTransformBuffer(): RecordTransformBuffer {
575+
if (this._transformBuffer === undefined) {
576+
const { schema, keyMap } = this;
577+
this._transformBuffer = new SimpleRecordTransformBuffer({
578+
schema,
579+
keyMap
580+
});
581+
}
582+
return this._transformBuffer;
583+
}
584+
567585
protected async _getAllRecords(): Promise<InitializedRecord[]> {
568586
if (!this._db) return Promise.reject(DB_NOT_OPEN);
569587

packages/@orbit/local-storage/src/local-storage-cache.ts

+22
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
RecordCacheTransformOptions,
1212
RecordCacheUpdateDetails,
1313
RecordRelationshipIdentity,
14+
RecordTransformBuffer,
15+
SimpleRecordTransformBuffer,
1416
SyncRecordCache,
1517
SyncRecordCacheSettings
1618
} from '@orbit/record-cache';
@@ -261,4 +263,24 @@ export class LocalStorageCache<
261263
processor.upgrade();
262264
}
263265
}
266+
267+
/////////////////////////////////////////////////////////////////////////////
268+
// Protected methods
269+
/////////////////////////////////////////////////////////////////////////////
270+
271+
/**
272+
* Override `_getTransformBuffer` on base `SyncRecordCache` to provide a
273+
* `transformBuffer` if a custom one hasn't been provided via the constructor
274+
* setting.
275+
*/
276+
protected _getTransformBuffer(): RecordTransformBuffer {
277+
if (this._transformBuffer === undefined) {
278+
const { schema, keyMap } = this;
279+
this._transformBuffer = new SimpleRecordTransformBuffer({
280+
schema,
281+
keyMap
282+
});
283+
}
284+
return this._transformBuffer;
285+
}
264286
}

packages/@orbit/memory/src/memory-cache.ts

+18
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import {
1111
RecordCacheTransformOptions,
1212
RecordCacheUpdateDetails,
1313
RecordRelationshipIdentity,
14+
RecordTransformBuffer,
15+
SimpleRecordTransformBuffer,
1416
SyncRecordCache,
1517
SyncRecordCacheSettings
1618
} from '@orbit/record-cache';
@@ -256,6 +258,22 @@ export class MemoryCache<
256258
// Protected methods
257259
/////////////////////////////////////////////////////////////////////////////
258260

261+
/**
262+
* Override `_getTransformBuffer` on base `SyncRecordCache` to provide a
263+
* `transformBuffer` if a custom one hasn't been provided via the constructor
264+
* setting.
265+
*/
266+
protected _getTransformBuffer(): RecordTransformBuffer {
267+
if (this._transformBuffer === undefined) {
268+
const { schema, keyMap } = this;
269+
this._transformBuffer = new SimpleRecordTransformBuffer({
270+
schema,
271+
keyMap
272+
});
273+
}
274+
return this._transformBuffer;
275+
}
276+
259277
protected _resetInverseRelationships(
260278
base?: MemoryCache<QO, TO, QB, TB, QRD, TRD>
261279
): void {

packages/@orbit/record-cache/src/async-record-cache.ts

+8-18
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Orbit } from '@orbit/core';
1+
import { Assertion, Orbit } from '@orbit/core';
22
import {
33
buildQuery,
44
buildTransform,
@@ -60,12 +60,8 @@ import {
6060
RecordCacheSettings,
6161
RecordCacheTransformOptions
6262
} from './record-cache';
63-
import {
64-
RecordTransformBuffer,
65-
RecordTransformBufferClass
66-
} from './record-transform-buffer';
63+
import { RecordTransformBuffer } from './record-transform-buffer';
6764
import { PatchResult, RecordCacheUpdateDetails } from './response';
68-
import { SyncRecordCacheSettings } from './sync-record-cache';
6965

7066
const { assert, deprecate } = Orbit;
7167

@@ -80,8 +76,7 @@ export interface AsyncRecordCacheSettings<
8076
transformOperators?: Dict<AsyncTransformOperator>;
8177
inverseTransformOperators?: Dict<AsyncInverseTransformOperator>;
8278
debounceLiveQueries?: boolean;
83-
transformBufferClass?: RecordTransformBufferClass;
84-
transformBufferSettings?: SyncRecordCacheSettings<QO, TO>;
79+
transformBuffer?: RecordTransformBuffer;
8580
}
8681

8782
export abstract class AsyncRecordCache<
@@ -103,8 +98,6 @@ export abstract class AsyncRecordCache<
10398
protected _inverseTransformOperators: Dict<AsyncInverseTransformOperator>;
10499
protected _debounceLiveQueries: boolean;
105100
protected _transformBuffer?: RecordTransformBuffer;
106-
protected _transformBufferClass?: RecordTransformBufferClass;
107-
protected _transformBufferSettings?: SyncRecordCacheSettings<QO, TO>;
108101

109102
constructor(settings: AsyncRecordCacheSettings<QO, TO, QB, TB>) {
110103
super(settings);
@@ -115,6 +108,7 @@ export abstract class AsyncRecordCache<
115108
this._inverseTransformOperators =
116109
settings.inverseTransformOperators ?? AsyncInverseTransformOperators;
117110
this._debounceLiveQueries = settings.debounceLiveQueries !== false;
111+
this._transformBuffer = settings.transformBuffer;
118112

119113
const processors: AsyncOperationProcessorClass[] = settings.processors
120114
? settings.processors
@@ -494,14 +488,9 @@ export abstract class AsyncRecordCache<
494488

495489
protected _getTransformBuffer(): RecordTransformBuffer {
496490
if (this._transformBuffer === undefined) {
497-
let transformBufferClass =
498-
this._transformBufferClass ?? RecordTransformBuffer;
499-
let settings = this._transformBufferSettings ?? { schema: this.schema };
500-
settings.schema = settings.schema ?? this.schema;
501-
settings.keyMap = settings.keyMap ?? this.keyMap;
502-
this._transformBuffer = new transformBufferClass(settings);
503-
} else {
504-
this._transformBuffer.reset();
491+
throw new Assertion(
492+
'transformBuffer must be provided to cache via constructor settings'
493+
);
505494
}
506495
return this._transformBuffer;
507496
}
@@ -520,6 +509,7 @@ export abstract class AsyncRecordCache<
520509
const relatedRecords = inverseRelationships.map((ir) => ir.record);
521510
Array.prototype.push.apply(records, relatedRecords);
522511

512+
buffer.resetState();
523513
buffer.setRecordsSync(await this.getRecordsAsync(records));
524514
buffer.addInverseRelationshipsSync(inverseRelationships);
525515

packages/@orbit/record-cache/src/index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ export * from './response';
22
export * from './record-accessor';
33
export * from './record-cache';
44
export * from './record-transform-buffer';
5+
export * from './simple-record-transform-buffer';
56

67
export * from './async-record-cache';
78
export * from './async-operation-processor';

0 commit comments

Comments
 (0)