@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.
Files changed (134) hide show
  1. package/README.md +3 -3
  2. package/dist/BaseSqlDataQuery.d.ts +1 -1
  3. package/dist/BucketDescription.d.ts +3 -2
  4. package/dist/BucketParameterQuerier.d.ts +23 -1
  5. package/dist/BucketParameterQuerier.js +24 -0
  6. package/dist/BucketParameterQuerier.js.map +1 -1
  7. package/dist/BucketSource.d.ts +1 -1
  8. package/dist/HydratedSyncRules.d.ts +2 -2
  9. package/dist/HydratedSyncRules.js +1 -1
  10. package/dist/HydratedSyncRules.js.map +1 -1
  11. package/dist/HydrationState.d.ts +9 -5
  12. package/dist/HydrationState.js +3 -3
  13. package/dist/HydrationState.js.map +1 -1
  14. package/dist/SqlDataQuery.d.ts +1 -1
  15. package/dist/SqlParameterQuery.js +3 -1
  16. package/dist/SqlParameterQuery.js.map +1 -1
  17. package/dist/SqlSyncRules.d.ts +9 -2
  18. package/dist/SqlSyncRules.js +1 -1
  19. package/dist/SqlSyncRules.js.map +1 -1
  20. package/dist/StorageVersion.d.ts +27 -0
  21. package/dist/StorageVersion.js +17 -0
  22. package/dist/StorageVersion.js.map +1 -0
  23. package/dist/SyncConfig.d.ts +9 -3
  24. package/dist/SyncConfig.js +9 -3
  25. package/dist/SyncConfig.js.map +1 -1
  26. package/dist/TableValuedFunctions.js +1 -0
  27. package/dist/TableValuedFunctions.js.map +1 -1
  28. package/dist/compiler/bucket_resolver.d.ts +1 -1
  29. package/dist/compiler/bucket_resolver.js +1 -1
  30. package/dist/compiler/bucket_resolver.js.map +1 -1
  31. package/dist/compiler/compiler.d.ts +4 -4
  32. package/dist/compiler/compiler.js +3 -3
  33. package/dist/compiler/compiler.js.map +1 -1
  34. package/dist/compiler/equality.d.ts +2 -0
  35. package/dist/compiler/equality.js +35 -0
  36. package/dist/compiler/equality.js.map +1 -1
  37. package/dist/compiler/expression.d.ts +4 -4
  38. package/dist/compiler/expression.js +2 -2
  39. package/dist/compiler/expression.js.map +1 -1
  40. package/dist/compiler/filter.d.ts +2 -2
  41. package/dist/compiler/filter.js +1 -1
  42. package/dist/compiler/filter.js.map +1 -1
  43. package/dist/compiler/filter_simplifier.d.ts +2 -2
  44. package/dist/compiler/filter_simplifier.js +2 -2
  45. package/dist/compiler/filter_simplifier.js.map +1 -1
  46. package/dist/compiler/ir_to_sync_plan.js +1 -1
  47. package/dist/compiler/ir_to_sync_plan.js.map +1 -1
  48. package/dist/compiler/parser.d.ts +5 -5
  49. package/dist/compiler/parser.js +12 -10
  50. package/dist/compiler/parser.js.map +1 -1
  51. package/dist/compiler/querier_graph.d.ts +1 -1
  52. package/dist/compiler/querier_graph.js +15 -4
  53. package/dist/compiler/querier_graph.js.map +1 -1
  54. package/dist/compiler/rows.d.ts +2 -2
  55. package/dist/compiler/rows.js +1 -1
  56. package/dist/compiler/rows.js.map +1 -1
  57. package/dist/compiler/scope.d.ts +3 -3
  58. package/dist/compiler/scope.js +2 -1
  59. package/dist/compiler/scope.js.map +1 -1
  60. package/dist/compiler/sqlite.d.ts +6 -2
  61. package/dist/compiler/sqlite.js +1 -1
  62. package/dist/compiler/sqlite.js.map +1 -1
  63. package/dist/compiler/table.d.ts +28 -2
  64. package/dist/compiler/table.js +76 -0
  65. package/dist/compiler/table.js.map +1 -1
  66. package/dist/events/SqlEventDescriptor.d.ts +1 -1
  67. package/dist/events/SqlEventDescriptor.js +1 -1
  68. package/dist/events/SqlEventDescriptor.js.map +1 -1
  69. package/dist/events/SqlEventSourceQuery.d.ts +1 -1
  70. package/dist/events/SqlEventSourceQuery.js.map +1 -1
  71. package/dist/from_yaml.d.ts +1 -1
  72. package/dist/from_yaml.js +79 -22
  73. package/dist/from_yaml.js.map +1 -1
  74. package/dist/index.d.ts +9 -8
  75. package/dist/index.js +9 -8
  76. package/dist/index.js.map +1 -1
  77. package/dist/json_schema.js +7 -0
  78. package/dist/json_schema.js.map +1 -1
  79. package/dist/schema-generators/DartSchemaGenerator.js.map +1 -1
  80. package/dist/schema-generators/DotNetSchemaGenerator.d.ts +1 -1
  81. package/dist/schema-generators/DotNetSchemaGenerator.js.map +1 -1
  82. package/dist/schema-generators/JsLegacySchemaGenerator.js.map +1 -1
  83. package/dist/schema-generators/KotlinSchemaGenerator.js.map +1 -1
  84. package/dist/schema-generators/SchemaGenerator.d.ts +1 -1
  85. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  86. package/dist/schema-generators/TsSchemaGenerator.js.map +1 -1
  87. package/dist/schema-generators/generators.d.ts +1 -1
  88. package/dist/schema-generators/generators.js +1 -1
  89. package/dist/schema-generators/generators.js.map +1 -1
  90. package/dist/schema-generators/schema-generators.js.map +1 -1
  91. package/dist/sql_filters.d.ts +1 -1
  92. package/dist/sql_filters.js +1 -1
  93. package/dist/sql_filters.js.map +1 -1
  94. package/dist/sql_functions.d.ts +1 -1
  95. package/dist/sql_functions.js +3 -3
  96. package/dist/sql_functions.js.map +1 -1
  97. package/dist/streams/filter.js.map +1 -1
  98. package/dist/streams/from_sql.js +8 -8
  99. package/dist/streams/from_sql.js.map +1 -1
  100. package/dist/streams/stream.d.ts +2 -2
  101. package/dist/streams/variant.d.ts +2 -3
  102. package/dist/streams/variant.js +9 -9
  103. package/dist/streams/variant.js.map +1 -1
  104. package/dist/sync_plan/evaluator/bucket_data_source.js +2 -2
  105. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
  106. package/dist/sync_plan/evaluator/bucket_source.js +2 -2
  107. package/dist/sync_plan/evaluator/bucket_source.js.map +1 -1
  108. package/dist/sync_plan/evaluator/index.d.ts +2 -2
  109. package/dist/sync_plan/evaluator/index.js +2 -2
  110. package/dist/sync_plan/evaluator/index.js.map +1 -1
  111. package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +50 -3
  112. package/dist/sync_plan/evaluator/parameter_evaluator.js +236 -24
  113. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
  114. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +4 -5
  115. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +32 -5
  116. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -1
  117. package/dist/sync_plan/evaluator/table_processor_to_sql.js.map +1 -1
  118. package/dist/sync_plan/expression.js +40 -40
  119. package/dist/sync_plan/expression.js.map +1 -1
  120. package/dist/sync_plan/expression_visitor.d.ts +4 -1
  121. package/dist/sync_plan/expression_visitor.js +21 -12
  122. package/dist/sync_plan/expression_visitor.js.map +1 -1
  123. package/dist/sync_plan/plan.d.ts +1 -1
  124. package/dist/types/custom_sqlite_value.d.ts +1 -1
  125. package/dist/types/custom_sqlite_value.js +1 -1
  126. package/dist/types.d.ts +2 -2
  127. package/dist/types.js +1 -1
  128. package/dist/types.js.map +1 -1
  129. package/dist/utils.d.ts +1 -1
  130. package/dist/utils.js +5 -3
  131. package/dist/utils.js.map +1 -1
  132. package/dist/validators.js.map +1 -1
  133. package/package.json +6 -6
  134. 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 { TableProcessorToSqlHelper } from './table_processor_to_sql.js';
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":"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"}
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 { SyncConfig } from '../../SyncConfig.js';
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":"AACA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAe,MAAM,oBAAoB,CAAC;AAErE,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAgBjD,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"}
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: SqliteParameterValue[][];
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: SqliteParameterValue[];
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 { cartesianProduct } from '../../streams/utils.js';
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* cartesianProduct(...parameterValues);
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
- let intersection = null;
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 Set(evaluated);
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
- // TODO: Remove as any once we can use ES2025 in TypeScript
268
- intersection = intersection.intersection(new Set(evaluated));
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
- values.push(...intersection.keys());
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) ? [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 values = lookup.read(this.input.request);
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 outputs = await this.input.source.getParameterSets([...this.resolveInputs(lookup.instantiation)].map((instantiation) => ScopedParameterLookup.normalized(scope, UnscopedParameterLookup.normalized(instantiation))));
325
- // Stream parameters generate an output row like {0: <expr>, 1: <expr>, ...}.
326
- const values = outputs.map((row) => {
327
- const length = Object.entries(row).length;
328
- const asArray = [];
329
- for (let i = 0; i < length; i++) {
330
- asArray.push(row[i.toString()]);
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
- return asArray;
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