Skip to content

Commit f8f432d

Browse files
committed
Merge BucketParameterQuerierSourceDefinition into HydratedBucketSource.
1 parent 68c69e6 commit f8f432d

File tree

11 files changed

+156
-194
lines changed

11 files changed

+156
-194
lines changed

packages/sync-rules/src/BucketSource.ts

Lines changed: 21 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,6 @@ export interface BucketSource {
4949
*/
5050
readonly dataSources: BucketDataSource[];
5151

52-
/**
53-
* BucketParameterQuerierSource describing the parameter queries / stream subqueries in this bucket/stream definition.
54-
*
55-
* The same source could in theory be present in multiple stream definitions.
56-
*/
57-
readonly parameterQuerierSources: BucketParameterQuerierSourceDefinition[];
58-
5952
/**
6053
* BucketParameterLookupSource describing the parameter tables used in this bucket/stream definition.
6154
*
@@ -64,12 +57,26 @@ export interface BucketSource {
6457
readonly parameterIndexLookupCreators: ParameterIndexLookupCreator[];
6558

6659
debugRepresentation(): any;
60+
61+
hydrate(params: CreateSourceParams): HydratedBucketSource;
6762
}
6863

69-
export interface HydratedBucketSource {
70-
readonly definition: BucketSource;
64+
/**
65+
* Internal interface for individual queriers. This is not used on its in the public API directly, apart
66+
* from in HydratedBucketSource. Everywhere else it is just to standardize the internal functions that we re-use.
67+
*/
68+
export interface BucketParameterQuerierSource {
69+
/**
70+
* Reports {@link BucketParameterQuerier}s resolving buckets that a specific stream request should have access to.
71+
*
72+
* @param result The target array to insert queriers and errors into.
73+
* @param options Options, including parameters that may affect the buckets loaded by this source.
74+
*/
75+
pushBucketParameterQueriers(result: PendingQueriers, options: GetQuerierOptions): void;
76+
}
7177

72-
readonly parameterQuerierSources: BucketParameterQuerierSource[];
78+
export interface HydratedBucketSource extends BucketParameterQuerierSource {
79+
readonly definition: BucketSource;
7380
}
7481

7582
export type ScopedEvaluateRow = (options: EvaluateRowOptions) => EvaluationResult[];
@@ -145,38 +152,7 @@ export interface ParameterIndexLookupCreator {
145152
tableSyncsParameters(table: SourceTableInterface): boolean;
146153
}
147154

148-
/**
149-
* Parameter querier source definitions define how to bucket parameter queries are evaluated.
150-
*
151-
* This may use request data only, or it may use parameter lookup data persisted by a BucketParameterLookupSourceDefinition.
152-
*/
153-
export interface BucketParameterQuerierSourceDefinition {
154-
/**
155-
* For debug use only.
156-
*/
157-
readonly bucketParameters: string[];
158-
159-
/**
160-
* The data source linked to this querier. This determines the bucket names that the querier generates.
161-
*
162-
* Note that queriers do not persist data themselves; they only resolve which buckets to load based on request parameters.
163-
*/
164-
readonly querierDataSource: BucketDataSource;
165-
166-
createParameterQuerierSource(params: CreateSourceParams): BucketParameterQuerierSource;
167-
}
168-
169-
export interface BucketParameterQuerierSource {
170-
/**
171-
* Reports {@link BucketParameterQuerier}s resolving buckets that a specific stream request should have access to.
172-
*
173-
* @param result The target array to insert queriers and errors into.
174-
* @param options Options, including parameters that may affect the buckets loaded by this source.
175-
*/
176-
pushBucketParameterQueriers(result: PendingQueriers, options: GetQuerierOptions): void;
177-
}
178-
179-
export interface DebugMergedSource extends BucketParameterQuerierSource {
155+
export interface DebugMergedSource extends HydratedBucketSource {
180156
evaluateRow: ScopedEvaluateRow;
181157
evaluateParameterRow: ScopedEvaluateParameterRow;
182158
}
@@ -247,16 +223,6 @@ export function mergeParameterIndexLookupCreators(
247223
};
248224
}
249225

250-
export function mergeParameterQuerierSources(sources: BucketParameterQuerierSource[]): BucketParameterQuerierSource {
251-
return {
252-
pushBucketParameterQueriers(result: PendingQueriers, options: GetQuerierOptions): void {
253-
for (let source of sources) {
254-
source.pushBucketParameterQueriers(result, options);
255-
}
256-
}
257-
};
258-
}
259-
260226
/**
261227
* For production purposes, we typically need to operate on the different sources separately. However, for debugging,
262228
* it is useful to have a single merged source that can evaluate everything.
@@ -269,12 +235,11 @@ export function debugHydratedMergedSource(bucketSource: BucketSource, params?: C
269235
hydrationState,
270236
bucketSource.parameterIndexLookupCreators
271237
);
272-
const parameterQuerierSource = mergeParameterQuerierSources(
273-
bucketSource.parameterQuerierSources.map((source) => source.createParameterQuerierSource(resolvedParams))
274-
);
238+
const hydratedBucketSource = bucketSource.hydrate(resolvedParams);
275239
return {
240+
definition: bucketSource,
276241
evaluateParameterRow: parameterLookupSource.evaluateParameterRow.bind(parameterLookupSource),
277242
evaluateRow: dataSource.evaluateRow.bind(dataSource),
278-
pushBucketParameterQueriers: parameterQuerierSource.pushBucketParameterQueriers.bind(parameterQuerierSource)
243+
pushBucketParameterQueriers: hydratedBucketSource.pushBucketParameterQueriers.bind(hydratedBucketSource)
279244
};
280245
}

packages/sync-rules/src/HydratedSyncRules.ts

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -66,13 +66,7 @@ export class HydratedSyncRules {
6666
this.compatibility = params.compatibility;
6767
}
6868

69-
for (let definition of this.definition.bucketSources) {
70-
const hydratedBucketSource: HydratedBucketSource = { definition: definition, parameterQuerierSources: [] };
71-
this.bucketSources.push(hydratedBucketSource);
72-
for (let querier of definition.parameterQuerierSources) {
73-
hydratedBucketSource.parameterQuerierSources.push(querier.createParameterQuerierSource(params.createParams));
74-
}
75-
}
69+
this.bucketSources = this.definition.bucketSources.map((source) => source.hydrate(params.createParams));
7670
}
7771

7872
// These methods do not depend on hydration, so we can just forward them to the definition.
@@ -149,9 +143,7 @@ export class HydratedSyncRules {
149143
(source.definition.subscribedToByDefault && options.hasDefaultStreams) ||
150144
source.definition.name in options.streams
151145
) {
152-
for (let querier of source.parameterQuerierSources) {
153-
querier.pushBucketParameterQueriers(pending, options);
154-
}
146+
source.pushBucketParameterQueriers(pending, options);
155147
}
156148
}
157149

packages/sync-rules/src/SqlBucketDescriptor.ts

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,23 @@
1-
import { BucketDataSource, BucketSource, BucketSourceType } from './BucketSource.js';
1+
import { PendingQueriers } from './BucketParameterQuerier.js';
2+
import {
3+
BucketDataSource,
4+
BucketSource,
5+
BucketSourceType,
6+
CreateSourceParams,
7+
HydratedBucketSource
8+
} from './BucketSource.js';
29
import { ColumnDefinition } from './ExpressionType.js';
310
import { IdSequence } from './IdSequence.js';
411
import { SourceTableInterface } from './SourceTableInterface.js';
512
import { SqlDataQuery } from './SqlDataQuery.js';
613
import { SqlParameterQuery } from './SqlParameterQuery.js';
7-
import { SyncRulesOptions } from './SqlSyncRules.js';
14+
import { GetQuerierOptions, SyncRulesOptions } from './SqlSyncRules.js';
815
import { StaticSqlParameterQuery } from './StaticSqlParameterQuery.js';
916
import { TablePattern } from './TablePattern.js';
1017
import { TableValuedFunctionSqlParameterQuery } from './TableValuedFunctionSqlParameterQuery.js';
1118
import { CompatibilityContext } from './compatibility.js';
1219
import { SqlRuleError } from './errors.js';
13-
import { EvaluateRowOptions, QueryParseOptions, UnscopedEvaluationResult, SourceSchema } from './types.js';
20+
import { EvaluateRowOptions, QueryParseOptions, SourceSchema, UnscopedEvaluationResult } from './types.js';
1421

1522
export interface QueryParseResult {
1623
/**
@@ -134,6 +141,27 @@ export class SqlBucketDescriptor implements BucketSource {
134141
})
135142
};
136143
}
144+
145+
hydrate(params: CreateSourceParams): HydratedBucketSource {
146+
const hydratedParameterQueriers = this.parameterQueries.map((querier) =>
147+
querier.createParameterQuerierSource(params)
148+
);
149+
const hydratedGlobalParameterQueriers = this.globalParameterQueries.map((querier) =>
150+
querier.createParameterQuerierSource(params)
151+
);
152+
153+
return {
154+
definition: this,
155+
pushBucketParameterQueriers: (result: PendingQueriers, options: GetQuerierOptions) => {
156+
for (let querier of hydratedParameterQueriers) {
157+
querier.pushBucketParameterQueriers(result, options);
158+
}
159+
for (let querier of hydratedGlobalParameterQueriers) {
160+
querier.pushBucketParameterQueriers(result, options);
161+
}
162+
}
163+
};
164+
}
137165
}
138166

139167
export class BucketDefinitionDataSource implements BucketDataSource {

packages/sync-rules/src/SqlParameterQuery.ts

Lines changed: 5 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,16 @@ import {
77
} from './BucketDescription.js';
88
import {
99
BucketParameterQuerier,
10-
UnscopedParameterLookup,
1110
ParameterLookupSource,
12-
PendingQueriers
11+
PendingQueriers,
12+
UnscopedParameterLookup
1313
} from './BucketParameterQuerier.js';
14-
import {
15-
ParameterIndexLookupCreator,
16-
BucketParameterQuerierSource,
17-
BucketParameterQuerierSourceDefinition,
18-
CreateSourceParams
19-
} from './BucketSource.js';
14+
import { CreateSourceParams, ParameterIndexLookupCreator } from './BucketSource.js';
2015
import { SqlRuleError } from './errors.js';
2116
import { BucketDataScope, ParameterLookupScope } from './HydrationState.js';
2217
import {
2318
BucketDataSource,
19+
BucketParameterQuerierSource,
2420
GetQuerierOptions,
2521
ScopedParameterLookup,
2622
UnscopedEvaluatedParameters,
@@ -34,8 +30,6 @@ import { TablePattern } from './TablePattern.js';
3430
import { TableQuerySchema } from './TableQuerySchema.js';
3531
import { TableValuedFunctionSqlParameterQuery } from './TableValuedFunctionSqlParameterQuery.js';
3632
import {
37-
EvaluatedParameters,
38-
EvaluatedParametersResult,
3933
InputParameter,
4034
ParameterMatchClause,
4135
ParameterValueClause,
@@ -81,7 +75,7 @@ export interface SqlParameterQueryOptions {
8175
* SELECT id as user_id FROM users WHERE users.user_id = token_parameters.user_id
8276
* SELECT id as user_id, token_parameters.is_admin as is_admin FROM users WHERE users.user_id = token_parameters.user_id
8377
*/
84-
export class SqlParameterQuery implements ParameterIndexLookupCreator, BucketParameterQuerierSourceDefinition {
78+
export class SqlParameterQuery implements ParameterIndexLookupCreator {
8579
static fromSql(
8680
descriptorName: string,
8781
sql: string,

packages/sync-rules/src/SqlSyncRules.ts

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,7 @@
11
import { isScalar, LineCounter, parseDocument, Scalar, YAMLMap, YAMLSeq } from 'yaml';
22
import { isValidPriority } from './BucketDescription.js';
33
import { BucketParameterQuerier, QuerierError } from './BucketParameterQuerier.js';
4-
import {
5-
BucketDataSource,
6-
ParameterIndexLookupCreator,
7-
BucketParameterQuerierSourceDefinition,
8-
BucketSource,
9-
CreateSourceParams
10-
} from './BucketSource.js';
4+
import { BucketDataSource, BucketSource, CreateSourceParams, ParameterIndexLookupCreator } from './BucketSource.js';
115
import {
126
CompatibilityContext,
137
CompatibilityEdition,
@@ -16,12 +10,12 @@ import {
1610
} from './compatibility.js';
1711
import { SqlRuleError, SyncRulesErrors, YamlError } from './errors.js';
1812
import { SqlEventDescriptor } from './events/SqlEventDescriptor.js';
13+
import { HydratedSyncRules } from './HydratedSyncRules.js';
1914
import { DEFAULT_HYDRATION_STATE } from './HydrationState.js';
2015
import { validateSyncRulesSchema } from './json_schema.js';
2116
import { SourceTableInterface } from './SourceTableInterface.js';
2217
import { QueryParseResult, SqlBucketDescriptor } from './SqlBucketDescriptor.js';
2318
import { syncStreamFromSql } from './streams/from_sql.js';
24-
import { HydratedSyncRules } from './HydratedSyncRules.js';
2519
import { TablePattern } from './TablePattern.js';
2620
import {
2721
QueryParseOptions,
@@ -91,7 +85,6 @@ export interface GetBucketParameterQuerierResult {
9185
export class SqlSyncRules {
9286
bucketDataSources: BucketDataSource[] = [];
9387
bucketParameterLookupSources: ParameterIndexLookupCreator[] = [];
94-
bucketParameterQuerierSources: BucketParameterQuerierSourceDefinition[] = [];
9588
bucketSources: BucketSource[] = [];
9689

9790
eventDescriptors: SqlEventDescriptor[] = [];
@@ -259,7 +252,6 @@ export class SqlSyncRules {
259252
rules.bucketSources.push(descriptor);
260253
rules.bucketDataSources.push(...descriptor.dataSources);
261254
rules.bucketParameterLookupSources.push(...descriptor.parameterIndexLookupCreators);
262-
rules.bucketParameterQuerierSources.push(...descriptor.parameterQuerierSources);
263255
}
264256

265257
for (const entry of streamMap?.items ?? []) {
@@ -287,7 +279,6 @@ export class SqlSyncRules {
287279
rules.bucketSources.push(parsed);
288280
rules.bucketDataSources.push(...parsed.dataSources);
289281
rules.bucketParameterLookupSources.push(...parsed.parameterIndexLookupCreators);
290-
rules.bucketParameterQuerierSources.push(...parsed.parameterQuerierSources);
291282
return {
292283
parsed: true,
293284
errors

packages/sync-rules/src/StaticSqlParameterQuery.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,10 @@
11
import { SelectFromStatement } from 'pgsql-ast-parser';
22
import { BucketDescription, BucketPriority, DEFAULT_BUCKET_PRIORITY, ResolvedBucket } from './BucketDescription.js';
33
import { BucketParameterQuerier, PendingQueriers } from './BucketParameterQuerier.js';
4-
import {
5-
BucketParameterQuerierSource,
6-
BucketParameterQuerierSourceDefinition,
7-
CreateSourceParams
8-
} from './BucketSource.js';
4+
import { CreateSourceParams } from './BucketSource.js';
95
import { SqlRuleError } from './errors.js';
106
import { BucketDataScope } from './HydrationState.js';
11-
import { BucketDataSource, GetQuerierOptions } from './index.js';
7+
import { BucketDataSource, BucketParameterQuerierSource, GetQuerierOptions } from './index.js';
128
import { SourceTableInterface } from './SourceTableInterface.js';
139
import { AvailableTable, SqlTools } from './sql_filters.js';
1410
import { checkUnsupportedFeatures, isClauseError, sqliteBool } from './sql_support.js';
@@ -35,7 +31,7 @@ export interface StaticSqlParameterQueryOptions {
3531
* SELECT token_parameters.user_id
3632
* SELECT token_parameters.user_id as user_id WHERE token_parameters.is_admin
3733
*/
38-
export class StaticSqlParameterQuery implements BucketParameterQuerierSourceDefinition {
34+
export class StaticSqlParameterQuery {
3935
static fromSql(
4036
descriptorName: string,
4137
sql: string,

packages/sync-rules/src/TableValuedFunctionSqlParameterQuery.ts

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { FromCall, SelectFromStatement } from 'pgsql-ast-parser';
22
import { BucketDescription, BucketPriority, DEFAULT_BUCKET_PRIORITY, ResolvedBucket } from './BucketDescription.js';
3-
import {
4-
BucketParameterQuerierSource,
5-
BucketParameterQuerierSourceDefinition,
6-
CreateSourceParams
7-
} from './BucketSource.js';
3+
import { CreateSourceParams } from './BucketSource.js';
84
import { SqlRuleError } from './errors.js';
95
import { BucketDataScope } from './HydrationState.js';
10-
import { BucketDataSource, BucketParameterQuerier, GetQuerierOptions, PendingQueriers } from './index.js';
6+
import {
7+
BucketDataSource,
8+
BucketParameterQuerier,
9+
BucketParameterQuerierSource,
10+
GetQuerierOptions,
11+
PendingQueriers
12+
} from './index.js';
1113
import { SourceTableInterface } from './SourceTableInterface.js';
1214
import { AvailableTable, SqlTools } from './sql_filters.js';
1315
import { checkUnsupportedFeatures, isClauseError, sqliteBool } from './sql_support.js';
@@ -50,7 +52,7 @@ export interface TableValuedFunctionSqlParameterQueryOptions {
5052
*
5153
* This can currently not be combined with parameter table queries or multiple table-valued functions.
5254
*/
53-
export class TableValuedFunctionSqlParameterQuery implements BucketParameterQuerierSourceDefinition {
55+
export class TableValuedFunctionSqlParameterQuery {
5456
static fromSql(
5557
descriptorName: string,
5658
sql: string,

0 commit comments

Comments
 (0)