@powersync/service-sync-rules 0.29.10 → 0.31.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 (188) hide show
  1. package/dist/BaseSqlDataQuery.d.ts +3 -9
  2. package/dist/BaseSqlDataQuery.js +11 -21
  3. package/dist/BaseSqlDataQuery.js.map +1 -1
  4. package/dist/BucketParameterQuerier.d.ts +42 -9
  5. package/dist/BucketParameterQuerier.js +30 -7
  6. package/dist/BucketParameterQuerier.js.map +1 -1
  7. package/dist/BucketSource.d.ts +94 -25
  8. package/dist/BucketSource.js +67 -0
  9. package/dist/BucketSource.js.map +1 -1
  10. package/dist/ExpressionType.d.ts +4 -2
  11. package/dist/ExpressionType.js.map +1 -1
  12. package/dist/HydratedSyncRules.d.ts +46 -0
  13. package/dist/HydratedSyncRules.js +88 -0
  14. package/dist/HydratedSyncRules.js.map +1 -0
  15. package/dist/HydrationState.d.ts +45 -0
  16. package/dist/HydrationState.js +41 -0
  17. package/dist/HydrationState.js.map +1 -0
  18. package/dist/SqlBucketDescriptor.d.ts +31 -28
  19. package/dist/SqlBucketDescriptor.js +89 -112
  20. package/dist/SqlBucketDescriptor.js.map +1 -1
  21. package/dist/SqlDataQuery.d.ts +4 -4
  22. package/dist/SqlDataQuery.js +5 -6
  23. package/dist/SqlDataQuery.js.map +1 -1
  24. package/dist/SqlParameterQuery.d.ts +17 -9
  25. package/dist/SqlParameterQuery.js +49 -23
  26. package/dist/SqlParameterQuery.js.map +1 -1
  27. package/dist/SqlSyncRules.d.ts +11 -53
  28. package/dist/SqlSyncRules.js +11 -376
  29. package/dist/SqlSyncRules.js.map +1 -1
  30. package/dist/StaticSqlParameterQuery.d.ts +13 -3
  31. package/dist/StaticSqlParameterQuery.js +38 -4
  32. package/dist/StaticSqlParameterQuery.js.map +1 -1
  33. package/dist/SyncConfig.d.ts +43 -0
  34. package/dist/SyncConfig.js +102 -0
  35. package/dist/SyncConfig.js.map +1 -0
  36. package/dist/TablePattern.d.ts +22 -4
  37. package/dist/TablePattern.js +57 -19
  38. package/dist/TablePattern.js.map +1 -1
  39. package/dist/TableValuedFunctionSqlParameterQuery.d.ts +14 -4
  40. package/dist/TableValuedFunctionSqlParameterQuery.js +41 -7
  41. package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
  42. package/dist/compatibility.d.ts +7 -0
  43. package/dist/compatibility.js +34 -0
  44. package/dist/compatibility.js.map +1 -1
  45. package/dist/compiler/bucket_resolver.d.ts +70 -0
  46. package/dist/compiler/bucket_resolver.js +131 -0
  47. package/dist/compiler/bucket_resolver.js.map +1 -0
  48. package/dist/compiler/compatibility.d.ts +16 -0
  49. package/dist/compiler/compatibility.js +12 -0
  50. package/dist/compiler/compatibility.js.map +1 -0
  51. package/dist/compiler/compiler.d.ts +110 -0
  52. package/dist/compiler/compiler.js +130 -0
  53. package/dist/compiler/compiler.js.map +1 -0
  54. package/dist/compiler/equality.d.ts +99 -0
  55. package/dist/compiler/equality.js +284 -0
  56. package/dist/compiler/equality.js.map +1 -0
  57. package/dist/compiler/expression.d.ts +77 -0
  58. package/dist/compiler/expression.js +122 -0
  59. package/dist/compiler/expression.js.map +1 -0
  60. package/dist/compiler/filter.d.ts +71 -0
  61. package/dist/compiler/filter.js +110 -0
  62. package/dist/compiler/filter.js.map +1 -0
  63. package/dist/compiler/filter_simplifier.d.ts +26 -0
  64. package/dist/compiler/filter_simplifier.js +119 -0
  65. package/dist/compiler/filter_simplifier.js.map +1 -0
  66. package/dist/compiler/ir_to_sync_plan.d.ts +37 -0
  67. package/dist/compiler/ir_to_sync_plan.js +163 -0
  68. package/dist/compiler/ir_to_sync_plan.js.map +1 -0
  69. package/dist/compiler/parser.d.ts +99 -0
  70. package/dist/compiler/parser.js +556 -0
  71. package/dist/compiler/parser.js.map +1 -0
  72. package/dist/compiler/querier_graph.d.ts +42 -0
  73. package/dist/compiler/querier_graph.js +365 -0
  74. package/dist/compiler/querier_graph.js.map +1 -0
  75. package/dist/compiler/rows.d.ts +113 -0
  76. package/dist/compiler/rows.js +156 -0
  77. package/dist/compiler/rows.js.map +1 -0
  78. package/dist/compiler/scope.d.ts +22 -0
  79. package/dist/compiler/scope.js +47 -0
  80. package/dist/compiler/scope.js.map +1 -0
  81. package/dist/compiler/sqlite.d.ts +77 -0
  82. package/dist/compiler/sqlite.js +412 -0
  83. package/dist/compiler/sqlite.js.map +1 -0
  84. package/dist/compiler/table.d.ts +66 -0
  85. package/dist/compiler/table.js +67 -0
  86. package/dist/compiler/table.js.map +1 -0
  87. package/dist/errors.d.ts +4 -2
  88. package/dist/errors.js +16 -1
  89. package/dist/errors.js.map +1 -1
  90. package/dist/events/SqlEventDescriptor.js +1 -1
  91. package/dist/events/SqlEventDescriptor.js.map +1 -1
  92. package/dist/events/SqlEventSourceQuery.d.ts +1 -1
  93. package/dist/events/SqlEventSourceQuery.js +1 -2
  94. package/dist/events/SqlEventSourceQuery.js.map +1 -1
  95. package/dist/from_yaml.d.ts +28 -0
  96. package/dist/from_yaml.js +411 -0
  97. package/dist/from_yaml.js.map +1 -0
  98. package/dist/index.d.ts +9 -0
  99. package/dist/index.js +9 -0
  100. package/dist/index.js.map +1 -1
  101. package/dist/json_schema.js +17 -1
  102. package/dist/json_schema.js.map +1 -1
  103. package/dist/request_functions.js.map +1 -1
  104. package/dist/schema-generators/DartSchemaGenerator.d.ts +3 -3
  105. package/dist/schema-generators/DartSchemaGenerator.js.map +1 -1
  106. package/dist/schema-generators/DotNetSchemaGenerator.d.ts +2 -2
  107. package/dist/schema-generators/DotNetSchemaGenerator.js.map +1 -1
  108. package/dist/schema-generators/JsLegacySchemaGenerator.d.ts +2 -2
  109. package/dist/schema-generators/JsLegacySchemaGenerator.js.map +1 -1
  110. package/dist/schema-generators/KotlinSchemaGenerator.d.ts +2 -2
  111. package/dist/schema-generators/KotlinSchemaGenerator.js.map +1 -1
  112. package/dist/schema-generators/RoomSchemaGenerator.d.ts +2 -2
  113. package/dist/schema-generators/RoomSchemaGenerator.js.map +1 -1
  114. package/dist/schema-generators/SchemaGenerator.d.ts +8 -3
  115. package/dist/schema-generators/SchemaGenerator.js +21 -14
  116. package/dist/schema-generators/SchemaGenerator.js.map +1 -1
  117. package/dist/schema-generators/SqlSchemaGenerator.d.ts +2 -2
  118. package/dist/schema-generators/SqlSchemaGenerator.js.map +1 -1
  119. package/dist/schema-generators/SwiftSchemaGenerator.d.ts +2 -2
  120. package/dist/schema-generators/SwiftSchemaGenerator.js.map +1 -1
  121. package/dist/schema-generators/TsSchemaGenerator.d.ts +2 -2
  122. package/dist/schema-generators/TsSchemaGenerator.js.map +1 -1
  123. package/dist/sql_functions.d.ts +4 -3
  124. package/dist/sql_functions.js +1 -1
  125. package/dist/sql_functions.js.map +1 -1
  126. package/dist/streams/filter.d.ts +34 -4
  127. package/dist/streams/filter.js +93 -23
  128. package/dist/streams/filter.js.map +1 -1
  129. package/dist/streams/from_sql.js +2 -5
  130. package/dist/streams/from_sql.js.map +1 -1
  131. package/dist/streams/parameter.d.ts +7 -6
  132. package/dist/streams/stream.d.ts +25 -15
  133. package/dist/streams/stream.js +59 -87
  134. package/dist/streams/stream.js.map +1 -1
  135. package/dist/streams/variant.d.ts +14 -21
  136. package/dist/streams/variant.js +68 -46
  137. package/dist/streams/variant.js.map +1 -1
  138. package/dist/sync_plan/engine/javascript.d.ts +6 -0
  139. package/dist/sync_plan/engine/javascript.js +208 -0
  140. package/dist/sync_plan/engine/javascript.js.map +1 -0
  141. package/dist/sync_plan/engine/scalar_expression_engine.d.ts +48 -0
  142. package/dist/sync_plan/engine/scalar_expression_engine.js +99 -0
  143. package/dist/sync_plan/engine/scalar_expression_engine.js.map +1 -0
  144. package/dist/sync_plan/engine/sqlite.d.ts +12 -0
  145. package/dist/sync_plan/engine/sqlite.js +53 -0
  146. package/dist/sync_plan/engine/sqlite.js.map +1 -0
  147. package/dist/sync_plan/evaluator/bucket_data_source.d.ts +24 -0
  148. package/dist/sync_plan/evaluator/bucket_data_source.js +139 -0
  149. package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -0
  150. package/dist/sync_plan/evaluator/bucket_source.d.ts +19 -0
  151. package/dist/sync_plan/evaluator/bucket_source.js +145 -0
  152. package/dist/sync_plan/evaluator/bucket_source.js.map +1 -0
  153. package/dist/sync_plan/evaluator/index.d.ts +17 -0
  154. package/dist/sync_plan/evaluator/index.js +32 -0
  155. package/dist/sync_plan/evaluator/index.js.map +1 -0
  156. package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +138 -0
  157. package/dist/sync_plan/evaluator/parameter_evaluator.js +359 -0
  158. package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -0
  159. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +20 -0
  160. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +64 -0
  161. package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -0
  162. package/dist/sync_plan/expression.d.ts +109 -0
  163. package/dist/sync_plan/expression.js +85 -0
  164. package/dist/sync_plan/expression.js.map +1 -0
  165. package/dist/sync_plan/expression_to_sql.d.ts +43 -0
  166. package/dist/sync_plan/expression_to_sql.js +190 -0
  167. package/dist/sync_plan/expression_to_sql.js.map +1 -0
  168. package/dist/sync_plan/expression_visitor.d.ts +57 -0
  169. package/dist/sync_plan/expression_visitor.js +181 -0
  170. package/dist/sync_plan/expression_visitor.js.map +1 -0
  171. package/dist/sync_plan/plan.d.ts +196 -0
  172. package/dist/sync_plan/plan.js +2 -0
  173. package/dist/sync_plan/plan.js.map +1 -0
  174. package/dist/sync_plan/schema_inference.d.ts +16 -0
  175. package/dist/sync_plan/schema_inference.js +123 -0
  176. package/dist/sync_plan/schema_inference.js.map +1 -0
  177. package/dist/sync_plan/serialize.d.ts +82 -0
  178. package/dist/sync_plan/serialize.js +214 -0
  179. package/dist/sync_plan/serialize.js.map +1 -0
  180. package/dist/types/custom_sqlite_value.d.ts +1 -1
  181. package/dist/types.d.ts +72 -29
  182. package/dist/types.js +30 -5
  183. package/dist/types.js.map +1 -1
  184. package/dist/utils.d.ts +10 -3
  185. package/dist/utils.js +26 -3
  186. package/dist/utils.js.map +1 -1
  187. package/package.json +4 -3
  188. package/schema/sync_rules.json +19 -3
