@powersync/service-sync-rules 0.29.9 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BaseSqlDataQuery.d.ts +3 -9
- package/dist/BaseSqlDataQuery.js +11 -21
- package/dist/BaseSqlDataQuery.js.map +1 -1
- package/dist/BucketParameterQuerier.d.ts +42 -9
- package/dist/BucketParameterQuerier.js +30 -7
- package/dist/BucketParameterQuerier.js.map +1 -1
- package/dist/BucketSource.d.ts +94 -25
- package/dist/BucketSource.js +67 -0
- package/dist/BucketSource.js.map +1 -1
- package/dist/ExpressionType.d.ts +4 -2
- package/dist/ExpressionType.js.map +1 -1
- package/dist/HydratedSyncRules.d.ts +46 -0
- package/dist/HydratedSyncRules.js +88 -0
- package/dist/HydratedSyncRules.js.map +1 -0
- package/dist/HydrationState.d.ts +45 -0
- package/dist/HydrationState.js +41 -0
- package/dist/HydrationState.js.map +1 -0
- package/dist/SqlBucketDescriptor.d.ts +31 -28
- package/dist/SqlBucketDescriptor.js +89 -112
- package/dist/SqlBucketDescriptor.js.map +1 -1
- package/dist/SqlDataQuery.d.ts +4 -4
- package/dist/SqlDataQuery.js +5 -6
- package/dist/SqlDataQuery.js.map +1 -1
- package/dist/SqlParameterQuery.d.ts +17 -9
- package/dist/SqlParameterQuery.js +49 -23
- package/dist/SqlParameterQuery.js.map +1 -1
- package/dist/SqlSyncRules.d.ts +13 -29
- package/dist/SqlSyncRules.js +48 -77
- package/dist/SqlSyncRules.js.map +1 -1
- package/dist/StaticSqlParameterQuery.d.ts +13 -3
- package/dist/StaticSqlParameterQuery.js +38 -4
- package/dist/StaticSqlParameterQuery.js.map +1 -1
- package/dist/TablePattern.d.ts +4 -1
- package/dist/TablePattern.js +11 -0
- package/dist/TablePattern.js.map +1 -1
- package/dist/TableValuedFunctionSqlParameterQuery.d.ts +14 -4
- package/dist/TableValuedFunctionSqlParameterQuery.js +41 -7
- package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
- package/dist/compatibility.d.ts +23 -1
- package/dist/compatibility.js +32 -4
- package/dist/compatibility.js.map +1 -1
- package/dist/compiler/bucket_resolver.d.ts +70 -0
- package/dist/compiler/bucket_resolver.js +131 -0
- package/dist/compiler/bucket_resolver.js.map +1 -0
- package/dist/compiler/compatibility.d.ts +16 -0
- package/dist/compiler/compatibility.js +12 -0
- package/dist/compiler/compatibility.js.map +1 -0
- package/dist/compiler/compiler.d.ts +104 -0
- package/dist/compiler/compiler.js +113 -0
- package/dist/compiler/compiler.js.map +1 -0
- package/dist/compiler/equality.d.ts +99 -0
- package/dist/compiler/equality.js +284 -0
- package/dist/compiler/equality.js.map +1 -0
- package/dist/compiler/expression.d.ts +77 -0
- package/dist/compiler/expression.js +122 -0
- package/dist/compiler/expression.js.map +1 -0
- package/dist/compiler/filter.d.ts +71 -0
- package/dist/compiler/filter.js +110 -0
- package/dist/compiler/filter.js.map +1 -0
- package/dist/compiler/filter_simplifier.d.ts +26 -0
- package/dist/compiler/filter_simplifier.js +119 -0
- package/dist/compiler/filter_simplifier.js.map +1 -0
- package/dist/compiler/ir_to_sync_plan.d.ts +37 -0
- package/dist/compiler/ir_to_sync_plan.js +163 -0
- package/dist/compiler/ir_to_sync_plan.js.map +1 -0
- package/dist/compiler/parser.d.ts +99 -0
- package/dist/compiler/parser.js +556 -0
- package/dist/compiler/parser.js.map +1 -0
- package/dist/compiler/querier_graph.d.ts +42 -0
- package/dist/compiler/querier_graph.js +365 -0
- package/dist/compiler/querier_graph.js.map +1 -0
- package/dist/compiler/rows.d.ts +113 -0
- package/dist/compiler/rows.js +156 -0
- package/dist/compiler/rows.js.map +1 -0
- package/dist/compiler/scope.d.ts +22 -0
- package/dist/compiler/scope.js +47 -0
- package/dist/compiler/scope.js.map +1 -0
- package/dist/compiler/sqlite.d.ts +77 -0
- package/dist/compiler/sqlite.js +412 -0
- package/dist/compiler/sqlite.js.map +1 -0
- package/dist/compiler/table.d.ts +67 -0
- package/dist/compiler/table.js +67 -0
- package/dist/compiler/table.js.map +1 -0
- package/dist/errors.d.ts +4 -2
- package/dist/errors.js +16 -1
- package/dist/errors.js.map +1 -1
- package/dist/events/SqlEventDescriptor.js +1 -1
- package/dist/events/SqlEventDescriptor.js.map +1 -1
- package/dist/events/SqlEventSourceQuery.d.ts +1 -1
- package/dist/events/SqlEventSourceQuery.js +1 -2
- package/dist/events/SqlEventSourceQuery.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/json_schema.js +5 -1
- package/dist/json_schema.js.map +1 -1
- package/dist/request_functions.js +1 -1
- package/dist/request_functions.js.map +1 -1
- package/dist/schema-generators/SchemaGenerator.d.ts +5 -0
- package/dist/schema-generators/SchemaGenerator.js +21 -14
- package/dist/schema-generators/SchemaGenerator.js.map +1 -1
- package/dist/sql_functions.d.ts +2 -1
- package/dist/sql_functions.js +1 -1
- package/dist/sql_functions.js.map +1 -1
- package/dist/streams/filter.d.ts +34 -4
- package/dist/streams/filter.js +93 -23
- package/dist/streams/filter.js.map +1 -1
- package/dist/streams/from_sql.js +2 -5
- package/dist/streams/from_sql.js.map +1 -1
- package/dist/streams/parameter.d.ts +7 -6
- package/dist/streams/stream.d.ts +25 -15
- package/dist/streams/stream.js +59 -87
- package/dist/streams/stream.js.map +1 -1
- package/dist/streams/variant.d.ts +14 -21
- package/dist/streams/variant.js +68 -46
- package/dist/streams/variant.js.map +1 -1
- package/dist/sync_plan/engine/javascript.d.ts +6 -0
- package/dist/sync_plan/engine/javascript.js +208 -0
- package/dist/sync_plan/engine/javascript.js.map +1 -0
- package/dist/sync_plan/engine/scalar_expression_engine.d.ts +48 -0
- package/dist/sync_plan/engine/scalar_expression_engine.js +99 -0
- package/dist/sync_plan/engine/scalar_expression_engine.js.map +1 -0
- package/dist/sync_plan/engine/sqlite.d.ts +12 -0
- package/dist/sync_plan/engine/sqlite.js +53 -0
- package/dist/sync_plan/engine/sqlite.js.map +1 -0
- package/dist/sync_plan/evaluator/bucket_data_source.d.ts +23 -0
- package/dist/sync_plan/evaluator/bucket_data_source.js +137 -0
- package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -0
- package/dist/sync_plan/evaluator/bucket_source.d.ts +19 -0
- package/dist/sync_plan/evaluator/bucket_source.js +145 -0
- package/dist/sync_plan/evaluator/bucket_source.js.map +1 -0
- package/dist/sync_plan/evaluator/index.d.ts +7 -0
- package/dist/sync_plan/evaluator/index.js +26 -0
- package/dist/sync_plan/evaluator/index.js.map +1 -0
- package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +138 -0
- package/dist/sync_plan/evaluator/parameter_evaluator.js +359 -0
- package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -0
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +19 -0
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +62 -0
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -0
- package/dist/sync_plan/expression.d.ts +109 -0
- package/dist/sync_plan/expression.js +85 -0
- package/dist/sync_plan/expression.js.map +1 -0
- package/dist/sync_plan/expression_to_sql.d.ts +43 -0
- package/dist/sync_plan/expression_to_sql.js +190 -0
- package/dist/sync_plan/expression_to_sql.js.map +1 -0
- package/dist/sync_plan/expression_visitor.d.ts +57 -0
- package/dist/sync_plan/expression_visitor.js +181 -0
- package/dist/sync_plan/expression_visitor.js.map +1 -0
- package/dist/sync_plan/plan.d.ts +196 -0
- package/dist/sync_plan/plan.js +2 -0
- package/dist/sync_plan/plan.js.map +1 -0
- package/dist/sync_plan/schema_inference.d.ts +15 -0
- package/dist/sync_plan/schema_inference.js +121 -0
- package/dist/sync_plan/schema_inference.js.map +1 -0
- package/dist/sync_plan/serialize.d.ts +82 -0
- package/dist/sync_plan/serialize.js +209 -0
- package/dist/sync_plan/serialize.js.map +1 -0
- package/dist/types/custom_sqlite_value.d.ts +1 -1
- package/dist/types/time.d.ts +24 -5
- package/dist/types/time.js +67 -12
- package/dist/types/time.js.map +1 -1
- package/dist/types.d.ts +52 -24
- package/dist/types.js +4 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +9 -2
- package/dist/utils.js +26 -3
- package/dist/utils.js.map +1 -1
- package/package.json +4 -3
- package/schema/sync_rules.json +9 -0
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { BucketInclusionReason } from '../BucketDescription.js';
|
|
2
2
|
import { BucketParameterQuerier } from '../BucketParameterQuerier.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { BucketDataSource, BucketParameterQuerierSource, ParameterIndexLookupCreator } from '../BucketSource.js';
|
|
4
|
+
import { BucketDataScope } from '../HydrationState.js';
|
|
5
|
+
import { CreateSourceParams, ScopedParameterLookup } from '../index.js';
|
|
6
|
+
import { RequestParameters, SqliteJsonValue, TableRow } from '../types.js';
|
|
5
7
|
import { BucketParameter, SubqueryEvaluator } from './parameter.js';
|
|
6
8
|
import { SyncStream } from './stream.js';
|
|
7
9
|
/**
|
|
@@ -44,10 +46,12 @@ export declare class StreamVariant {
|
|
|
44
46
|
*/
|
|
45
47
|
requestFilters: RequestFilter[];
|
|
46
48
|
constructor(id: number);
|
|
49
|
+
defaultBucketPrefix(streamName: string): string;
|
|
50
|
+
indexLookupCreators(): ParameterIndexLookupCreator[];
|
|
47
51
|
/**
|
|
48
52
|
* Given a row in the table this stream selects from, returns all ids of buckets to which that row belongs to.
|
|
49
53
|
*/
|
|
50
|
-
|
|
54
|
+
bucketParametersForRow(options: TableRow): string[];
|
|
51
55
|
/**
|
|
52
56
|
* Given a row to evaluate, returns all instantiations of parameters that satisfy conditions.
|
|
53
57
|
*
|
|
@@ -62,23 +66,8 @@ export declare class StreamVariant {
|
|
|
62
66
|
* @returns Each instantiation, with each sub-array having a value for a parameter.
|
|
63
67
|
*/
|
|
64
68
|
private cartesianProductOfParameterInstantiations;
|
|
65
|
-
|
|
66
|
-
querier(stream: SyncStream, reason: BucketInclusionReason, params: RequestParameters, bucketIdTransformer: BucketIdTransformer): BucketParameterQuerier | null;
|
|
69
|
+
querier(stream: SyncStream, reason: BucketInclusionReason, params: RequestParameters, bucketScope: BucketDataScope, hydratedSubqueries: HydratedSubqueries): BucketParameterQuerier | null;
|
|
67
70
|
findStaticInstantiations(params: RequestParameters): SqliteJsonValue[][];
|
|
68
|
-
/**
|
|
69
|
-
* Creates lookup indices for dynamically-resolved parameters.
|
|
70
|
-
*
|
|
71
|
-
* Resolving dynamic parameters is a two-step process: First, for tables referenced in subqueries, we create an index
|
|
72
|
-
* to resolve which request parameters would match rows in subqueries. Then, when resolving bucket ids for a request,
|
|
73
|
-
* we compute subquery results by looking up results in that index.
|
|
74
|
-
*
|
|
75
|
-
* This implements the first step of that process.
|
|
76
|
-
*
|
|
77
|
-
* @param result The array into which evaluation results should be written to.
|
|
78
|
-
* @param sourceTable A table we depend on in a subquery.
|
|
79
|
-
* @param row Row data to index.
|
|
80
|
-
*/
|
|
81
|
-
pushParameterRowEvaluation(result: EvaluatedParametersResult[], sourceTable: SourceTableInterface, row: SqliteRow): void;
|
|
82
71
|
debugRepresentation(): any;
|
|
83
72
|
/**
|
|
84
73
|
* Replaces {@link StreamVariant.parameters} with static values looked up in request parameters.
|
|
@@ -90,13 +79,15 @@ export declare class StreamVariant {
|
|
|
90
79
|
/**
|
|
91
80
|
* Builds a bucket id for an instantiation, like `stream|0[1,2,"foo"]`.
|
|
92
81
|
*
|
|
93
|
-
* @param
|
|
82
|
+
* @param bucketPrefix The name of the the bucket, excluding parameters
|
|
94
83
|
* @param instantiation An instantiation for all parameters in this variant.
|
|
95
84
|
* @param transformer A transformer adding version information to the inner id.
|
|
96
85
|
* @returns The generated bucket id
|
|
97
86
|
*/
|
|
98
|
-
private
|
|
87
|
+
private serializeBucketParameters;
|
|
99
88
|
private resolveBucket;
|
|
89
|
+
createParameterQuerierSource(params: CreateSourceParams, stream: SyncStream, querierDataSource: BucketDataSource): BucketParameterQuerierSource;
|
|
90
|
+
private queriersForSubscription;
|
|
100
91
|
}
|
|
101
92
|
/**
|
|
102
93
|
* A stateless filter condition that only depends on the request itself, e.g. `WHERE token_parameters.is_admin`.
|
|
@@ -120,3 +111,5 @@ export interface SubqueryRequestFilter {
|
|
|
120
111
|
matches(params: RequestParameters, results: SqliteJsonValue[]): boolean;
|
|
121
112
|
}
|
|
122
113
|
export type RequestFilter = StaticRequestFilter | SubqueryRequestFilter;
|
|
114
|
+
type HydratedSubqueries = Map<SubqueryEvaluator, (params: RequestParameters) => ScopedParameterLookup[]>;
|
|
115
|
+
export {};
|
package/dist/streams/variant.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { isJsonValue, JSONBucketNameSerialize } from '../utils.js';
|
|
1
|
+
import { buildBucketName, isJsonValue, JSONBucketNameSerialize } from '../utils.js';
|
|
2
2
|
import { cartesianProduct } from './utils.js';
|
|
3
3
|
/**
|
|
4
4
|
* A variant of a stream.
|
|
@@ -46,11 +46,17 @@ export class StreamVariant {
|
|
|
46
46
|
this.additionalRowFilters = [];
|
|
47
47
|
this.requestFilters = [];
|
|
48
48
|
}
|
|
49
|
+
defaultBucketPrefix(streamName) {
|
|
50
|
+
return `${streamName}|${this.id}`;
|
|
51
|
+
}
|
|
52
|
+
indexLookupCreators() {
|
|
53
|
+
return this.subqueries.flatMap((subquery) => subquery.indexLookupCreators());
|
|
54
|
+
}
|
|
49
55
|
/**
|
|
50
56
|
* Given a row in the table this stream selects from, returns all ids of buckets to which that row belongs to.
|
|
51
57
|
*/
|
|
52
|
-
|
|
53
|
-
return this.instantiationsForRow(options).map((values) => this.
|
|
58
|
+
bucketParametersForRow(options) {
|
|
59
|
+
return this.instantiationsForRow(options).map((values) => this.serializeBucketParameters(values));
|
|
54
60
|
}
|
|
55
61
|
/**
|
|
56
62
|
* Given a row to evaluate, returns all instantiations of parameters that satisfy conditions.
|
|
@@ -89,10 +95,7 @@ export class StreamVariant {
|
|
|
89
95
|
cartesianProductOfParameterInstantiations(instantiations) {
|
|
90
96
|
return [...cartesianProduct(...instantiations)];
|
|
91
97
|
}
|
|
92
|
-
|
|
93
|
-
return this.requestFilters.some((f) => f.type == 'dynamic');
|
|
94
|
-
}
|
|
95
|
-
querier(stream, reason, params, bucketIdTransformer) {
|
|
98
|
+
querier(stream, reason, params, bucketScope, hydratedSubqueries) {
|
|
96
99
|
const instantiation = this.partiallyEvaluateParameters(params);
|
|
97
100
|
if (instantiation == null) {
|
|
98
101
|
return null;
|
|
@@ -111,21 +114,24 @@ export class StreamVariant {
|
|
|
111
114
|
}
|
|
112
115
|
}
|
|
113
116
|
for (const subquery of this.subqueries) {
|
|
114
|
-
|
|
117
|
+
const subqueryLookup = hydratedSubqueries.get(subquery);
|
|
118
|
+
if (subqueryLookup == null) {
|
|
119
|
+
throw new Error('Internal error, missing subquery lookup');
|
|
120
|
+
}
|
|
121
|
+
subqueryToLookups.set(subquery, subqueryLookup(params));
|
|
115
122
|
}
|
|
116
123
|
const staticBuckets = [];
|
|
117
124
|
if (dynamicParameters.length == 0 && dynamicRequestFilters.length == 0) {
|
|
118
125
|
// When we have no dynamic parameters, the partial evaluation is a full instantiation.
|
|
119
126
|
const instantiations = this.cartesianProductOfParameterInstantiations(instantiation);
|
|
120
127
|
for (const instantiation of instantiations) {
|
|
121
|
-
staticBuckets.push(this.resolveBucket(stream, instantiation, reason,
|
|
128
|
+
staticBuckets.push(this.resolveBucket(stream, instantiation, reason, bucketScope));
|
|
122
129
|
}
|
|
123
130
|
}
|
|
124
131
|
const variant = this;
|
|
125
132
|
return {
|
|
126
133
|
staticBuckets: staticBuckets,
|
|
127
134
|
hasDynamicBuckets: this.subqueries.length != 0,
|
|
128
|
-
parameterQueryLookups: [...subqueryToLookups.values()].flatMap((f) => f),
|
|
129
135
|
async queryDynamicBucketDescriptions(source) {
|
|
130
136
|
// Evaluate subqueries
|
|
131
137
|
const subqueryResults = new Map();
|
|
@@ -156,7 +162,7 @@ export class StreamVariant {
|
|
|
156
162
|
perParameterInstantiation[lookup.index] = subqueryResults.get(lookup.subquery);
|
|
157
163
|
}
|
|
158
164
|
const product = variant.cartesianProductOfParameterInstantiations(perParameterInstantiation);
|
|
159
|
-
return Promise.resolve(product.map((e) => variant.resolveBucket(stream, e, reason,
|
|
165
|
+
return Promise.resolve(product.map((e) => variant.resolveBucket(stream, e, reason, bucketScope)));
|
|
160
166
|
}
|
|
161
167
|
};
|
|
162
168
|
}
|
|
@@ -168,36 +174,6 @@ export class StreamVariant {
|
|
|
168
174
|
// This will be an array of values (i.e. a total evaluation) because there are no dynamic parameters.
|
|
169
175
|
this.partiallyEvaluateParameters(params));
|
|
170
176
|
}
|
|
171
|
-
/**
|
|
172
|
-
* Creates lookup indices for dynamically-resolved parameters.
|
|
173
|
-
*
|
|
174
|
-
* Resolving dynamic parameters is a two-step process: First, for tables referenced in subqueries, we create an index
|
|
175
|
-
* to resolve which request parameters would match rows in subqueries. Then, when resolving bucket ids for a request,
|
|
176
|
-
* we compute subquery results by looking up results in that index.
|
|
177
|
-
*
|
|
178
|
-
* This implements the first step of that process.
|
|
179
|
-
*
|
|
180
|
-
* @param result The array into which evaluation results should be written to.
|
|
181
|
-
* @param sourceTable A table we depend on in a subquery.
|
|
182
|
-
* @param row Row data to index.
|
|
183
|
-
*/
|
|
184
|
-
pushParameterRowEvaluation(result, sourceTable, row) {
|
|
185
|
-
for (const subquery of this.subqueries) {
|
|
186
|
-
if (subquery.parameterTable.matches(sourceTable)) {
|
|
187
|
-
const lookups = subquery.lookupsForParameterRow(sourceTable, row);
|
|
188
|
-
if (lookups == null) {
|
|
189
|
-
continue;
|
|
190
|
-
}
|
|
191
|
-
// The row of the subquery. Since we only support subqueries with a single column, we unconditionally name the
|
|
192
|
-
// column `result` for simplicity.
|
|
193
|
-
const resultRow = { result: lookups.value };
|
|
194
|
-
result.push(...lookups.lookups.map((l) => ({
|
|
195
|
-
lookup: l,
|
|
196
|
-
bucketParameters: [resultRow]
|
|
197
|
-
})));
|
|
198
|
-
}
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
177
|
debugRepresentation() {
|
|
202
178
|
return {
|
|
203
179
|
id: this.id,
|
|
@@ -244,24 +220,70 @@ export class StreamVariant {
|
|
|
244
220
|
/**
|
|
245
221
|
* Builds a bucket id for an instantiation, like `stream|0[1,2,"foo"]`.
|
|
246
222
|
*
|
|
247
|
-
* @param
|
|
223
|
+
* @param bucketPrefix The name of the the bucket, excluding parameters
|
|
248
224
|
* @param instantiation An instantiation for all parameters in this variant.
|
|
249
225
|
* @param transformer A transformer adding version information to the inner id.
|
|
250
226
|
* @returns The generated bucket id
|
|
251
227
|
*/
|
|
252
|
-
|
|
228
|
+
serializeBucketParameters(instantiation) {
|
|
253
229
|
if (instantiation.length != this.parameters.length) {
|
|
254
230
|
throw Error('Internal error, instantiation length mismatch');
|
|
255
231
|
}
|
|
256
|
-
return
|
|
232
|
+
return JSONBucketNameSerialize.stringify(instantiation);
|
|
257
233
|
}
|
|
258
|
-
resolveBucket(stream, instantiation, reason,
|
|
234
|
+
resolveBucket(stream, instantiation, reason, bucketScope) {
|
|
259
235
|
return {
|
|
260
236
|
definition: stream.name,
|
|
261
237
|
inclusion_reasons: [reason],
|
|
262
|
-
bucket: this.
|
|
238
|
+
bucket: buildBucketName(bucketScope, this.serializeBucketParameters(instantiation)),
|
|
263
239
|
priority: stream.priority
|
|
264
240
|
};
|
|
265
241
|
}
|
|
242
|
+
createParameterQuerierSource(params, stream, querierDataSource) {
|
|
243
|
+
const hydrationState = params.hydrationState;
|
|
244
|
+
const bucketScope = hydrationState.getBucketSourceScope(querierDataSource);
|
|
245
|
+
const hydratedSubqueries = new Map(this.subqueries.map((s) => [s, s.hydrateLookupsForRequest(hydrationState)]));
|
|
246
|
+
return {
|
|
247
|
+
pushBucketParameterQueriers: (result, options) => {
|
|
248
|
+
const subscriptions = options.streams[stream.name] ?? [];
|
|
249
|
+
if (!stream.subscribedToByDefault && !subscriptions.length) {
|
|
250
|
+
// The client is not subscribing to this stream, so don't query buckets related to it.
|
|
251
|
+
return;
|
|
252
|
+
}
|
|
253
|
+
let hasExplicitDefaultSubscription = false;
|
|
254
|
+
for (const subscription of subscriptions) {
|
|
255
|
+
let subscriptionParams = options.globalParameters;
|
|
256
|
+
if (subscription.parameters != null) {
|
|
257
|
+
subscriptionParams = subscriptionParams.withAddedStreamParameters(subscription.parameters);
|
|
258
|
+
}
|
|
259
|
+
else {
|
|
260
|
+
hasExplicitDefaultSubscription = true;
|
|
261
|
+
}
|
|
262
|
+
this.queriersForSubscription(stream, result, subscription, subscriptionParams, bucketScope, hydratedSubqueries);
|
|
263
|
+
}
|
|
264
|
+
// If the stream is subscribed to by default and there is no explicit subscription that would match the default
|
|
265
|
+
// subscription, also include the default querier.
|
|
266
|
+
if (stream.subscribedToByDefault && !hasExplicitDefaultSubscription) {
|
|
267
|
+
this.queriersForSubscription(stream, result, null, options.globalParameters, bucketScope, hydratedSubqueries);
|
|
268
|
+
}
|
|
269
|
+
}
|
|
270
|
+
};
|
|
271
|
+
}
|
|
272
|
+
queriersForSubscription(stream, result, subscription, params, bucketScope, hydratedSubqueries) {
|
|
273
|
+
const reason = subscription != null ? { subscription: subscription.opaque_id } : 'default';
|
|
274
|
+
try {
|
|
275
|
+
const querier = this.querier(stream, reason, params, bucketScope, hydratedSubqueries);
|
|
276
|
+
if (querier) {
|
|
277
|
+
result.queriers.push(querier);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
catch (e) {
|
|
281
|
+
result.errors.push({
|
|
282
|
+
descriptor: stream.name,
|
|
283
|
+
message: `Error evaluating bucket ids: ${e.message}`,
|
|
284
|
+
subscription: subscription ?? undefined
|
|
285
|
+
});
|
|
286
|
+
}
|
|
287
|
+
}
|
|
266
288
|
}
|
|
267
289
|
//# sourceMappingURL=variant.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variant.js","sourceRoot":"","sources":["../../src/streams/variant.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"variant.js","sourceRoot":"","sources":["../../src/streams/variant.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { CompatibilityContext } from '../../index.js';
|
|
2
|
+
import { ScalarExpressionEngine } from './scalar_expression_engine.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a {@link ScalarExpressionEngine} implemented by evaluating scalar expressions in JavaScript.
|
|
5
|
+
*/
|
|
6
|
+
export declare function javaScriptExpressionEngine(compatibility: CompatibilityContext): ScalarExpressionEngine;
|
|
@@ -0,0 +1,208 @@
|
|
|
1
|
+
import { compare, generateSqlFunctions, SQLITE_FALSE, SQLITE_TRUE, sqliteBool, sqliteNot } from '../../index.js';
|
|
2
|
+
import { cast, evaluateOperator } from '../../sql_functions.js';
|
|
3
|
+
import { cartesianProduct } from '../../streams/utils.js';
|
|
4
|
+
import { generateTableValuedFunctions } from '../../TableValuedFunctions.js';
|
|
5
|
+
import { visitExpr } from '../expression_visitor.js';
|
|
6
|
+
/**
|
|
7
|
+
* Creates a {@link ScalarExpressionEngine} implemented by evaluating scalar expressions in JavaScript.
|
|
8
|
+
*/
|
|
9
|
+
export function javaScriptExpressionEngine(compatibility) {
|
|
10
|
+
const tableValued = generateTableValuedFunctions(compatibility);
|
|
11
|
+
const regularFunctions = generateSqlFunctions(compatibility);
|
|
12
|
+
const compiler = new ExpressionToJavaScriptFunction({
|
|
13
|
+
named: regularFunctions.named,
|
|
14
|
+
jsonExtractJson: regularFunctions.operatorJsonExtractJson,
|
|
15
|
+
jsonExtractSql: regularFunctions.operatorJsonExtractSql
|
|
16
|
+
});
|
|
17
|
+
return {
|
|
18
|
+
close() { },
|
|
19
|
+
prepareEvaluator({ outputs = [], filters = [], tableValuedFunctions = [] }) {
|
|
20
|
+
function compileScalar(expr) {
|
|
21
|
+
return compiler.compile(expr);
|
|
22
|
+
}
|
|
23
|
+
const resolvedTableValuedFunctions = tableValuedFunctions.map((fn) => {
|
|
24
|
+
const found = tableValued[fn.name];
|
|
25
|
+
if (found == null) {
|
|
26
|
+
throw new Error(`Unknown table-valued function: ${fn.name}`);
|
|
27
|
+
}
|
|
28
|
+
const inputs = fn.inputs.map(compileScalar);
|
|
29
|
+
return {
|
|
30
|
+
original: fn,
|
|
31
|
+
evaluate: (input) => {
|
|
32
|
+
return found.call(inputs.map((f) => f(input)));
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
});
|
|
36
|
+
const columns = outputs.map(compileScalar);
|
|
37
|
+
const compiledFilters = filters.map(compileScalar);
|
|
38
|
+
return {
|
|
39
|
+
evaluate(inputs) {
|
|
40
|
+
// First, evaluate table-valued functions (if any).
|
|
41
|
+
const perFunctionResults = [];
|
|
42
|
+
for (const { original, evaluate } of resolvedTableValuedFunctions) {
|
|
43
|
+
perFunctionResults.push(evaluate({ inputs }).map((row) => [original, row]));
|
|
44
|
+
}
|
|
45
|
+
const rows = [];
|
|
46
|
+
// We're doing an inner join on all table-valued functions, which we implement as a cross join on which each
|
|
47
|
+
// filter is evaluated. Having more than one table-valued function per statement would be very rare in
|
|
48
|
+
// practice.
|
|
49
|
+
row: for (const sourceRow of cartesianProduct(...perFunctionResults)) {
|
|
50
|
+
const byFunction = new Map();
|
|
51
|
+
for (const [fn, output] of sourceRow) {
|
|
52
|
+
byFunction.set(fn, output);
|
|
53
|
+
}
|
|
54
|
+
const input = { inputs, row: byFunction };
|
|
55
|
+
for (const filter of compiledFilters) {
|
|
56
|
+
if (!sqliteBool(filter(input))) {
|
|
57
|
+
continue row;
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
rows.push(columns.map((c) => c(input)));
|
|
61
|
+
}
|
|
62
|
+
return rows;
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
class ExpressionToJavaScriptFunction {
|
|
69
|
+
functions;
|
|
70
|
+
constructor(functions) {
|
|
71
|
+
this.functions = functions;
|
|
72
|
+
}
|
|
73
|
+
compile(expr) {
|
|
74
|
+
return visitExpr(this, expr, null);
|
|
75
|
+
}
|
|
76
|
+
visitExternalData(expr, arg) {
|
|
77
|
+
if (typeof expr.source === 'number') {
|
|
78
|
+
const index = expr.source;
|
|
79
|
+
// -1 because variables in SQLite are 1-indexed.
|
|
80
|
+
return ({ inputs }) => inputs[index - 1];
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const { column, function: fn } = expr.source;
|
|
84
|
+
return ({ row }) => {
|
|
85
|
+
const result = row.get(fn);
|
|
86
|
+
return result[column];
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
visitUnaryExpression(expr) {
|
|
91
|
+
const operand = this.compile(expr.operand);
|
|
92
|
+
switch (expr.operator) {
|
|
93
|
+
case '+':
|
|
94
|
+
return operand;
|
|
95
|
+
case 'not':
|
|
96
|
+
return (input) => sqliteNot(operand(input));
|
|
97
|
+
// case '~':
|
|
98
|
+
// case '-':
|
|
99
|
+
// throw new Error(`unary operator not supported: ${expr.operator}`);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
visitBinaryExpression(expr) {
|
|
103
|
+
const left = this.compile(expr.left);
|
|
104
|
+
const right = this.compile(expr.right);
|
|
105
|
+
const operator = expr.operator.toUpperCase();
|
|
106
|
+
return (input) => evaluateOperator(operator, left(input), right(input));
|
|
107
|
+
}
|
|
108
|
+
visitBetweenExpression(expr) {
|
|
109
|
+
const low = this.compile(expr.low);
|
|
110
|
+
const high = this.compile(expr.high);
|
|
111
|
+
const value = this.compile(expr.value);
|
|
112
|
+
return (input) => {
|
|
113
|
+
const evaluatedValue = value(input);
|
|
114
|
+
const geqLow = evaluateOperator('>=', evaluatedValue, low(input));
|
|
115
|
+
const leqHigh = evaluateOperator('<=', evaluatedValue, high(input));
|
|
116
|
+
if (geqLow == null || leqHigh == null) {
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
return sqliteBool(geqLow) && sqliteBool(leqHigh);
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
visitScalarInExpression(expr) {
|
|
123
|
+
const target = this.compile(expr.target);
|
|
124
|
+
const inQuery = expr.in.map((q) => this.compile(q));
|
|
125
|
+
return (input) => {
|
|
126
|
+
const evaluatedTarget = target(input);
|
|
127
|
+
if (evaluatedTarget == null) {
|
|
128
|
+
return null;
|
|
129
|
+
}
|
|
130
|
+
let hasNullQuery = false;
|
|
131
|
+
for (const q of inQuery) {
|
|
132
|
+
const evaluated = q(input);
|
|
133
|
+
if (evaluated == null) {
|
|
134
|
+
hasNullQuery = true;
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
if (compare(evaluatedTarget, evaluated) == 0) {
|
|
138
|
+
return SQLITE_TRUE;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
return hasNullQuery ? null : SQLITE_FALSE;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
visitCaseWhenExpression(expr) {
|
|
145
|
+
const compiledWhens = expr.whens.map((w) => ({ when: this.compile(w.when), then: this.compile(w.then) }));
|
|
146
|
+
const compiledElse = expr.else && this.compile(expr.else);
|
|
147
|
+
if (expr.operand) {
|
|
148
|
+
const operand = this.compile(expr.operand);
|
|
149
|
+
return (input) => {
|
|
150
|
+
const evaluatedOperand = operand(input);
|
|
151
|
+
for (const { when, then } of compiledWhens) {
|
|
152
|
+
if (evaluateOperator('=', evaluatedOperand, when(input))) {
|
|
153
|
+
return then(input);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return compiledElse ? compiledElse(input) : null;
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
else {
|
|
160
|
+
return (input) => {
|
|
161
|
+
for (const { when, then } of compiledWhens) {
|
|
162
|
+
if (sqliteBool(when(input))) {
|
|
163
|
+
return then(input);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return compiledElse ? compiledElse(input) : null;
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
visitCastExpression(expr) {
|
|
171
|
+
const operand = this.compile(expr.operand);
|
|
172
|
+
return (input) => {
|
|
173
|
+
return cast(operand(input), expr.cast_as);
|
|
174
|
+
};
|
|
175
|
+
}
|
|
176
|
+
visitScalarFunctionCallExpression(expr) {
|
|
177
|
+
let fnImpl;
|
|
178
|
+
if (expr.function === '->') {
|
|
179
|
+
fnImpl = this.functions.jsonExtractJson;
|
|
180
|
+
}
|
|
181
|
+
else if (expr.function === '->>') {
|
|
182
|
+
fnImpl = this.functions.jsonExtractSql;
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
fnImpl = this.functions.named[expr.function];
|
|
186
|
+
if (!fnImpl) {
|
|
187
|
+
throw new Error(`Function not implemented: ${expr.function}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
const args = expr.parameters.map((p) => this.compile(p));
|
|
191
|
+
return (input) => {
|
|
192
|
+
return fnImpl.call(...args.map((f) => f(input)));
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
visitLiteralExpression(expr) {
|
|
196
|
+
switch (expr.type) {
|
|
197
|
+
case 'lit_null':
|
|
198
|
+
return () => null;
|
|
199
|
+
case 'lit_double':
|
|
200
|
+
return () => expr.value;
|
|
201
|
+
case 'lit_int':
|
|
202
|
+
return () => BigInt(expr.base10);
|
|
203
|
+
case 'lit_string':
|
|
204
|
+
return () => expr.value;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
//# sourceMappingURL=javascript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"javascript.js","sourceRoot":"","sources":["../../../src/sync_plan/engine/javascript.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { SqliteValue } from '../../types.js';
|
|
2
|
+
import { SqlExpression } from '../expression.js';
|
|
3
|
+
import { SqlParameterValue } from '../plan.js';
|
|
4
|
+
/**
|
|
5
|
+
* Description of a scalar SQL statement (without external dependencies on tables).
|
|
6
|
+
*
|
|
7
|
+
* This corresponds to the SQL statement `SELECT $outputs FROM $tableValuedFunctions WHERE $filters`.
|
|
8
|
+
*
|
|
9
|
+
* Each output and filter expression can reference:
|
|
10
|
+
*
|
|
11
|
+
* 1. An external parameter, passed in {@link ScalarExpressionEvaluator.evaluate}. The number corresponds to the index
|
|
12
|
+
* of the parameter to use.
|
|
13
|
+
* 2. An output column of a table-valued function added to the statement.
|
|
14
|
+
*/
|
|
15
|
+
export interface ScalarStatement {
|
|
16
|
+
outputs?: SqlExpression<number | TableValuedFunctionOutput>[];
|
|
17
|
+
filters?: SqlExpression<number | TableValuedFunctionOutput>[];
|
|
18
|
+
tableValuedFunctions?: TableValuedFunction[];
|
|
19
|
+
}
|
|
20
|
+
export interface TableValuedFunction {
|
|
21
|
+
name: string;
|
|
22
|
+
inputs: SqlExpression<number>[];
|
|
23
|
+
}
|
|
24
|
+
export interface TableValuedFunctionOutput {
|
|
25
|
+
function: TableValuedFunction;
|
|
26
|
+
column: string;
|
|
27
|
+
}
|
|
28
|
+
export interface ScalarExpressionEngine {
|
|
29
|
+
prepareEvaluator(statement: ScalarStatement): ScalarExpressionEvaluator;
|
|
30
|
+
/**
|
|
31
|
+
* Disposes all evaluators and closes this engine.
|
|
32
|
+
*/
|
|
33
|
+
close(): void;
|
|
34
|
+
}
|
|
35
|
+
export interface ScalarExpressionEvaluator {
|
|
36
|
+
evaluate(inputs: SqliteValue[]): SqliteValue[][];
|
|
37
|
+
}
|
|
38
|
+
export declare function scalarStatementToSql({ filters, outputs, tableValuedFunctions }: ScalarStatement): string;
|
|
39
|
+
/**
|
|
40
|
+
* Utility to transform multiple expressions embedding parameter values into expressions that reference a parameter
|
|
41
|
+
* index representing that value.
|
|
42
|
+
*
|
|
43
|
+
* Parameter values used multiple times are de-duplicated into the same SQL parameter.
|
|
44
|
+
*/
|
|
45
|
+
export declare function mapExternalDataToInstantiation<T extends SqlParameterValue>(): {
|
|
46
|
+
instantiation: T[];
|
|
47
|
+
transform(expr: SqlExpression<SqlParameterValue>): SqlExpression<number>;
|
|
48
|
+
};
|