@powersync/service-sync-rules 0.34.1 → 0.36.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/README.md +3 -3
- package/dist/BaseSqlDataQuery.d.ts +1 -1
- package/dist/BucketDescription.d.ts +3 -2
- package/dist/BucketParameterQuerier.d.ts +23 -1
- package/dist/BucketParameterQuerier.js +24 -0
- package/dist/BucketParameterQuerier.js.map +1 -1
- package/dist/BucketSource.d.ts +1 -1
- package/dist/HydratedSyncRules.d.ts +2 -2
- package/dist/HydratedSyncRules.js +1 -1
- package/dist/HydratedSyncRules.js.map +1 -1
- package/dist/HydrationState.d.ts +9 -5
- package/dist/HydrationState.js +3 -3
- package/dist/HydrationState.js.map +1 -1
- package/dist/SqlDataQuery.d.ts +1 -1
- package/dist/SqlParameterQuery.js +3 -1
- package/dist/SqlParameterQuery.js.map +1 -1
- package/dist/SqlSyncRules.d.ts +9 -2
- package/dist/SqlSyncRules.js +1 -1
- package/dist/SqlSyncRules.js.map +1 -1
- package/dist/StorageVersion.d.ts +27 -0
- package/dist/StorageVersion.js +17 -0
- package/dist/StorageVersion.js.map +1 -0
- package/dist/SyncConfig.d.ts +9 -3
- package/dist/SyncConfig.js +9 -3
- package/dist/SyncConfig.js.map +1 -1
- package/dist/TableValuedFunctions.js +1 -0
- package/dist/TableValuedFunctions.js.map +1 -1
- package/dist/compiler/bucket_resolver.d.ts +1 -1
- package/dist/compiler/bucket_resolver.js +1 -1
- package/dist/compiler/bucket_resolver.js.map +1 -1
- package/dist/compiler/compiler.d.ts +4 -4
- package/dist/compiler/compiler.js +3 -3
- package/dist/compiler/compiler.js.map +1 -1
- package/dist/compiler/equality.d.ts +2 -0
- package/dist/compiler/equality.js +35 -0
- package/dist/compiler/equality.js.map +1 -1
- package/dist/compiler/expression.d.ts +4 -4
- package/dist/compiler/expression.js +2 -2
- package/dist/compiler/expression.js.map +1 -1
- package/dist/compiler/filter.d.ts +2 -2
- package/dist/compiler/filter.js +1 -1
- package/dist/compiler/filter.js.map +1 -1
- package/dist/compiler/filter_simplifier.d.ts +2 -2
- package/dist/compiler/filter_simplifier.js +2 -2
- package/dist/compiler/filter_simplifier.js.map +1 -1
- package/dist/compiler/ir_to_sync_plan.js +1 -1
- package/dist/compiler/ir_to_sync_plan.js.map +1 -1
- package/dist/compiler/parser.d.ts +5 -5
- package/dist/compiler/parser.js +12 -10
- package/dist/compiler/parser.js.map +1 -1
- package/dist/compiler/querier_graph.d.ts +1 -1
- package/dist/compiler/querier_graph.js +15 -4
- package/dist/compiler/querier_graph.js.map +1 -1
- package/dist/compiler/rows.d.ts +2 -2
- package/dist/compiler/rows.js +1 -1
- package/dist/compiler/rows.js.map +1 -1
- package/dist/compiler/scope.d.ts +3 -3
- package/dist/compiler/scope.js +2 -1
- package/dist/compiler/scope.js.map +1 -1
- package/dist/compiler/sqlite.d.ts +6 -2
- package/dist/compiler/sqlite.js +1 -1
- package/dist/compiler/sqlite.js.map +1 -1
- package/dist/compiler/table.d.ts +28 -2
- package/dist/compiler/table.js +76 -0
- package/dist/compiler/table.js.map +1 -1
- package/dist/events/SqlEventDescriptor.d.ts +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.map +1 -1
- package/dist/from_yaml.d.ts +1 -1
- package/dist/from_yaml.js +79 -22
- package/dist/from_yaml.js.map +1 -1
- package/dist/index.d.ts +9 -8
- package/dist/index.js +9 -8
- package/dist/index.js.map +1 -1
- package/dist/json_schema.js +7 -0
- package/dist/json_schema.js.map +1 -1
- package/dist/schema-generators/DartSchemaGenerator.js.map +1 -1
- package/dist/schema-generators/DotNetSchemaGenerator.d.ts +1 -1
- package/dist/schema-generators/DotNetSchemaGenerator.js.map +1 -1
- package/dist/schema-generators/JsLegacySchemaGenerator.js.map +1 -1
- package/dist/schema-generators/KotlinSchemaGenerator.js.map +1 -1
- package/dist/schema-generators/SchemaGenerator.d.ts +1 -1
- package/dist/schema-generators/SchemaGenerator.js.map +1 -1
- package/dist/schema-generators/TsSchemaGenerator.js.map +1 -1
- package/dist/schema-generators/generators.d.ts +1 -1
- package/dist/schema-generators/generators.js +1 -1
- package/dist/schema-generators/generators.js.map +1 -1
- package/dist/schema-generators/schema-generators.js.map +1 -1
- package/dist/sql_filters.d.ts +1 -1
- package/dist/sql_filters.js +1 -1
- package/dist/sql_filters.js.map +1 -1
- package/dist/sql_functions.d.ts +1 -1
- package/dist/sql_functions.js +3 -3
- package/dist/sql_functions.js.map +1 -1
- package/dist/streams/filter.js.map +1 -1
- package/dist/streams/from_sql.js +8 -8
- package/dist/streams/from_sql.js.map +1 -1
- package/dist/streams/stream.d.ts +2 -2
- package/dist/streams/variant.d.ts +2 -3
- package/dist/streams/variant.js +9 -9
- package/dist/streams/variant.js.map +1 -1
- package/dist/sync_plan/evaluator/bucket_data_source.js +2 -2
- package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
- package/dist/sync_plan/evaluator/bucket_source.js +2 -2
- package/dist/sync_plan/evaluator/bucket_source.js.map +1 -1
- package/dist/sync_plan/evaluator/index.d.ts +2 -2
- package/dist/sync_plan/evaluator/index.js +2 -2
- package/dist/sync_plan/evaluator/index.js.map +1 -1
- package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +50 -3
- package/dist/sync_plan/evaluator/parameter_evaluator.js +236 -24
- package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +4 -5
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +32 -5
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -1
- package/dist/sync_plan/evaluator/table_processor_to_sql.js.map +1 -1
- package/dist/sync_plan/expression.js +40 -40
- package/dist/sync_plan/expression.js.map +1 -1
- package/dist/sync_plan/expression_visitor.d.ts +4 -1
- package/dist/sync_plan/expression_visitor.js +21 -12
- package/dist/sync_plan/expression_visitor.js.map +1 -1
- package/dist/sync_plan/plan.d.ts +1 -1
- package/dist/types/custom_sqlite_value.d.ts +1 -1
- package/dist/types/custom_sqlite_value.js +1 -1
- package/dist/types.d.ts +2 -2
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +1 -1
- package/dist/utils.js +5 -3
- package/dist/utils.js.map +1 -1
- package/dist/validators.js.map +1 -1
- package/package.json +6 -6
- package/schema/sync_rules.json +9 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { idFromData } from '../../cast.js';
|
|
2
2
|
import { filterJsonRow, isJsonValue, isValidParameterValue, JSONBucketNameSerialize } from '../../utils.js';
|
|
3
|
-
import { ExpressionToSqlite } from '../expression_to_sql.js';
|
|
4
3
|
import { scalarStatementToSql } from '../engine/scalar_expression_engine.js';
|
|
5
|
-
import {
|
|
4
|
+
import { ExpressionToSqlite } from '../expression_to_sql.js';
|
|
6
5
|
import { SyncPlanSchemaAnalyzer } from '../schema_inference.js';
|
|
6
|
+
import { TableProcessorToSqlHelper } from './table_processor_to_sql.js';
|
|
7
7
|
export class PreparedStreamBucketDataSource {
|
|
8
8
|
source;
|
|
9
9
|
sourceTables = new Set();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucket_data_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_data_source.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"bucket_data_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_data_source.ts"],"names":[],"mappings":"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"}
|
|
@@ -71,7 +71,7 @@ class PreparedQuerier {
|
|
|
71
71
|
this.stream = stream;
|
|
72
72
|
this.dataSource = options.preparedBuckets.get(querier.bucket);
|
|
73
73
|
this.matchesParameters = PreparedQuerier.prepareFilters(options.engine, querier.requestFilters);
|
|
74
|
-
this.lookupStages = RequestParameterEvaluators.prepare(querier.lookupStages, querier.sourceInstantiation, options);
|
|
74
|
+
this.lookupStages = RequestParameterEvaluators.prepare(stream, querier.lookupStages, querier.sourceInstantiation, options);
|
|
75
75
|
}
|
|
76
76
|
querierForSubscription(hydration, result, params, subscription) {
|
|
77
77
|
const reason = subscription != null ? { subscription: subscription.opaque_id } : 'default';
|
|
@@ -83,7 +83,7 @@ class PreparedQuerier {
|
|
|
83
83
|
const partialInstantiationResult = subscriptionEvaluators.partiallyInstantiate({ request: params });
|
|
84
84
|
const bucketScope = hydration.hydrationState.getBucketSourceScope(this.dataSource);
|
|
85
85
|
const parametersToBucket = (instantiation) => {
|
|
86
|
-
const desc = bucketDescription(bucketScope, JSONBucketNameSerialize.stringify(instantiation), this.stream.priority);
|
|
86
|
+
const desc = bucketDescription(bucketScope, JSONBucketNameSerialize.stringify(instantiation), subscription?.priorityOverride ?? this.stream.priority);
|
|
87
87
|
return resolvedBucket(desc, {
|
|
88
88
|
definition: this.stream.name,
|
|
89
89
|
inclusion_reasons: [reason]
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucket_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_source.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"bucket_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_source.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import * as plan from '../plan.js';
|
|
2
|
-
import { ScalarExpressionEngine } from '../engine/scalar_expression_engine.js';
|
|
3
1
|
import { SyncConfig } from '../../SyncConfig.js';
|
|
4
2
|
import { CompatibilityContext } from '../../compatibility.js';
|
|
5
3
|
import { SqlEventDescriptor } from '../../index.js';
|
|
4
|
+
import { ScalarExpressionEngine } from '../engine/scalar_expression_engine.js';
|
|
5
|
+
import * as plan from '../plan.js';
|
|
6
6
|
export interface StreamEvaluationContext {
|
|
7
7
|
defaultSchema: string;
|
|
8
8
|
engine: ScalarExpressionEngine;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { SyncConfig } from '../../SyncConfig.js';
|
|
1
2
|
import { PreparedStreamBucketDataSource } from './bucket_data_source.js';
|
|
2
|
-
import { PreparedParameterIndexLookupCreator } from './parameter_index_lookup_creator.js';
|
|
3
3
|
import { StreamBucketSource } from './bucket_source.js';
|
|
4
|
-
import {
|
|
4
|
+
import { PreparedParameterIndexLookupCreator } from './parameter_index_lookup_creator.js';
|
|
5
5
|
export class PrecompiledSyncConfig extends SyncConfig {
|
|
6
6
|
plan;
|
|
7
7
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAKjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAe,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAc1F,MAAM,OAAO,qBAAsB,SAAQ,UAAU;IASxC;IARX;;;;OAIG;IACM,aAAa,CAAS;IAE/B,YACW,IAAmB,EAC5B,aAAmC,EACnC,gBAAsC,EACtC,OAAgC;QAEhC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QALjB,SAAI,GAAJ,IAAI,CAAe;QAM5B,IAAI,CAAC,aAAa,GAAG,aAAa,CAAC;QACnC,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;QACzC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,aAAa,CAAC;QAE3C,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+D,CAAC;QAC/F,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+E,CAAC;QAE/G,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,MAAM,QAAQ,GAAG,IAAI,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;YACrE,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;YACtC,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxC,CAAC;QAED,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAI,mCAAmC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC7E,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;YACzC,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnD,CAAC;QAED,MAAM,WAAW,GAAgB;YAC/B,GAAG,OAAO;YACV,eAAe;YACf,eAAe;SAChB,CAAC;QACF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;YAClC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;QACvE,CAAC;IACH,CAAC;CACF"}
|
|
@@ -43,6 +43,7 @@ import { StreamInput } from './bucket_source.js';
|
|
|
43
43
|
* queriers by indicating that no lookups will be used.
|
|
44
44
|
*/
|
|
45
45
|
export declare class RequestParameterEvaluators {
|
|
46
|
+
readonly stream: plan.StreamOptions;
|
|
46
47
|
/**
|
|
47
48
|
* Pending lookup stages, or their cached outputs.
|
|
48
49
|
*/
|
|
@@ -81,12 +82,13 @@ export declare class RequestParameterEvaluators {
|
|
|
81
82
|
/**
|
|
82
83
|
* Prepares evaluators for a description of parameter values obtained from a compiled querier in the sync plan.
|
|
83
84
|
*
|
|
85
|
+
* @param stream Used to show the name of the stream for debugging purposes.
|
|
84
86
|
* @param lookupStages The {@link plan.StreamQuerier.lookupStages} of the querier to compile.
|
|
85
87
|
* @param values The {@link plan.StreamQuerier.sourceInstantiation} of the querier to compile.
|
|
86
88
|
* @param input Access to bucket and parameter sources generated for buckets and parameter lookups referenced by the
|
|
87
89
|
* querier.
|
|
88
90
|
*/
|
|
89
|
-
static prepare(lookupStages: plan.ExpandingLookup[][], values: plan.ParameterValue[], input: StreamInput): RequestParameterEvaluators;
|
|
91
|
+
static prepare(stream: plan.StreamOptions, lookupStages: plan.ExpandingLookup[][], values: plan.ParameterValue[], input: StreamInput): RequestParameterEvaluators;
|
|
90
92
|
}
|
|
91
93
|
export type PreparedExpandingLookup = {
|
|
92
94
|
type: 'parameter';
|
|
@@ -97,7 +99,7 @@ export type PreparedExpandingLookup = {
|
|
|
97
99
|
read(request: RequestParameters): SqliteParameterValue[][];
|
|
98
100
|
} | {
|
|
99
101
|
type: 'cached';
|
|
100
|
-
values:
|
|
102
|
+
values: ParameterValueWithRow[][];
|
|
101
103
|
};
|
|
102
104
|
/**
|
|
103
105
|
* A {@link plan.ParameterValue} that can be evaluated against request parameters.
|
|
@@ -119,8 +121,52 @@ export type PreparedParameterValue = {
|
|
|
119
121
|
values: PreparedParameterValue[];
|
|
120
122
|
} | {
|
|
121
123
|
type: 'cached';
|
|
122
|
-
values:
|
|
124
|
+
values: ParameterValueWithRow[];
|
|
123
125
|
};
|
|
126
|
+
interface ParameterValueWithRow {
|
|
127
|
+
value: SqliteParameterValue;
|
|
128
|
+
/**
|
|
129
|
+
* Information on how this value was resolved.
|
|
130
|
+
*
|
|
131
|
+
* We track how a parameter value was resolved to be able to merge parameters correctly. A Sync Stream with multiple
|
|
132
|
+
* independent parameters generates their cartesian product as buckets. When multiple parameters are resolved from the
|
|
133
|
+
* same row though, we can't use the full cartesian product. As an example, consider this stream:
|
|
134
|
+
*
|
|
135
|
+
* ```sql
|
|
136
|
+
* SELECT products.* FROM products, stores
|
|
137
|
+
* WHERE stores.name = products.store_name
|
|
138
|
+
* AND stores.region = products.region
|
|
139
|
+
* AND stores.id = subscription.parameter('store');
|
|
140
|
+
* ```
|
|
141
|
+
*
|
|
142
|
+
* Here, the bucket shape consists of two parameters (`store_name` and `region`). But since they're derived from the
|
|
143
|
+
* same `stores` row, we can't combine them freely. For each parameter, `store_name` and `region` must come from the
|
|
144
|
+
* same row. Here, the `provenance` would have a single entry and both parameters would have the same
|
|
145
|
+
* {@link VirtualSourceRow.resultSet}.
|
|
146
|
+
*
|
|
147
|
+
* For static values, such as constants or scalar values derived from request parameters, this array is empty. It's
|
|
148
|
+
* also possible for this to contain more than one entry, though:
|
|
149
|
+
*
|
|
150
|
+
* 1. For intersection values, we track the provenance of all input values.
|
|
151
|
+
* 2. It's possible to nest parameters. For instance, in the query `SELECT data.* FROM data, a, b WHERE a.a = data.a
|
|
152
|
+
* AND b.b = a.b AND data.c = b.c`, we have to parameters (`a` and `c`). `a` can be resolved from a lookup in
|
|
153
|
+
* table `a`, but we need to go through a second lookup to resolve `c`. Here, we can only combine value `c` with
|
|
154
|
+
* value `a` if the two were derived from the same row in `a`. So, the row `b` derived through `a` would include
|
|
155
|
+
* provenance elements of row `a` here.
|
|
156
|
+
*/
|
|
157
|
+
provenance: VirtualSourceRow[];
|
|
158
|
+
directOrigin?: VirtualSourceRow;
|
|
159
|
+
}
|
|
160
|
+
interface VirtualSourceRow {
|
|
161
|
+
/**
|
|
162
|
+
* An opaque identifier for the result set this row was derived from.
|
|
163
|
+
*/
|
|
164
|
+
resultSet: symbol;
|
|
165
|
+
/**
|
|
166
|
+
* A number uniquely identifying this row in its result set.
|
|
167
|
+
*/
|
|
168
|
+
row: number;
|
|
169
|
+
}
|
|
124
170
|
export interface PartialInstantiationInput {
|
|
125
171
|
request: RequestParameters;
|
|
126
172
|
}
|
|
@@ -130,3 +176,4 @@ export interface InstantiationInput extends PartialInstantiationInput {
|
|
|
130
176
|
}
|
|
131
177
|
export declare function isValidParameterValueRow(row: SqliteValue[]): row is SqliteParameterValue[];
|
|
132
178
|
export declare function parametersForRequest(parameters: RequestParameters, values: plan.SqlParameterValue[]): string[];
|
|
179
|
+
export {};
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { ScopedParameterLookup, UnscopedParameterLookup } from '../../BucketParameterQuerier.js';
|
|
2
|
-
import {
|
|
2
|
+
import { HashMap, listEquality, StableHasher } from '../../compiler/equality.js';
|
|
3
3
|
import { isValidParameterValue } from '../../utils.js';
|
|
4
|
-
import { MapSourceVisitor, visitExpr } from '../expression_visitor.js';
|
|
5
4
|
import { mapExternalDataToInstantiation } from '../engine/scalar_expression_engine.js';
|
|
5
|
+
import { MapSourceVisitor, visitExpr } from '../expression_visitor.js';
|
|
6
6
|
/**
|
|
7
7
|
* Finds bucket parameters for a given request or subscription.
|
|
8
8
|
*
|
|
@@ -42,9 +42,10 @@ import { mapExternalDataToInstantiation } from '../engine/scalar_expression_engi
|
|
|
42
42
|
* queriers by indicating that no lookups will be used.
|
|
43
43
|
*/
|
|
44
44
|
export class RequestParameterEvaluators {
|
|
45
|
+
stream;
|
|
45
46
|
lookupStages;
|
|
46
47
|
parameterValues;
|
|
47
|
-
constructor(
|
|
48
|
+
constructor(stream,
|
|
48
49
|
/**
|
|
49
50
|
* Pending lookup stages, or their cached outputs.
|
|
50
51
|
*/
|
|
@@ -53,6 +54,7 @@ export class RequestParameterEvaluators {
|
|
|
53
54
|
* Pending parameter values, or their cached outputs.
|
|
54
55
|
*/
|
|
55
56
|
parameterValues) {
|
|
57
|
+
this.stream = stream;
|
|
56
58
|
this.lookupStages = lookupStages;
|
|
57
59
|
this.parameterValues = parameterValues;
|
|
58
60
|
}
|
|
@@ -87,7 +89,7 @@ export class RequestParameterEvaluators {
|
|
|
87
89
|
return lookup;
|
|
88
90
|
}
|
|
89
91
|
}
|
|
90
|
-
return new RequestParameterEvaluators(this.lookupStages.map((stage) => stage.map(cloneLookup)), this.parameterValues.map(cloneValue));
|
|
92
|
+
return new RequestParameterEvaluators(this.stream, this.lookupStages.map((stage) => stage.map(cloneLookup)), this.parameterValues.map(cloneValue));
|
|
91
93
|
}
|
|
92
94
|
/**
|
|
93
95
|
* Evaluates those lookups and parameter values that be evaluated without looking up parameter indexes.
|
|
@@ -102,7 +104,7 @@ export class RequestParameterEvaluators {
|
|
|
102
104
|
this.lookupStages.forEach((stage, stageIndex) => {
|
|
103
105
|
stage.forEach((_, indexInStage) => helper.expandingLookupSync(stageIndex, indexInStage));
|
|
104
106
|
});
|
|
105
|
-
return helper.tryResolveInstantiation(this.parameterValues);
|
|
107
|
+
return helper.tryResolveInstantiation(this.parameterValues)?.map(withoutProvenance);
|
|
106
108
|
}
|
|
107
109
|
/**
|
|
108
110
|
* Resolves and caches all lookup stages and parameter values.
|
|
@@ -117,17 +119,18 @@ export class RequestParameterEvaluators {
|
|
|
117
119
|
}
|
|
118
120
|
// At this point, all lookups have been resolved and we can synchronously evaluate parameters which might depend on
|
|
119
121
|
// those lookups.
|
|
120
|
-
return helper.resolveInstantiation(this.parameterValues);
|
|
122
|
+
return helper.resolveInstantiation(this.parameterValues).map(withoutProvenance);
|
|
121
123
|
}
|
|
122
124
|
/**
|
|
123
125
|
* Prepares evaluators for a description of parameter values obtained from a compiled querier in the sync plan.
|
|
124
126
|
*
|
|
127
|
+
* @param stream Used to show the name of the stream for debugging purposes.
|
|
125
128
|
* @param lookupStages The {@link plan.StreamQuerier.lookupStages} of the querier to compile.
|
|
126
129
|
* @param values The {@link plan.StreamQuerier.sourceInstantiation} of the querier to compile.
|
|
127
130
|
* @param input Access to bucket and parameter sources generated for buckets and parameter lookups referenced by the
|
|
128
131
|
* querier.
|
|
129
132
|
*/
|
|
130
|
-
static prepare(lookupStages, values, input) {
|
|
133
|
+
static prepare(stream, lookupStages, values, input) {
|
|
131
134
|
const mappedStages = [];
|
|
132
135
|
const lookupToStage = new Map();
|
|
133
136
|
function mapParameterValue(value) {
|
|
@@ -195,7 +198,7 @@ export class RequestParameterEvaluators {
|
|
|
195
198
|
}
|
|
196
199
|
}
|
|
197
200
|
}
|
|
198
|
-
return new RequestParameterEvaluators(mappedStages, mapParameterValues(values));
|
|
201
|
+
return new RequestParameterEvaluators(stream, mappedStages, mapParameterValues(values));
|
|
199
202
|
}
|
|
200
203
|
}
|
|
201
204
|
class PartialInstantiator {
|
|
@@ -242,7 +245,7 @@ class PartialInstantiator {
|
|
|
242
245
|
}
|
|
243
246
|
return cached;
|
|
244
247
|
});
|
|
245
|
-
yield*
|
|
248
|
+
yield* mergeValueCombinations(parameterValues);
|
|
246
249
|
}
|
|
247
250
|
/**
|
|
248
251
|
* If possible, evaluates an element in an array of parameter values and replaces the parameter with a marker
|
|
@@ -254,18 +257,112 @@ class PartialInstantiator {
|
|
|
254
257
|
return current.values;
|
|
255
258
|
}
|
|
256
259
|
else if (current.type === 'intersection') {
|
|
257
|
-
|
|
260
|
+
const columns = [];
|
|
258
261
|
for (let i = 0; i < current.values.length; i++) {
|
|
259
262
|
const evaluated = this.parameterSync(current.values, i);
|
|
260
263
|
if (evaluated == null) {
|
|
261
264
|
return undefined; // Can't evaluate sub-parameter
|
|
262
265
|
}
|
|
266
|
+
columns.push(evaluated);
|
|
267
|
+
}
|
|
268
|
+
// For the most part, this just needs to find an intersection of values present in all columns. It gets more
|
|
269
|
+
// complicated for rows with provenance, however. For those. we need to ensure we find an intersection of values
|
|
270
|
+
// with compatible source rows. For example, consider an intersection of the same parameter lookup with columns
|
|
271
|
+
// `c1` and `c2`, and assume that we had the following rows:
|
|
272
|
+
//
|
|
273
|
+
// 1. Row {c1: 'a', c2: 'a'}
|
|
274
|
+
// 2. Row {c1: 'a', c2: 'b'}
|
|
275
|
+
//
|
|
276
|
+
// The intersection of this has one value: `a`, with a provenance of Row 1. To achieve this, we re-create rows
|
|
277
|
+
// by tracking a canonical value per row. If we see another value in the same row, we know that row can't
|
|
278
|
+
// contribute to the intersection because it has different values for `c1` and `c2`.
|
|
279
|
+
const poison = Symbol('poison');
|
|
280
|
+
const valuesByResultSet = new Map();
|
|
281
|
+
const completedRows = new Map();
|
|
282
|
+
function markRowAsCompleted(resultSet, rowid) {
|
|
283
|
+
let rowids = completedRows.get(resultSet);
|
|
284
|
+
if (rowids == null) {
|
|
285
|
+
rowids = new Set();
|
|
286
|
+
completedRows.set(resultSet, rowids);
|
|
287
|
+
}
|
|
288
|
+
rowids.add(rowid);
|
|
289
|
+
}
|
|
290
|
+
// Eliminate rows with conflicting values.
|
|
291
|
+
for (const column of columns) {
|
|
292
|
+
nextValue: for (const value of column) {
|
|
293
|
+
const row = value.directOrigin;
|
|
294
|
+
if (row) {
|
|
295
|
+
let forResultSet = valuesByResultSet.get(row.resultSet);
|
|
296
|
+
if (forResultSet == null) {
|
|
297
|
+
forResultSet = new Map();
|
|
298
|
+
valuesByResultSet.set(row.resultSet, forResultSet);
|
|
299
|
+
}
|
|
300
|
+
const existingValue = forResultSet.get(row.row);
|
|
301
|
+
if (existingValue != null && existingValue != value.value) {
|
|
302
|
+
forResultSet.set(row.row, poison);
|
|
303
|
+
markRowAsCompleted(row.resultSet, row.row);
|
|
304
|
+
continue nextValue;
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
forResultSet.set(row.row, value.value);
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
}
|
|
312
|
+
function shouldSkipValue(value) {
|
|
313
|
+
if (value.directOrigin) {
|
|
314
|
+
const { resultSet, row } = value.directOrigin;
|
|
315
|
+
const ignoredRowIds = completedRows.get(resultSet);
|
|
316
|
+
if (ignoredRowIds?.has(row))
|
|
317
|
+
return true;
|
|
318
|
+
const valuesForResultSet = valuesByResultSet.get(resultSet);
|
|
319
|
+
if (valuesForResultSet == null)
|
|
320
|
+
return false;
|
|
321
|
+
if (valuesForResultSet.get(row) != value.value)
|
|
322
|
+
return true;
|
|
323
|
+
}
|
|
324
|
+
return false;
|
|
325
|
+
}
|
|
326
|
+
let intersection = null;
|
|
327
|
+
for (const column of columns) {
|
|
263
328
|
if (intersection == null) {
|
|
264
|
-
intersection = new
|
|
329
|
+
intersection = new Map();
|
|
330
|
+
for (const value of column) {
|
|
331
|
+
if (shouldSkipValue(value))
|
|
332
|
+
continue;
|
|
333
|
+
const existing = intersection.get(value.value);
|
|
334
|
+
if (existing != null) {
|
|
335
|
+
existing.push(value.provenance);
|
|
336
|
+
}
|
|
337
|
+
else {
|
|
338
|
+
intersection.set(value.value, [value.provenance]);
|
|
339
|
+
}
|
|
340
|
+
for (const { resultSet, row } of value.provenance) {
|
|
341
|
+
// Any other value derived from this row must have the same value (otherwise we would have eliminated it).
|
|
342
|
+
// So we don't have to consider this row again.
|
|
343
|
+
markRowAsCompleted(resultSet, row);
|
|
344
|
+
}
|
|
345
|
+
}
|
|
265
346
|
}
|
|
266
347
|
else {
|
|
267
|
-
|
|
268
|
-
|
|
348
|
+
const unmatchedValues = new Set(intersection.keys());
|
|
349
|
+
for (const value of column) {
|
|
350
|
+
const existing = intersection.get(value.value);
|
|
351
|
+
if (existing == null) {
|
|
352
|
+
// Value not in intersection, ignore.
|
|
353
|
+
}
|
|
354
|
+
else {
|
|
355
|
+
unmatchedValues.delete(value.value);
|
|
356
|
+
if (!shouldSkipValue(value)) {
|
|
357
|
+
// An intersection value is derived from all inputs, so we track them all as provenance.
|
|
358
|
+
existing.push(value.provenance);
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
for (const unmatched of unmatchedValues) {
|
|
363
|
+
// Values in intersection before, but not in evaluated
|
|
364
|
+
intersection.delete(unmatched);
|
|
365
|
+
}
|
|
269
366
|
}
|
|
270
367
|
if (intersection.size == 0) {
|
|
271
368
|
// Empty intersection, we don't even need to evaluate the rest.
|
|
@@ -274,7 +371,11 @@ class PartialInstantiator {
|
|
|
274
371
|
}
|
|
275
372
|
let values = [];
|
|
276
373
|
if (intersection) {
|
|
277
|
-
|
|
374
|
+
intersection.forEach((provenances, value) => {
|
|
375
|
+
for (const provenance of provenances) {
|
|
376
|
+
values.push({ value, provenance });
|
|
377
|
+
}
|
|
378
|
+
});
|
|
278
379
|
}
|
|
279
380
|
parent[index] = { type: 'cached', values };
|
|
280
381
|
return values;
|
|
@@ -289,7 +390,14 @@ class PartialInstantiator {
|
|
|
289
390
|
}
|
|
290
391
|
else if (current.type === 'request') {
|
|
291
392
|
const value = current.read(this.input.request);
|
|
292
|
-
const values = isValidParameterValue(value)
|
|
393
|
+
const values = isValidParameterValue(value)
|
|
394
|
+
? [
|
|
395
|
+
{
|
|
396
|
+
value,
|
|
397
|
+
provenance: []
|
|
398
|
+
}
|
|
399
|
+
]
|
|
400
|
+
: [];
|
|
293
401
|
parent[index] = { type: 'cached', values };
|
|
294
402
|
return values;
|
|
295
403
|
}
|
|
@@ -299,7 +407,12 @@ class PartialInstantiator {
|
|
|
299
407
|
const lookup = this.evaluators.lookupStages[stage][index];
|
|
300
408
|
if (lookup.type == 'table_valued') {
|
|
301
409
|
// We can evaluate this table-valued function already.
|
|
302
|
-
const
|
|
410
|
+
const resultSetMarker = Symbol();
|
|
411
|
+
const values = lookup.read(this.input.request).map((values, rowid) => {
|
|
412
|
+
const directOrigin = { resultSet: resultSetMarker, row: rowid };
|
|
413
|
+
const provenance = [directOrigin];
|
|
414
|
+
return values.map((value) => ({ value, provenance, directOrigin }));
|
|
415
|
+
});
|
|
303
416
|
this.evaluators.lookupStages[stage][index] = { type: 'cached', values };
|
|
304
417
|
return values;
|
|
305
418
|
}
|
|
@@ -321,15 +434,56 @@ class FullInstantiator extends PartialInstantiator {
|
|
|
321
434
|
const lookup = this.evaluators.lookupStages[stage][index];
|
|
322
435
|
if (lookup.type == 'parameter') {
|
|
323
436
|
const scope = this.input.hydrationState.getParameterIndexLookupScope(lookup.lookup);
|
|
324
|
-
const
|
|
325
|
-
//
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
437
|
+
const resolvedLookup = lookup.lookup;
|
|
438
|
+
// It's possible that we'll have the same logical lookup with multiple provenance values. For instance, if the
|
|
439
|
+
// outputs of another lookup with two columns (where only one column is an input to this lookup) are passed into
|
|
440
|
+
// this, we can have two lookups with identical keys but different provenances. This hash map de-duplicates keys.
|
|
441
|
+
const pendingLookups = new HashMap(FullInstantiator.parameterArrayEquality);
|
|
442
|
+
for (const values of this.resolveInputs(lookup.instantiation)) {
|
|
443
|
+
const provenance = [];
|
|
444
|
+
for (const value of values) {
|
|
445
|
+
provenance.push(...value.provenance);
|
|
331
446
|
}
|
|
332
|
-
|
|
447
|
+
const directValues = withoutProvenance(values);
|
|
448
|
+
pendingLookups.setOrUpdate(directValues, (old) => {
|
|
449
|
+
if (old == null) {
|
|
450
|
+
return {
|
|
451
|
+
lookup: ScopedParameterLookup.normalized(scope, UnscopedParameterLookup.normalized(directValues)),
|
|
452
|
+
provenance: [{ origin: provenance, symbol: Symbol(`lookup ${stage}.${index}`) }]
|
|
453
|
+
};
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
old.provenance.push({ origin: provenance, symbol: Symbol(`lookup ${stage}.${index}`) });
|
|
457
|
+
return old;
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
}
|
|
461
|
+
const lookupsToProvenance = new Map();
|
|
462
|
+
for (const [_, { lookup, provenance }] of pendingLookups.entries) {
|
|
463
|
+
lookupsToProvenance.set(lookup, provenance);
|
|
464
|
+
}
|
|
465
|
+
const outputs = await this.input.source.getParameterSets([...lookupsToProvenance.keys()], `Stream ${this.evaluators.stream.name} evaluating parameter on ${resolvedLookup.sourceTable.name}`);
|
|
466
|
+
// Stream parameters generate an output row like {0: <expr>, 1: <expr>, ...}.
|
|
467
|
+
const values = outputs.flatMap(({ lookup, rows }) => {
|
|
468
|
+
return lookupsToProvenance.get(lookup).flatMap(({ symbol, origin }) => {
|
|
469
|
+
return rows.map((row, rowid) => {
|
|
470
|
+
const length = Object.entries(row).length;
|
|
471
|
+
const asArray = [];
|
|
472
|
+
for (let i = 0; i < length; i++) {
|
|
473
|
+
const value = row[i.toString()];
|
|
474
|
+
const directOrigin = length > 1 ? { resultSet: symbol, row: rowid } : undefined;
|
|
475
|
+
asArray.push({
|
|
476
|
+
value,
|
|
477
|
+
// Note: Not tracking provenance for parameters with just a single output is purely a performance
|
|
478
|
+
// optimization. If there's just a single value, we don't need to correlate it with other columns in the
|
|
479
|
+
// row. Not adding provenance saves some work in mergeValueCombinations.
|
|
480
|
+
provenance: directOrigin != null ? [...origin, directOrigin] : origin,
|
|
481
|
+
directOrigin
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
return asArray;
|
|
485
|
+
});
|
|
486
|
+
});
|
|
333
487
|
});
|
|
334
488
|
this.evaluators.lookupStages[stage][index] = { type: 'cached', values };
|
|
335
489
|
return values;
|
|
@@ -340,6 +494,10 @@ class FullInstantiator extends PartialInstantiator {
|
|
|
340
494
|
}
|
|
341
495
|
return other;
|
|
342
496
|
}
|
|
497
|
+
static parameterArrayEquality = listEquality(StableHasher.parameterValueEquality);
|
|
498
|
+
}
|
|
499
|
+
function withoutProvenance(source) {
|
|
500
|
+
return source.map(({ value }) => value);
|
|
343
501
|
}
|
|
344
502
|
export function isValidParameterValueRow(row) {
|
|
345
503
|
for (const value of row) {
|
|
@@ -373,4 +531,58 @@ function* filterParameterRows(rows) {
|
|
|
373
531
|
}
|
|
374
532
|
}
|
|
375
533
|
}
|
|
534
|
+
/**
|
|
535
|
+
* Builds a cartesian product of parameter instantiations, taking {@link ParameterValueWithRow.provenance} into account
|
|
536
|
+
* to avoid combining values from different rows of the same result set.
|
|
537
|
+
*
|
|
538
|
+
* @param valuesByParameter An array containing possible instantiations for each parameter.
|
|
539
|
+
* @returns All allowed instantiations.
|
|
540
|
+
*/
|
|
541
|
+
function* mergeValueCombinations(valuesByParameter) {
|
|
542
|
+
// Partial backtracking results, the current instantiation is fixed for 0..nextParameter in generateCombinations.
|
|
543
|
+
const partialResults = new Array(valuesByParameter.length);
|
|
544
|
+
// A map from result sets to rows used in the partial instantiation.
|
|
545
|
+
const usedRows = new Map();
|
|
546
|
+
function installRowIfNoConflict(value) {
|
|
547
|
+
const addedResultSets = [];
|
|
548
|
+
for (const origin of value.provenance) {
|
|
549
|
+
const { resultSet, row } = origin;
|
|
550
|
+
const existingRow = usedRows.get(resultSet);
|
|
551
|
+
if (existingRow === undefined) {
|
|
552
|
+
addedResultSets.push(resultSet);
|
|
553
|
+
usedRows.set(resultSet, row);
|
|
554
|
+
}
|
|
555
|
+
else if (existingRow == row) {
|
|
556
|
+
continue;
|
|
557
|
+
}
|
|
558
|
+
else {
|
|
559
|
+
// The current instantiation already contains a value from the same result set but derived from a different
|
|
560
|
+
// row. So we must ignore this parameter value.
|
|
561
|
+
return [false, addedResultSets];
|
|
562
|
+
}
|
|
563
|
+
}
|
|
564
|
+
return [true, addedResultSets];
|
|
565
|
+
}
|
|
566
|
+
function uninstallResultSets(resultSets) {
|
|
567
|
+
for (const rs of resultSets) {
|
|
568
|
+
usedRows.delete(rs);
|
|
569
|
+
}
|
|
570
|
+
}
|
|
571
|
+
function* generateCombinations(nextParameter) {
|
|
572
|
+
if (nextParameter >= valuesByParameter.length) {
|
|
573
|
+
yield [...partialResults];
|
|
574
|
+
return;
|
|
575
|
+
}
|
|
576
|
+
const availableValues = valuesByParameter[nextParameter];
|
|
577
|
+
for (const available of availableValues) {
|
|
578
|
+
const [canUse, addedResultSets] = installRowIfNoConflict(available);
|
|
579
|
+
if (canUse) {
|
|
580
|
+
partialResults[nextParameter] = available;
|
|
581
|
+
yield* generateCombinations(nextParameter + 1);
|
|
582
|
+
}
|
|
583
|
+
uninstallResultSets(addedResultSets);
|
|
584
|
+
}
|
|
585
|
+
}
|
|
586
|
+
yield* generateCombinations(0);
|
|
587
|
+
}
|
|
376
588
|
//# sourceMappingURL=parameter_evaluator.js.map
|