@@ -0,0 +1,196 @@
1
+ import { BucketPriority } from '../BucketDescription.js';
2
+ import { ParameterLookupScope } from '../HydrationState.js';
3
+ import { ImplicitSchemaTablePattern } from '../TablePattern.js';
4
+ import { SqlExpression } from './expression.js';
5
+ /**
6
+ * A compiled "sync plan", a description for
7
+ *
8
+ * 1. how rows get filtered, mapped and put into buckets.
9
+ * 2. how rows get filtered, mapped and put into parameter lookups.
10
+ * 3. how connections use parameter lookups to infer buckets.
11
+ *
12
+ * Sync plans can be compiled from sync stream definitions. There is always a single plan for all stream definitions,
13
+ * which allows re-using parameter lookups if multiple streams have similar subpatterns.
14
+ *
15
+ * Additionally, sync plans can be serialized to (and restored from) a simple JSON representation. We store sync plans
16
+ * in bucket storage and restore them on service startup, allowing us to make changes to the compiler without that
17
+ * affecting existing deployed sync instances.
18
+ *
19
+ * However, this also means that sync plan definitions themselves must have a stable representation. We can add to them,
20
+ * but we must never alter the semantics for existing serialized plans.
21
+ */
22
+ export interface SyncPlan {
23
+ dataSources: StreamDataSource[];
24
+ buckets: StreamBucketDataSource[];
25
+ parameterIndexes: StreamParameterIndexLookupCreator[];
26
+ streams: CompiledSyncStream[];
27
+ }
28
+ /**
29
+ * Something that processes a source row if it matches filters.
30
+ */
31
+ export interface TableProcessor {
32
+ /**
33
+ * A hash code describing the structure of this processor.
34
+ *
35
+ * While these processors are plain JavaScript objects that can be compared by deep equality, this hash code may
36
+ * improve performance when many such sources need to be compared. Two equal data sources will always have the same
37
+ * hash code.
38
+ */
39
+ hashCode: number;
40
+ /**
41
+ * The source table to process into buckets or parameter lookups.
42
+ */
43
+ sourceTable: ImplicitSchemaTablePattern;
44
+ /**
45
+ * All of these expressions exclusively depend on the {@link sourceTable}.
46
+ *
47
+ * All of the filters must evaluate to a "true-ish" value for the row to be processed.
48
+ */
49
+ filters: SqlExpression<ColumnSqlParameterValue>[];
50
+ /**
51
+ * How to partition rows.
52
+ *
53
+ * For data sources, this describes parameter of the bucket being created. For parameter lookups, these form
54
+ * input values for the lookup.
55
+ */
56
+ parameters: PartitionKey[];
57
+ }
58
+ export interface PartitionKey {
59
+ expr: SqlExpression<ColumnSqlParameterValue>;
60
+ }
61
+ /**
62
+ * A description for a data source processing rows to replicate.
63
+ *
64
+ * A single data source might be used in multiple buckets ({@link StreamBucketDataSource}). In those cases, we'd store
65
+ * duplicate bucket data but can still share the actual processing logic between multiple streams (to avoid evaluating
66
+ * the same filters and expressions multiple times).
67
+ */
68
+ export interface StreamDataSource extends TableProcessor {
69
+ /**
70
+ * The name of the output table for evaluated rows.
71
+ *
72
+ * If null, the name of the table being evaluated should be used instead.
73
+ */
74
+ outputTableName?: string;
75
+ /**
76
+ * Output columns describing the row to store in buckets.
77
+ */
78
+ columns: ColumnSource[];
79
+ }
80
+ export type ColumnSource = 'star' | {
81
+ expr: SqlExpression<ColumnSqlParameterValue>;
82
+ alias: string;
83
+ };
84
+ /**
85
+ * A mapping describing how {@link StreamDataSource}s are combined into buckets.
86
+ *
87
+ * One instance of this always describes a single bucket data source. A stream may consist of multiple such sources if
88
+ * different variants are used. It is also possible for a bucket data source to be reused between streams in some
89
+ * instances.
90
+ */
91
+ export interface StreamBucketDataSource {
92
+ hashCode: number;
93
+ /**
94
+ * A unique name of this source in all streams compiled from a sync rules file.
95
+ */
96
+ uniqueName: string;
97
+ /**
98
+ * All data sources to put into this bucket.
99
+ *
100
+ * Note that all data sources must have the same amount of paremeters, since they would be instantiated to the same
101
+ * values by a {@link StreamQuerier}.
102
+ */
103
+ sources: StreamDataSource[];
104
+ }
105
+ /**
106
+ * A description for a data source creating parameter lookup values that can be queried when fetching buckets for a
107
+ * connection.
108
+ */
109
+ export interface StreamParameterIndexLookupCreator extends TableProcessor {
110
+ hashCode: number;
111
+ defaultLookupScope: ParameterLookupScope;
112
+ /**
113
+ * Outputs to persist in the lookup.
114
+ *
115
+ * Note: In {@link UnscopedEvaluatedParameters}, outputs are called `bucketParameters`. This doesn't apply to sync
116
+ * streams because the output of parameters might be passed through additional stages or transformed by the querier
117
+ * before becoming a parameter value.
118
+ */
119
+ outputs: SqlExpression<ColumnSqlParameterValue>[];
120
+ }
121
+ export interface StreamOptions {
122
+ name: string;
123
+ isSubscribedByDefault: boolean;
124
+ priority: BucketPriority;
125
+ }
126
+ export interface CompiledSyncStream {
127
+ stream: StreamOptions;
128
+ queriers: StreamQuerier[];
129
+ }
130
+ export interface StreamQuerier {
131
+ /**
132
+ * Static filters on the subscription, connection or token.
133
+ *
134
+ * All of them must match for this querier to be considered for a subscription.
135
+ */
136
+ requestFilters: SqlExpression<RequestSqlParameterValue>[];
137
+ /**
138
+ * Ordered lookups that need to be evaluated and expanded before we can evaluate {@link sourceInstantiation}.
139
+ *
140
+ * Each element of the outer array represents a stage of lookups that can run concurrently.
141
+ */
142
+ lookupStages: ExpandingLookup[][];
143
+ /**
144
+ * The bucket being resolved by this querier.
145
+ *
146
+ * While a querier can have more than one source, it never uses more than one instantiation path. This means that all
147
+ * sources in {@link StreamBucketDataSource.sources} must have compatible parameters.
148
+ */
149
+ bucket: StreamBucketDataSource;
150
+ sourceInstantiation: ParameterValue[];
151
+ }
152
+ export type SqlParameterValue = ColumnSqlParameterValue | RequestSqlParameterValue;
153
+ /**
154
+ * A value that resolves to a given column in a row being processed.
155
+ */
156
+ export interface ColumnSqlParameterValue {
157
+ column: string;
158
+ }
159
+ export type ConnectionParameterSource = 'auth' | 'subscription' | 'connection';
160
+ /**
161
+ * A value that resolves to either the current subscription parameters, the JWT of the connecting user or global
162
+ * request parameters.
163
+ */
164
+ export interface RequestSqlParameterValue {
165
+ request: ConnectionParameterSource;
166
+ }
167
+ /**
168
+ * A lookup returning multiple rows when instantiated.
169
+ */
170
+ export type ExpandingLookup = ParameterLookup | EvaluateTableValuedFunction;
171
+ export interface ParameterLookup {
172
+ type: 'parameter';
173
+ lookup: StreamParameterIndexLookupCreator;
174
+ /**
175
+ * Must have the same length as {@link TableProcessor.parameters} for {@link lookup}.
176
+ */
177
+ instantiation: ParameterValue[];
178
+ }
179
+ export interface EvaluateTableValuedFunction {
180
+ type: 'table_valued';
181
+ functionName: string;
182
+ functionInputs: SqlExpression<RequestSqlParameterValue>[];
183
+ outputs: SqlExpression<ColumnSqlParameterValue>[];
184
+ filters: SqlExpression<ColumnSqlParameterValue>[];
185
+ }
186
+ export type ParameterValue = {
187
+ type: 'request';
188
+ expr: SqlExpression<RequestSqlParameterValue>;
189
+ } | {
190
+ type: 'lookup';
191
+ lookup: ExpandingLookup;
192
+ resultIndex: number;
193
+ } | {
194
+ type: 'intersection';
195
+ values: ParameterValue[];
196
+ };
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=plan.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plan.js","sourceRoot":"","sources":["../../src/sync_plan/plan.ts"],"names":[],"mappings":""}
@@ -0,0 +1,16 @@
1
+ import { ColumnDefinition } from '../ExpressionType.js';
2
+ import { SourceSchema } from '../types.js';
3
+ import { StreamDataSource } from './plan.js';
4
+ /**
5
+ * Infers the output schema of sync streams by resolving references against a statically-known source schema.
6
+ */
7
+ export declare class SyncPlanSchemaAnalyzer {
8
+ private readonly defaultSchema;
9
+ private readonly schema;
10
+ constructor(defaultSchema: string, schema: SourceSchema);
11
+ /**
12
+ * Populates an output record of tables with the inferred result sets for a stream data source against a source
13
+ * schema.
14
+ */
15
+ resolveResultSets(source: StreamDataSource, tables: Record<string, Record<string, ColumnDefinition>>): void;
16
+ }
@@ -0,0 +1,123 @@
1
+ import { CompatibilityContext } from '../compatibility.js';
2
+ import { ExpressionType } from '../ExpressionType.js';
3
+ import { generateSqlFunctions, getOperatorReturnType } from '../sql_functions.js';
4
+ import { visitExpr } from './expression_visitor.js';
5
+ /**
6
+ * Infers the output schema of sync streams by resolving references against a statically-known source schema.
7
+ */
8
+ export class SyncPlanSchemaAnalyzer {
9
+ defaultSchema;
10
+ schema;
11
+ constructor(defaultSchema, schema) {
12
+ this.defaultSchema = defaultSchema;
13
+ this.schema = schema;
14
+ }
15
+ /**
16
+ * Populates an output record of tables with the inferred result sets for a stream data source against a source
17
+ * schema.
18
+ */
19
+ resolveResultSets(source, tables) {
20
+ for (const table of this.schema.getTables(source.sourceTable.toTablePattern(this.defaultSchema))) {
21
+ const typeResolver = new ExpressionTypeInference(table);
22
+ const outputName = source.outputTableName ?? table.name;
23
+ const outputTable = (tables[outputName] ??= {});
24
+ function addOutputColumn(definition) {
25
+ if (definition.name == 'id') {
26
+ return; // Is implicit
27
+ }
28
+ const existing = outputTable[definition.name];
29
+ if (existing != null) {
30
+ outputTable[definition.name] = {
31
+ name: definition.name,
32
+ type: existing.type.or(definition.type),
33
+ originalType: definition.originalType == existing.originalType ? existing.originalType : undefined
34
+ };
35
+ }
36
+ else {
37
+ outputTable[definition.name] = definition;
38
+ }
39
+ }
40
+ for (const column of source.columns) {
41
+ if (column === 'star') {
42
+ for (const actualColumn of table.getColumns()) {
43
+ addOutputColumn(actualColumn);
44
+ }
45
+ }
46
+ else {
47
+ const type = visitExpr(typeResolver, column.expr, null);
48
+ addOutputColumn({ name: column.alias, ...type });
49
+ }
50
+ }
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * Infers the type of expressions, resolving column references against a fixed schema table.
56
+ */
57
+ class ExpressionTypeInference {
58
+ sourceTable;
59
+ constructor(sourceTable) {
60
+ this.sourceTable = sourceTable;
61
+ }
62
+ visitExternalData(expr) {
63
+ const column = this.sourceTable.getColumn(expr.source.column);
64
+ if (column) {
65
+ return { type: column.type, originalType: column.originalType };
66
+ }
67
+ return { type: ExpressionType.NONE };
68
+ }
69
+ visitUnaryExpression(expr) {
70
+ switch (expr.operator) {
71
+ case 'not':
72
+ return ExpressionTypeInference.BOOLEAN;
73
+ case '+':
74
+ return visitExpr(this, expr.operand, null);
75
+ }
76
+ }
77
+ visitBinaryExpression(expr) {
78
+ return {
79
+ type: getOperatorReturnType(expr.operator.toUpperCase(), visitExpr(this, expr.left, null).type, visitExpr(this, expr.right, null).type)
80
+ };
81
+ }
82
+ visitBetweenExpression() {
83
+ return ExpressionTypeInference.BOOLEAN;
84
+ }
85
+ visitScalarInExpression() {
86
+ return ExpressionTypeInference.BOOLEAN;
87
+ }
88
+ visitCaseWhenExpression(expr) {
89
+ let type = ExpressionType.NONE;
90
+ // Create a union of all THEN expressions (and ELSE, if present).
91
+ for (const { then } of expr.whens) {
92
+ type = type.or(visitExpr(this, then, null).type);
93
+ }
94
+ if (expr.else) {
95
+ type = type.or(visitExpr(this, expr.else, null).type);
96
+ }
97
+ return { type };
98
+ }
99
+ visitCastExpression(expr) {
100
+ return { type: ExpressionType.fromTypeText(expr.cast_as) };
101
+ }
102
+ visitScalarFunctionCallExpression(expr) {
103
+ const resolved = ExpressionTypeInference.functions.named[expr.function.toLowerCase()];
104
+ const args = expr.parameters.map((p) => visitExpr(this, p, null).type);
105
+ return { type: resolved.getReturnType(args) };
106
+ }
107
+ visitLiteralExpression(expr) {
108
+ switch (expr.type) {
109
+ case 'lit_null':
110
+ return { type: ExpressionType.NONE };
111
+ case 'lit_double':
112
+ return { type: ExpressionType.REAL };
113
+ case 'lit_int':
114
+ return { type: ExpressionType.INTEGER };
115
+ case 'lit_string':
116
+ return { type: ExpressionType.TEXT };
117
+ }
118
+ }
119
+ // We don't care about compatibility as these functions are only used to infer types.
120
+ static functions = generateSqlFunctions(CompatibilityContext.FULL_BACKWARDS_COMPATIBILITY);
121
+ static BOOLEAN = { type: ExpressionType.INTEGER, originalType: 'bool' };
122
+ }
123
+ //# sourceMappingURL=schema_inference.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema_inference.js","sourceRoot":"","sources":["../../src/sync_plan/schema_inference.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAgC,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACpF,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAWlF,OAAO,EAAqB,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGvE;;GAEG;AACH,MAAM,OAAO,sBAAsB;IAEd;IACA;IAFnB,YACmB,aAAqB,EACrB,MAAoB;QADpB,kBAAa,GAAb,aAAa,CAAQ;QACrB,WAAM,GAAN,MAAM,CAAc;IACpC,CAAC;IAEJ;;;OAGG;IACH,iBAAiB,CAAC,MAAwB,EAAE,MAAwD;QAClG,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,WAAW,CAAC,cAAc,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC;YACjG,MAAM,YAAY,GAAG,IAAI,uBAAuB,CAAC,KAAK,CAAC,CAAC;YACxD,MAAM,UAAU,GAAG,MAAM,CAAC,eAAe,IAAI,KAAK,CAAC,IAAI,CAAC;YACxD,MAAM,WAAW,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC;YAEhD,SAAS,eAAe,CAAC,UAA4B;gBACnD,IAAI,UAAU,CAAC,IAAI,IAAI,IAAI,EAAE,CAAC;oBAC5B,OAAO,CAAC,cAAc;gBACxB,CAAC;gBAED,MAAM,QAAQ,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;gBAC9C,IAAI,QAAQ,IAAI,IAAI,EAAE,CAAC;oBACrB,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG;wBAC7B,IAAI,EAAE,UAAU,CAAC,IAAI;wBACrB,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;wBACvC,YAAY,EAAE,UAAU,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,SAAS;qBACnG,CAAC;gBACJ,CAAC;qBAAM,CAAC;oBACN,WAAW,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC;gBAC5C,CAAC;YACH,CAAC;YAED,KAAK,MAAM,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gBACpC,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;oBACtB,KAAK,MAAM,YAAY,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;wBAC9C,eAAe,CAAC,YAAY,CAAC,CAAC;oBAChC,CAAC;gBACH,CAAC;qBAAM,CAAC;oBACN,MAAM,IAAI,GAAG,SAAS,CAAC,YAAY,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;oBACxD,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;gBACnD,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;CACF;AAED;;GAEG;AACH,MAAM,uBAAuB;IACE;IAA7B,YAA6B,WAA8B;QAA9B,gBAAW,GAAX,WAAW,CAAmB;IAAG,CAAC;IAE/D,iBAAiB,CAAC,IAA2C;QAC3D,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC9D,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,YAAY,EAAE,MAAM,CAAC,YAAY,EAAE,CAAC;QAClE,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;IACvC,CAAC;IAED,oBAAoB,CAAC,IAA8C;QACjE,QAAQ,IAAI,CAAC,QAAQ,EAAE,CAAC;YACtB,KAAK,KAAK;gBACR,OAAO,uBAAuB,CAAC,OAAO,CAAC;YACzC,KAAK,GAAG;gBACN,OAAO,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,qBAAqB,CAAC,IAA+C;QACnE,OAAO;YACL,IAAI,EAAE,qBAAqB,CACzB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,EAC3B,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,EACrC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,IAAI,CACvC;SACF,CAAC;IACJ,CAAC;IAED,sBAAsB;QACpB,OAAO,uBAAuB,CAAC,OAAO,CAAC;IACzC,CAAC;IAED,uBAAuB;QACrB,OAAO,uBAAuB,CAAC,OAAO,CAAC;IACzC,CAAC;IAED,uBAAuB,CAAC,IAAiD;QACvE,IAAI,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC;QAC/B,iEAAiE;QACjE,KAAK,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YAClC,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,IAAI,GAAG,IAAI,CAAC,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QACxD,CAAC;QAED,OAAO,EAAE,IAAI,EAAE,CAAC;IAClB,CAAC;IAED,mBAAmB,CAAC,IAA6C;QAC/D,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;IAC7D,CAAC;IAED,iCAAiC,CAAC,IAA2D;QAC3F,MAAM,QAAQ,GAAG,uBAAuB,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;QACtF,MAAM,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC;QAEvE,OAAO,EAAE,IAAI,EAAE,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;IAChD,CAAC;IAED,sBAAsB,CAAC,IAAuB;QAC5C,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,UAAU;gBACb,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,YAAY;gBACf,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;YACvC,KAAK,SAAS;gBACZ,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,CAAC;YAC1C,KAAK,YAAY;gBACf,OAAO,EAAE,IAAI,EAAE,cAAc,CAAC,IAAI,EAAE,CAAC;QACzC,CAAC;IACH,CAAC;IAED,qFAAqF;IAC7E,MAAM,CAAU,SAAS,GAAG,oBAAoB,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC;IACpG,MAAM,CAAU,OAAO,GAAe,EAAE,IAAI,EAAE,cAAc,CAAC,OAAO,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC"}
@@ -0,0 +1,82 @@
1
+ import { ParameterLookupScope } from '../HydrationState.js';
2
+ import { SqlExpression } from './expression.js';
3
+ import { ColumnSource, ColumnSqlParameterValue, PartitionKey, RequestSqlParameterValue, StreamOptions, SyncPlan } from './plan.js';
4
+ /**
5
+ * Serializes a sync plan into a simple JSON object.
6
+ *
7
+ * While {@link SyncPlan}s are already serializable for the most part, it contains a graph of references from e.g.
8
+ * queriers to bucket creators. To represent this efficiently, we assign numbers to referenced elements while
9
+ * serializing instead of duplicating definitions.
10
+ */
11
+ export declare function serializeSyncPlan(plan: SyncPlan): SerializedSyncPlanUnstable;
12
+ export declare function deserializeSyncPlan(serialized: unknown): SyncPlan;
13
+ interface SerializedSyncPlanUnstable {
14
+ version: 'unstable';
15
+ dataSources: SerializedDataSource[];
16
+ buckets: SerializedBucketDataSource[];
17
+ parameterIndexes: SerializedParameterIndexLookupCreator[];
18
+ streams: SerializedStream[];
19
+ }
20
+ interface SerializedBucketDataSource {
21
+ hash: number;
22
+ uniqueName: string;
23
+ sources: number[];
24
+ }
25
+ interface SerializedTablePattern {
26
+ connection: string | null;
27
+ schema: string | null;
28
+ table: string;
29
+ }
30
+ interface SerializedDataSource {
31
+ table: SerializedTablePattern;
32
+ outputTableName?: string;
33
+ hash: number;
34
+ columns: ColumnSource[];
35
+ filters: SqlExpression<ColumnSqlParameterValue>[];
36
+ partitionBy: PartitionKey[];
37
+ }
38
+ interface SerializedParameterIndexLookupCreator {
39
+ table: SerializedTablePattern;
40
+ hash: number;
41
+ lookupScope: ParameterLookupScope;
42
+ output: SqlExpression<ColumnSqlParameterValue>[];
43
+ filters: SqlExpression<ColumnSqlParameterValue>[];
44
+ partitionBy: PartitionKey[];
45
+ }
46
+ interface SerializedStream {
47
+ stream: StreamOptions;
48
+ queriers: SerializedStreamQuerier[];
49
+ }
50
+ interface SerializedStreamQuerier {
51
+ requestFilters: SqlExpression<RequestSqlParameterValue>[];
52
+ lookupStages: SerializedExpandingLookup[][];
53
+ bucket: number;
54
+ sourceInstantiation: SerializedParameterValue[];
55
+ }
56
+ type SerializedExpandingLookup = {
57
+ type: 'parameter';
58
+ lookup: number;
59
+ instantiation: SerializedParameterValue[];
60
+ } | {
61
+ type: 'table_valued';
62
+ functionName: string;
63
+ functionInputs: SqlExpression<RequestSqlParameterValue>[];
64
+ outputs: SqlExpression<ColumnSqlParameterValue>[];
65
+ filters: SqlExpression<ColumnSqlParameterValue>[];
66
+ };
67
+ interface LookupReference {
68
+ stageId: number;
69
+ idInStage: number;
70
+ }
71
+ type SerializedParameterValue = {
72
+ type: 'request';
73
+ expr: SqlExpression<RequestSqlParameterValue>;
74
+ } | {
75
+ type: 'lookup';
76
+ lookup: LookupReference;
77
+ resultIndex: number;
78
+ } | {
79
+ type: 'intersection';
80
+ values: SerializedParameterValue[];
81
+ };
82
+ export {};
@@ -0,0 +1,214 @@
1
+ import { ImplicitSchemaTablePattern, TablePattern } from '../TablePattern.js';
2
+ /**
3
+ * Serializes a sync plan into a simple JSON object.
4
+ *
5
+ * While {@link SyncPlan}s are already serializable for the most part, it contains a graph of references from e.g.
6
+ * queriers to bucket creators. To represent this efficiently, we assign numbers to referenced elements while
7
+ * serializing instead of duplicating definitions.
8
+ */
9
+ export function serializeSyncPlan(plan) {
10
+ const dataSourceIndex = new Map();
11
+ const bucketIndex = new Map();
12
+ const parameterIndex = new Map();
13
+ const expandingLookups = new Map();
14
+ function serializeTablePattern(pattern) {
15
+ return {
16
+ connection: pattern.connectionTag,
17
+ schema: pattern.schema,
18
+ table: pattern.tablePattern
19
+ };
20
+ }
21
+ function serializeDataSources() {
22
+ return plan.dataSources.map((source, i) => {
23
+ dataSourceIndex.set(source, i);
24
+ return {
25
+ hash: source.hashCode,
26
+ table: serializeTablePattern(source.sourceTable),
27
+ outputTableName: source.outputTableName,
28
+ filters: source.filters,
29
+ partitionBy: source.parameters,
30
+ columns: source.columns
31
+ };
32
+ });
33
+ }
34
+ function serializeParameterIndexes() {
35
+ return plan.parameterIndexes.map((source, i) => {
36
+ parameterIndex.set(source, i);
37
+ return {
38
+ hash: source.hashCode,
39
+ table: serializeTablePattern(source.sourceTable),
40
+ filters: source.filters,
41
+ partitionBy: source.parameters,
42
+ output: source.outputs,
43
+ lookupScope: source.defaultLookupScope
44
+ };
45
+ });
46
+ }
47
+ function serializeParameterValue(value) {
48
+ if (value.type == 'request') {
49
+ return { type: 'request', expr: value.expr };
50
+ }
51
+ else if (value.type == 'lookup') {
52
+ return { type: 'lookup', lookup: expandingLookups.get(value.lookup), resultIndex: value.resultIndex };
53
+ }
54
+ else {
55
+ return { type: 'intersection', values: value.values.map(serializeParameterValue) };
56
+ }
57
+ }
58
+ function serializeStreamQuerier(source) {
59
+ const stages = [];
60
+ source.lookupStages.map((stage, stageIndex) => {
61
+ stages.push(stage.map((e, indexInStage) => {
62
+ const ref = {
63
+ stageId: stageIndex,
64
+ idInStage: indexInStage
65
+ };
66
+ let mapped;
67
+ if (e.type == 'parameter') {
68
+ mapped = {
69
+ type: 'parameter',
70
+ lookup: parameterIndex.get(e.lookup),
71
+ instantiation: e.instantiation.map(serializeParameterValue)
72
+ };
73
+ }
74
+ else {
75
+ mapped = {
76
+ type: 'table_valued',
77
+ functionName: e.functionName,
78
+ functionInputs: e.functionInputs,
79
+ outputs: e.outputs,
80
+ filters: e.filters
81
+ };
82
+ }
83
+ expandingLookups.set(e, ref);
84
+ return mapped;
85
+ }));
86
+ });
87
+ return {
88
+ requestFilters: source.requestFilters,
89
+ lookupStages: stages,
90
+ bucket: bucketIndex.get(source.bucket),
91
+ sourceInstantiation: source.sourceInstantiation.map(serializeParameterValue)
92
+ };
93
+ }
94
+ return {
95
+ version: 'unstable', // TODO: Mature to 1 before storing in bucket storage
96
+ dataSources: serializeDataSources(),
97
+ buckets: plan.buckets.map((bkt, index) => {
98
+ bucketIndex.set(bkt, index);
99
+ return {
100
+ hash: bkt.hashCode,
101
+ uniqueName: bkt.uniqueName,
102
+ sources: bkt.sources.map((e) => dataSourceIndex.get(e))
103
+ };
104
+ }),
105
+ parameterIndexes: serializeParameterIndexes(),
106
+ streams: plan.streams.map((s) => ({
107
+ stream: s.stream,
108
+ queriers: s.queriers.map(serializeStreamQuerier)
109
+ }))
110
+ };
111
+ }
112
+ export function deserializeSyncPlan(serialized) {
113
+ // TODO: Mature to version 1
114
+ if (serialized.version != 'unstable') {
115
+ throw new Error('Unknown sync plan version passed to deserializeSyncPlan()');
116
+ }
117
+ function deserializeTablePattern(pattern) {
118
+ if (pattern.schema) {
119
+ return new TablePattern(`${pattern.connection}.${pattern.schema}`, pattern.table);
120
+ }
121
+ else {
122
+ return new ImplicitSchemaTablePattern(null, pattern.table);
123
+ }
124
+ }
125
+ const plan = serialized;
126
+ const dataSources = plan.dataSources.map((source) => {
127
+ return {
128
+ hashCode: source.hash,
129
+ sourceTable: deserializeTablePattern(source.table),
130
+ outputTableName: source.outputTableName,
131
+ filters: source.filters,
132
+ parameters: source.partitionBy,
133
+ columns: source.columns
134
+ };
135
+ });
136
+ const buckets = plan.buckets.map((bkt) => {
137
+ return {
138
+ hashCode: bkt.hash,
139
+ uniqueName: bkt.uniqueName,
140
+ sources: bkt.sources.map((idx) => dataSources[idx])
141
+ };
142
+ });
143
+ const parameterIndexes = plan.parameterIndexes.map((source) => {
144
+ return {
145
+ hashCode: source.hash,
146
+ sourceTable: deserializeTablePattern(source.table),
147
+ filters: source.filters,
148
+ parameters: source.partitionBy,
149
+ outputs: source.output,
150
+ defaultLookupScope: source.lookupScope
151
+ };
152
+ });
153
+ function deserializeParameterValue(stages, value) {
154
+ switch (value.type) {
155
+ case 'request':
156
+ return value;
157
+ case 'lookup':
158
+ return {
159
+ type: 'lookup',
160
+ lookup: stages[value.lookup.stageId][value.lookup.idInStage],
161
+ resultIndex: value.resultIndex
162
+ };
163
+ case 'intersection':
164
+ return { type: 'intersection', values: value.values.map((v) => deserializeParameterValue(stages, v)) };
165
+ }
166
+ }
167
+ function deserializeExpandingLookup(stages, source) {
168
+ switch (source.type) {
169
+ case 'parameter':
170
+ return {
171
+ type: 'parameter',
172
+ lookup: parameterIndexes[source.lookup],
173
+ instantiation: source.instantiation.map((v) => deserializeParameterValue(stages, v))
174
+ };
175
+ case 'table_valued':
176
+ return {
177
+ type: 'table_valued',
178
+ functionName: source.functionName,
179
+ functionInputs: source.functionInputs,
180
+ outputs: source.outputs,
181
+ filters: source.filters
182
+ };
183
+ }
184
+ }
185
+ function deserializeStreamQuerier(source) {
186
+ const lookupStages = [];
187
+ for (const serializedStage of source.lookupStages) {
188
+ const stage = [];
189
+ for (const serializedElement of serializedStage) {
190
+ stage.push(deserializeExpandingLookup(lookupStages, serializedElement));
191
+ }
192
+ lookupStages.push(stage);
193
+ }
194
+ return {
195
+ requestFilters: source.requestFilters,
196
+ lookupStages,
197
+ bucket: buckets[source.bucket],
198
+ sourceInstantiation: source.sourceInstantiation.map((v) => deserializeParameterValue(lookupStages, v))
199
+ };
200
+ }
201
+ const streams = plan.streams.map((source) => {
202
+ return {
203
+ stream: source.stream,
204
+ queriers: source.queriers.map(deserializeStreamQuerier)
205
+ };
206
+ });
207
+ return {
208
+ dataSources,
209
+ buckets,
210
+ parameterIndexes,
211
+ streams
212
+ };
213
+ }
214
+ //# sourceMappingURL=serialize.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serialize.js","sourceRoot":"","sources":["../../src/sync_plan/serialize.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,6 @@
1
1
  import { CompatibilityContext } from '../compatibility.js';
2
- import { SqliteValue } from '../types.js';
3
2
  import { SqliteValueType } from '../ExpressionType.js';
3
+ import { SqliteValue } from '../types.js';
4
4
  /**
5
5
  * A value that decays into a {@link SqliteValue} in a context-specific way.
6
6
  *