Skip to content

Commit db8eff4

Browse files
committed
More tests for bucket id transformer
1 parent 2acc81d commit db8eff4

17 files changed

+324
-119
lines changed

packages/sync-rules/src/BaseSqlDataQuery.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -177,9 +177,9 @@ export class BaseSqlDataQuery {
177177
}
178178
}
179179

180-
evaluateRowWithOptions(options: EvaluateRowOptions): EvaluationResult[] {
180+
evaluateRowWithOptions(options: Omit<EvaluateRowOptions, 'bucketIdTransformer'>): EvaluationResult[] {
181181
try {
182-
const { table, row, bucketIds, bucketIdTransformer } = options;
182+
const { table, row, bucketIds } = options;
183183

184184
const tables = { [this.table]: this.addSpecialParameters(table, row) };
185185
const resolvedBucketIds = bucketIds(tables);
@@ -199,7 +199,7 @@ export class BaseSqlDataQuery {
199199

200200
return resolvedBucketIds.map((bucketId) => {
201201
return {
202-
bucket: bucketIdTransformer ? bucketIdTransformer(bucketId) : bucketId,
202+
bucket: bucketId,
203203
table: outputTable,
204204
id: id,
205205
data

packages/sync-rules/src/SqlBucketDescriptor.ts

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import { TableValuedFunctionSqlParameterQuery } from './TableValuedFunctionSqlPa
1313
import { SqlRuleError } from './errors.js';
1414
import { CompatibilityContext } from './compatibility.js';
1515
import {
16+
BucketIdTransformer,
1617
EvaluatedParametersResult,
1718
EvaluateRowOptions,
1819
EvaluationResult,
@@ -137,7 +138,11 @@ export class SqlBucketDescriptor implements BucketSource {
137138

138139
pushBucketParameterQueriers(result: PendingQueriers, options: GetQuerierOptions) {
139140
const reasons = [this.bucketInclusionReason()];
140-
const staticBuckets = this.getStaticBucketDescriptions(options.globalParameters, reasons);
141+
const staticBuckets = this.getStaticBucketDescriptions(
142+
options.globalParameters,
143+
reasons,
144+
options.bucketIdTransformer
145+
);
141146
const staticQuerier = {
142147
staticBuckets,
143148
hasDynamicBuckets: false,
@@ -151,15 +156,19 @@ export class SqlBucketDescriptor implements BucketSource {
151156
}
152157

153158
const dynamicQueriers = this.parameterQueries.map((query) =>
154-
query.getBucketParameterQuerier(options.globalParameters, reasons)
159+
query.getBucketParameterQuerier(options.globalParameters, reasons, options.bucketIdTransformer)
155160
);
156161
result.queriers.push(...dynamicQueriers);
157162
}
158163

159-
getStaticBucketDescriptions(parameters: RequestParameters, reasons: BucketInclusionReason[]): ResolvedBucket[] {
164+
getStaticBucketDescriptions(
165+
parameters: RequestParameters,
166+
reasons: BucketInclusionReason[],
167+
transformer: BucketIdTransformer
168+
): ResolvedBucket[] {
160169
let results: ResolvedBucket[] = [];
161170
for (let query of this.globalParameterQueries) {
162-
for (const desc of query.getStaticBucketDescriptions(parameters)) {
171+
for (const desc of query.getStaticBucketDescriptions(parameters, transformer)) {
163172
results.push({
164173
...desc,
165174
definition: this.name,

packages/sync-rules/src/SqlDataQuery.ts

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -188,15 +188,16 @@ export class SqlDataQuery extends BaseSqlDataQuery {
188188
evaluateRow(
189189
table: SourceTableInterface,
190190
row: SqliteRow,
191-
bucketIdTransformer: BucketIdTransformer | null
191+
bucketIdTransformer: BucketIdTransformer
192192
): EvaluationResult[] {
193193
return this.evaluateRowWithOptions({
194194
table,
195195
row,
196-
bucketIdTransformer,
197196
bucketIds: (tables) => {
198197
const bucketParameters = this.filter.filterRow(tables);
199-
return bucketParameters.map((params) => getBucketId(this.descriptorName, this.bucketParameters, params));
198+
return bucketParameters.map((params) =>
199+
getBucketId(this.descriptorName, this.bucketParameters, params, bucketIdTransformer)
200+
);
200201
}
201202
});
202203
}

packages/sync-rules/src/SqlParameterQuery.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import { TablePattern } from './TablePattern.js';
1515
import { TableQuerySchema } from './TableQuerySchema.js';
1616
import { TableValuedFunctionSqlParameterQuery } from './TableValuedFunctionSqlParameterQuery.js';
1717
import {
18+
BucketIdTransformer,
1819
EvaluatedParameters,
1920
EvaluatedParametersResult,
2021
InputParameter,
@@ -348,7 +349,11 @@ export class SqlParameterQuery {
348349
*
349350
* Internal function, but exposed for tests.
350351
*/
351-
resolveBucketDescriptions(bucketParameters: SqliteJsonRow[], parameters: RequestParameters): BucketDescription[] {
352+
resolveBucketDescriptions(
353+
bucketParameters: SqliteJsonRow[],
354+
parameters: RequestParameters,
355+
transformer: BucketIdTransformer
356+
): BucketDescription[] {
352357
// Filters have already been applied and gotten us the set of bucketParameters - don't attempt to filter again.
353358
// We _do_ need to evaluate the output columns here, using a combination of precomputed bucketParameters,
354359
// and values from token parameters.
@@ -372,7 +377,7 @@ export class SqlParameterQuery {
372377
}
373378

374379
return {
375-
bucket: getBucketId(this.descriptorName, this.bucketParameters, result),
380+
bucket: getBucketId(this.descriptorName, this.bucketParameters, result, transformer),
376381
priority: this.priority
377382
};
378383
})
@@ -457,7 +462,8 @@ export class SqlParameterQuery {
457462

458463
getBucketParameterQuerier(
459464
requestParameters: RequestParameters,
460-
reasons: BucketInclusionReason[]
465+
reasons: BucketInclusionReason[],
466+
transformer: BucketIdTransformer
461467
): BucketParameterQuerier {
462468
const lookups = this.getLookups(requestParameters);
463469
if (lookups.length == 0) {
@@ -477,7 +483,7 @@ export class SqlParameterQuery {
477483
parameterQueryLookups: lookups,
478484
queryDynamicBucketDescriptions: async (source: ParameterLookupSource) => {
479485
const bucketParameters = await source.getParameterSets(lookups);
480-
return this.resolveBucketDescriptions(bucketParameters, requestParameters).map((bucket) => ({
486+
return this.resolveBucketDescriptions(bucketParameters, requestParameters, transformer).map((bucket) => ({
481487
...bucket,
482488
definition: this.descriptorName,
483489
inclusion_reasons: reasons

packages/sync-rules/src/SqlSyncRules.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ export class SqlSyncRules implements SyncRules {
399399
: {
400400
...options,
401401
// Disable bucket id transformer when the option is unused.
402-
transformBucketIds: null
402+
bucketIdTransformer: (id: string) => id
403403
};
404404

405405
let rawResults: EvaluationResult[] = [];
@@ -439,13 +439,24 @@ export class SqlSyncRules implements SyncRules {
439439
}
440440

441441
getBucketParameterQuerier(options: GetQuerierOptions): GetBucketParameterQuerierResult {
442+
const resolvedOptions = this.compatibility.isEnabled(CompatibilityOption.versionedBucketIds)
443+
? options
444+
: {
445+
...options,
446+
// Disable bucket id transformer when the option is unused.
447+
bucketIdTransformer: (id: string) => id
448+
};
449+
442450
const queriers: BucketParameterQuerier[] = [];
443451
const errors: QuerierError[] = [];
444452
const pending = { queriers, errors };
445453

446454
for (const source of this.bucketSources) {
447-
if ((source.subscribedToByDefault && options.hasDefaultStreams) || source.name in options.streams) {
448-
source.pushBucketParameterQueriers(pending, options);
455+
if (
456+
(source.subscribedToByDefault && resolvedOptions.hasDefaultStreams) ||
457+
source.name in resolvedOptions.streams
458+
) {
459+
source.pushBucketParameterQueriers(pending, resolvedOptions);
449460
}
450461
}
451462

packages/sync-rules/src/StaticSqlParameterQuery.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,13 @@ import { BucketDescription, BucketPriority, DEFAULT_BUCKET_PRIORITY } from './Bu
33
import { SqlRuleError } from './errors.js';
44
import { SqlTools } from './sql_filters.js';
55
import { checkUnsupportedFeatures, isClauseError, isParameterValueClause, sqliteBool } from './sql_support.js';
6-
import { ParameterValueClause, QueryParseOptions, RequestParameters, SqliteJsonValue } from './types.js';
6+
import {
7+
BucketIdTransformer,
8+
ParameterValueClause,
9+
QueryParseOptions,
10+
RequestParameters,
11+
SqliteJsonValue
12+
} from './types.js';
713
import { getBucketId, isJsonValue } from './utils.js';
814

915
export interface StaticSqlParameterQueryOptions {
@@ -153,7 +159,7 @@ export class StaticSqlParameterQuery {
153159
this.errors = options.errors ?? [];
154160
}
155161

156-
getStaticBucketDescriptions(parameters: RequestParameters): BucketDescription[] {
162+
getStaticBucketDescriptions(parameters: RequestParameters, transformer: BucketIdTransformer): BucketDescription[] {
157163
if (this.filter == null) {
158164
// Error in filter clause
159165
return [];
@@ -177,7 +183,7 @@ export class StaticSqlParameterQuery {
177183

178184
return [
179185
{
180-
bucket: getBucketId(this.descriptorName, this.bucketParameters, result),
186+
bucket: getBucketId(this.descriptorName, this.bucketParameters, result, transformer),
181187
priority: this.priority
182188
}
183189
];

packages/sync-rules/src/TableValuedFunctionSqlParameterQuery.ts

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { SqlTools } from './sql_filters.js';
44
import { checkUnsupportedFeatures, isClauseError, isParameterValueClause, sqliteBool } from './sql_support.js';
55
import { TABLE_VALUED_FUNCTIONS, TableValuedFunction } from './TableValuedFunctions.js';
66
import {
7+
BucketIdTransformer,
78
ParameterValueClause,
89
ParameterValueSet,
910
QueryParseOptions,
@@ -202,7 +203,7 @@ export class TableValuedFunctionSqlParameterQuery {
202203
this.errors = options.errors;
203204
}
204205

205-
getStaticBucketDescriptions(parameters: RequestParameters): BucketDescription[] {
206+
getStaticBucketDescriptions(parameters: RequestParameters, transformer: BucketIdTransformer): BucketDescription[] {
206207
if (this.filter == null || this.callClause == null) {
207208
// Error in filter clause
208209
return [];
@@ -212,15 +213,19 @@ export class TableValuedFunctionSqlParameterQuery {
212213
const rows = this.function.call([valueString]);
213214
let total: BucketDescription[] = [];
214215
for (let row of rows) {
215-
const description = this.getIndividualBucketDescription(row, parameters);
216+
const description = this.getIndividualBucketDescription(row, parameters, transformer);
216217
if (description !== null) {
217218
total.push(description);
218219
}
219220
}
220221
return total;
221222
}
222223

223-
private getIndividualBucketDescription(row: SqliteRow, parameters: RequestParameters): BucketDescription | null {
224+
private getIndividualBucketDescription(
225+
row: SqliteRow,
226+
parameters: RequestParameters,
227+
transformer: BucketIdTransformer
228+
): BucketDescription | null {
224229
const mergedParams: ParameterValueSet = {
225230
...parameters,
226231
lookup: (table, column) => {
@@ -247,7 +252,7 @@ export class TableValuedFunctionSqlParameterQuery {
247252
}
248253

249254
return {
250-
bucket: getBucketId(this.descriptorName, this.bucketParameters, result),
255+
bucket: getBucketId(this.descriptorName, this.bucketParameters, result, transformer),
251256
priority: this.priority
252257
};
253258
}

packages/sync-rules/src/streams/stream.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -181,11 +181,10 @@ export class SyncStream implements BucketSource {
181181
return this.data.evaluateRowWithOptions({
182182
table: options.sourceTable,
183183
row: applyRowContext(options.record, this.compatibility),
184-
bucketIdTransformer: options.bucketIdTransformer,
185184
bucketIds() {
186185
const bucketIds: string[] = [];
187186
for (const variant of stream.variants) {
188-
bucketIds.push(...variant.bucketIdsForRow(stream.name, row));
187+
bucketIds.push(...variant.bucketIdsForRow(stream.name, row, options.bucketIdTransformer));
189188
}
190189

191190
return bucketIds;

packages/sync-rules/src/streams/variant.ts

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ export class StreamVariant {
6868
/**
6969
* Given a row in the table this stream selects from, returns all ids of buckets to which that row belongs to.
7070
*/
71-
bucketIdsForRow(streamName: string, options: TableRow): string[] {
72-
return this.instantiationsForRow(options).map((values) => this.buildBucketId(streamName, values));
71+
bucketIdsForRow(streamName: string, options: TableRow, transformer: BucketIdTransformer): string[] {
72+
return this.instantiationsForRow(options).map((values) => this.buildBucketId(streamName, values, transformer));
7373
}
7474

7575
/**
@@ -305,14 +305,15 @@ export class StreamVariant {
305305
*
306306
* @param streamName The name of the stream, included in the bucket id
307307
* @param instantiation An instantiation for all parameters in this variant.
308+
* @param transformer A transformer adding version information to the inner id.
308309
* @returns The generated bucket id
309310
*/
310-
private buildBucketId(streamName: string, instantiation: SqliteJsonValue[]) {
311+
private buildBucketId(streamName: string, instantiation: SqliteJsonValue[], transformer: BucketIdTransformer) {
311312
if (instantiation.length != this.parameters.length) {
312313
throw Error('Internal error, instantiation length mismatch');
313314
}
314315

315-
return `${streamName}|${this.id}${JSONBucketNameSerialize.stringify(instantiation)}`;
316+
return transformer(`${streamName}|${this.id}${JSONBucketNameSerialize.stringify(instantiation)}`);
316317
}
317318

318319
private resolveBucket(
@@ -324,7 +325,7 @@ export class StreamVariant {
324325
return {
325326
definition: stream.name,
326327
inclusion_reasons: [reason],
327-
bucket: bucketIdTransformer(this.buildBucketId(stream.name, instantiation)),
328+
bucket: this.buildBucketId(stream.name, instantiation, bucketIdTransformer),
328329
priority: stream.priority
329330
};
330331
}

packages/sync-rules/src/types.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -298,7 +298,7 @@ export interface InputParameter {
298298
export type BucketIdTransformer = (regularId: string) => string;
299299

300300
export interface EvaluateRowOptions extends TableRow<SqliteInputRow> {
301-
bucketIdTransformer: BucketIdTransformer | null;
301+
bucketIdTransformer: BucketIdTransformer;
302302
}
303303

304304
/**

0 commit comments

Comments
 (0)