@powersync/service-sync-rules 0.29.9 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/BaseSqlDataQuery.d.ts +3 -9
- package/dist/BaseSqlDataQuery.js +11 -21
- package/dist/BaseSqlDataQuery.js.map +1 -1
- package/dist/BucketParameterQuerier.d.ts +42 -9
- package/dist/BucketParameterQuerier.js +30 -7
- package/dist/BucketParameterQuerier.js.map +1 -1
- package/dist/BucketSource.d.ts +94 -25
- package/dist/BucketSource.js +67 -0
- package/dist/BucketSource.js.map +1 -1
- package/dist/ExpressionType.d.ts +4 -2
- package/dist/ExpressionType.js.map +1 -1
- package/dist/HydratedSyncRules.d.ts +46 -0
- package/dist/HydratedSyncRules.js +88 -0
- package/dist/HydratedSyncRules.js.map +1 -0
- package/dist/HydrationState.d.ts +45 -0
- package/dist/HydrationState.js +41 -0
- package/dist/HydrationState.js.map +1 -0
- package/dist/SqlBucketDescriptor.d.ts +31 -28
- package/dist/SqlBucketDescriptor.js +89 -112
- package/dist/SqlBucketDescriptor.js.map +1 -1
- package/dist/SqlDataQuery.d.ts +4 -4
- package/dist/SqlDataQuery.js +5 -6
- package/dist/SqlDataQuery.js.map +1 -1
- package/dist/SqlParameterQuery.d.ts +17 -9
- package/dist/SqlParameterQuery.js +49 -23
- package/dist/SqlParameterQuery.js.map +1 -1
- package/dist/SqlSyncRules.d.ts +13 -29
- package/dist/SqlSyncRules.js +48 -77
- package/dist/SqlSyncRules.js.map +1 -1
- package/dist/StaticSqlParameterQuery.d.ts +13 -3
- package/dist/StaticSqlParameterQuery.js +38 -4
- package/dist/StaticSqlParameterQuery.js.map +1 -1
- package/dist/TablePattern.d.ts +4 -1
- package/dist/TablePattern.js +11 -0
- package/dist/TablePattern.js.map +1 -1
- package/dist/TableValuedFunctionSqlParameterQuery.d.ts +14 -4
- package/dist/TableValuedFunctionSqlParameterQuery.js +41 -7
- package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
- package/dist/compatibility.d.ts +23 -1
- package/dist/compatibility.js +32 -4
- package/dist/compatibility.js.map +1 -1
- package/dist/compiler/bucket_resolver.d.ts +70 -0
- package/dist/compiler/bucket_resolver.js +131 -0
- package/dist/compiler/bucket_resolver.js.map +1 -0
- package/dist/compiler/compatibility.d.ts +16 -0
- package/dist/compiler/compatibility.js +12 -0
- package/dist/compiler/compatibility.js.map +1 -0
- package/dist/compiler/compiler.d.ts +104 -0
- package/dist/compiler/compiler.js +113 -0
- package/dist/compiler/compiler.js.map +1 -0
- package/dist/compiler/equality.d.ts +99 -0
- package/dist/compiler/equality.js +284 -0
- package/dist/compiler/equality.js.map +1 -0
- package/dist/compiler/expression.d.ts +77 -0
- package/dist/compiler/expression.js +122 -0
- package/dist/compiler/expression.js.map +1 -0
- package/dist/compiler/filter.d.ts +71 -0
- package/dist/compiler/filter.js +110 -0
- package/dist/compiler/filter.js.map +1 -0
- package/dist/compiler/filter_simplifier.d.ts +26 -0
- package/dist/compiler/filter_simplifier.js +119 -0
- package/dist/compiler/filter_simplifier.js.map +1 -0
- package/dist/compiler/ir_to_sync_plan.d.ts +37 -0
- package/dist/compiler/ir_to_sync_plan.js +163 -0
- package/dist/compiler/ir_to_sync_plan.js.map +1 -0
- package/dist/compiler/parser.d.ts +99 -0
- package/dist/compiler/parser.js +556 -0
- package/dist/compiler/parser.js.map +1 -0
- package/dist/compiler/querier_graph.d.ts +42 -0
- package/dist/compiler/querier_graph.js +365 -0
- package/dist/compiler/querier_graph.js.map +1 -0
- package/dist/compiler/rows.d.ts +113 -0
- package/dist/compiler/rows.js +156 -0
- package/dist/compiler/rows.js.map +1 -0
- package/dist/compiler/scope.d.ts +22 -0
- package/dist/compiler/scope.js +47 -0
- package/dist/compiler/scope.js.map +1 -0
- package/dist/compiler/sqlite.d.ts +77 -0
- package/dist/compiler/sqlite.js +412 -0
- package/dist/compiler/sqlite.js.map +1 -0
- package/dist/compiler/table.d.ts +67 -0
- package/dist/compiler/table.js +67 -0
- package/dist/compiler/table.js.map +1 -0
- package/dist/errors.d.ts +4 -2
- package/dist/errors.js +16 -1
- package/dist/errors.js.map +1 -1
- package/dist/events/SqlEventDescriptor.js +1 -1
- package/dist/events/SqlEventDescriptor.js.map +1 -1
- package/dist/events/SqlEventSourceQuery.d.ts +1 -1
- package/dist/events/SqlEventSourceQuery.js +1 -2
- package/dist/events/SqlEventSourceQuery.js.map +1 -1
- package/dist/index.d.ts +8 -0
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/json_schema.js +5 -1
- package/dist/json_schema.js.map +1 -1
- package/dist/request_functions.js +1 -1
- package/dist/request_functions.js.map +1 -1
- package/dist/schema-generators/SchemaGenerator.d.ts +5 -0
- package/dist/schema-generators/SchemaGenerator.js +21 -14
- package/dist/schema-generators/SchemaGenerator.js.map +1 -1
- package/dist/sql_functions.d.ts +2 -1
- package/dist/sql_functions.js +1 -1
- package/dist/sql_functions.js.map +1 -1
- package/dist/streams/filter.d.ts +34 -4
- package/dist/streams/filter.js +93 -23
- package/dist/streams/filter.js.map +1 -1
- package/dist/streams/from_sql.js +2 -5
- package/dist/streams/from_sql.js.map +1 -1
- package/dist/streams/parameter.d.ts +7 -6
- package/dist/streams/stream.d.ts +25 -15
- package/dist/streams/stream.js +59 -87
- package/dist/streams/stream.js.map +1 -1
- package/dist/streams/variant.d.ts +14 -21
- package/dist/streams/variant.js +68 -46
- package/dist/streams/variant.js.map +1 -1
- package/dist/sync_plan/engine/javascript.d.ts +6 -0
- package/dist/sync_plan/engine/javascript.js +208 -0
- package/dist/sync_plan/engine/javascript.js.map +1 -0
- package/dist/sync_plan/engine/scalar_expression_engine.d.ts +48 -0
- package/dist/sync_plan/engine/scalar_expression_engine.js +99 -0
- package/dist/sync_plan/engine/scalar_expression_engine.js.map +1 -0
- package/dist/sync_plan/engine/sqlite.d.ts +12 -0
- package/dist/sync_plan/engine/sqlite.js +53 -0
- package/dist/sync_plan/engine/sqlite.js.map +1 -0
- package/dist/sync_plan/evaluator/bucket_data_source.d.ts +23 -0
- package/dist/sync_plan/evaluator/bucket_data_source.js +137 -0
- package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -0
- package/dist/sync_plan/evaluator/bucket_source.d.ts +19 -0
- package/dist/sync_plan/evaluator/bucket_source.js +145 -0
- package/dist/sync_plan/evaluator/bucket_source.js.map +1 -0
- package/dist/sync_plan/evaluator/index.d.ts +7 -0
- package/dist/sync_plan/evaluator/index.js +26 -0
- package/dist/sync_plan/evaluator/index.js.map +1 -0
- package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +138 -0
- package/dist/sync_plan/evaluator/parameter_evaluator.js +359 -0
- package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -0
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +19 -0
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +62 -0
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -0
- package/dist/sync_plan/expression.d.ts +109 -0
- package/dist/sync_plan/expression.js +85 -0
- package/dist/sync_plan/expression.js.map +1 -0
- package/dist/sync_plan/expression_to_sql.d.ts +43 -0
- package/dist/sync_plan/expression_to_sql.js +190 -0
- package/dist/sync_plan/expression_to_sql.js.map +1 -0
- package/dist/sync_plan/expression_visitor.d.ts +57 -0
- package/dist/sync_plan/expression_visitor.js +181 -0
- package/dist/sync_plan/expression_visitor.js.map +1 -0
- package/dist/sync_plan/plan.d.ts +196 -0
- package/dist/sync_plan/plan.js +2 -0
- package/dist/sync_plan/plan.js.map +1 -0
- package/dist/sync_plan/schema_inference.d.ts +15 -0
- package/dist/sync_plan/schema_inference.js +121 -0
- package/dist/sync_plan/schema_inference.js.map +1 -0
- package/dist/sync_plan/serialize.d.ts +82 -0
- package/dist/sync_plan/serialize.js +209 -0
- package/dist/sync_plan/serialize.js.map +1 -0
- package/dist/types/custom_sqlite_value.d.ts +1 -1
- package/dist/types/time.d.ts +24 -5
- package/dist/types/time.js +67 -12
- package/dist/types/time.js.map +1 -1
- package/dist/types.d.ts +52 -24
- package/dist/types.js +4 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +9 -2
- package/dist/utils.js +26 -3
- package/dist/utils.js.map +1 -1
- package/package.json +4 -3
- package/schema/sync_rules.json +9 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { ExpressionToSqlite, Precedence } from '../expression_to_sql.js';
|
|
2
|
+
import { MapSourceVisitor, visitExpr } from '../expression_visitor.js';
|
|
3
|
+
export function scalarStatementToSql({ filters = [], outputs = [], tableValuedFunctions = [] }) {
|
|
4
|
+
const tableValuedFunctionNames = new Map();
|
|
5
|
+
for (const fn of tableValuedFunctions) {
|
|
6
|
+
tableValuedFunctionNames.set(fn, `tbl_${tableValuedFunctionNames.size}`);
|
|
7
|
+
}
|
|
8
|
+
const toSqlite = new StatementToSqlite(tableValuedFunctionNames);
|
|
9
|
+
toSqlite.addLexeme('SELECT');
|
|
10
|
+
if (outputs.length === 0) {
|
|
11
|
+
// We need to add a bogus expression to avoid a syntax error (`SELECT WHERE ...` alone is invalid).
|
|
12
|
+
toSqlite.addLexeme('1');
|
|
13
|
+
}
|
|
14
|
+
else {
|
|
15
|
+
outputs.forEach((expr, i) => {
|
|
16
|
+
if (i != 0)
|
|
17
|
+
toSqlite.comma();
|
|
18
|
+
visitExpr(toSqlite, expr, null);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
if (tableValuedFunctionNames.size != 0) {
|
|
22
|
+
toSqlite.addLexeme('FROM');
|
|
23
|
+
let first = true;
|
|
24
|
+
tableValuedFunctionNames.forEach((name, fn) => {
|
|
25
|
+
if (!first) {
|
|
26
|
+
toSqlite.comma();
|
|
27
|
+
}
|
|
28
|
+
visitExpr(toSqlite, { type: 'function', function: fn.name, parameters: fn.inputs }, null);
|
|
29
|
+
toSqlite.addLexeme('AS');
|
|
30
|
+
toSqlite.identifier(name);
|
|
31
|
+
first = false;
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
if (filters.length != 0) {
|
|
35
|
+
toSqlite.addLexeme('WHERE');
|
|
36
|
+
filters.forEach((expr, i) => {
|
|
37
|
+
if (i != 0)
|
|
38
|
+
toSqlite.addLexeme('AND');
|
|
39
|
+
visitExpr(toSqlite, expr, Precedence.and);
|
|
40
|
+
});
|
|
41
|
+
}
|
|
42
|
+
return toSqlite.sql;
|
|
43
|
+
}
|
|
44
|
+
class StatementToSqlite extends ExpressionToSqlite {
|
|
45
|
+
tableValuedFunctionNames;
|
|
46
|
+
constructor(tableValuedFunctionNames) {
|
|
47
|
+
super();
|
|
48
|
+
this.tableValuedFunctionNames = tableValuedFunctionNames;
|
|
49
|
+
}
|
|
50
|
+
comma() {
|
|
51
|
+
this.addLexeme(',', { spaceLeft: false });
|
|
52
|
+
}
|
|
53
|
+
visitExternalData(expr) {
|
|
54
|
+
if (typeof expr.source === 'number') {
|
|
55
|
+
this.addLexeme(`?${expr.source}`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
const fn = this.tableValuedFunctionNames.get(expr.source.function);
|
|
59
|
+
this.identifier(fn);
|
|
60
|
+
this.addLexeme('.', { spaceLeft: false, spaceRight: false });
|
|
61
|
+
this.identifier(expr.source.column);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Utility to transform multiple expressions embedding parameter values into expressions that reference a parameter
|
|
67
|
+
* index representing that value.
|
|
68
|
+
*
|
|
69
|
+
* Parameter values used multiple times are de-duplicated into the same SQL parameter.
|
|
70
|
+
*/
|
|
71
|
+
export function mapExternalDataToInstantiation() {
|
|
72
|
+
const instantiation = [];
|
|
73
|
+
const columnsToIndex = new Map();
|
|
74
|
+
const requestToIndex = new Map();
|
|
75
|
+
const visitor = new MapSourceVisitor((data) => {
|
|
76
|
+
const indexIfAdded = instantiation.length + 1;
|
|
77
|
+
if ('column' in data) {
|
|
78
|
+
if (columnsToIndex.has(data)) {
|
|
79
|
+
return columnsToIndex.get(data);
|
|
80
|
+
}
|
|
81
|
+
columnsToIndex.set(data, indexIfAdded);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
if (requestToIndex.has(data)) {
|
|
85
|
+
return requestToIndex.get(data);
|
|
86
|
+
}
|
|
87
|
+
requestToIndex.set(data, indexIfAdded);
|
|
88
|
+
}
|
|
89
|
+
instantiation.push(data);
|
|
90
|
+
return indexIfAdded;
|
|
91
|
+
});
|
|
92
|
+
return {
|
|
93
|
+
instantiation,
|
|
94
|
+
transform(expr) {
|
|
95
|
+
return visitExpr(visitor, expr, null);
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=scalar_expression_engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scalar_expression_engine.js","sourceRoot":"","sources":["../../../src/sync_plan/engine/scalar_expression_engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { CompatibilityContext } from '../../compatibility.js';
|
|
2
|
+
import { ScalarExpressionEngine } from './scalar_expression_engine.js';
|
|
3
|
+
/**
|
|
4
|
+
* Creates a {@link ScalarExpressionEngine} backed by an in-memory SQLite database using `node:sqlite` APIs.
|
|
5
|
+
*
|
|
6
|
+
* @param module The imported `node:sqlite` module (passed as a parameter to ensure this package keeps working in
|
|
7
|
+
* browsers).
|
|
8
|
+
*
|
|
9
|
+
* @experimental This engine is not drop-in compatible with the JS operator implementations. So we can only use this
|
|
10
|
+
* engine when a new compatibility option is enabled. Currently, it is only used in tests.
|
|
11
|
+
*/
|
|
12
|
+
export declare function nodeSqliteExpressionEngine(module: typeof import('node:sqlite'), compatibility: CompatibilityContext): ScalarExpressionEngine;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { CompatibilityOption } from '../../compatibility.js';
|
|
2
|
+
import { generateSqlFunctions } from '../../index.js';
|
|
3
|
+
import { scalarStatementToSql } from './scalar_expression_engine.js';
|
|
4
|
+
/**
|
|
5
|
+
* Creates a {@link ScalarExpressionEngine} backed by an in-memory SQLite database using `node:sqlite` APIs.
|
|
6
|
+
*
|
|
7
|
+
* @param module The imported `node:sqlite` module (passed as a parameter to ensure this package keeps working in
|
|
8
|
+
* browsers).
|
|
9
|
+
*
|
|
10
|
+
* @experimental This engine is not drop-in compatible with the JS operator implementations. So we can only use this
|
|
11
|
+
* engine when a new compatibility option is enabled. Currently, it is only used in tests.
|
|
12
|
+
*/
|
|
13
|
+
export function nodeSqliteExpressionEngine(module, compatibility) {
|
|
14
|
+
const db = new module.DatabaseSync(':memory:', { readOnly: true, readBigInts: true, returnArrays: true });
|
|
15
|
+
const functions = generateSqlFunctions(compatibility);
|
|
16
|
+
function registerPowerSyncFunction(name) {
|
|
17
|
+
const impl = functions.named[name];
|
|
18
|
+
db.function(name, { useBigIntArguments: true, varargs: true, deterministic: true }, (...args) => {
|
|
19
|
+
return impl.call(...args);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
// Needed to make them deterministic / prevent passing 'now'
|
|
23
|
+
registerPowerSyncFunction('unixepoch');
|
|
24
|
+
registerPowerSyncFunction('datetime');
|
|
25
|
+
registerPowerSyncFunction('st_asgeojson');
|
|
26
|
+
registerPowerSyncFunction('st_astext');
|
|
27
|
+
registerPowerSyncFunction('st_x');
|
|
28
|
+
registerPowerSyncFunction('st_y');
|
|
29
|
+
if (!compatibility.isEnabled(CompatibilityOption.fixedJsonExtract)) {
|
|
30
|
+
// For backwards compatibility, use the old JSON operators which parse the path argument differently.
|
|
31
|
+
db.function('->', { useBigIntArguments: true, varargs: true, deterministic: true }, (...args) => {
|
|
32
|
+
return functions.operatorJsonExtractJson.call(...args);
|
|
33
|
+
});
|
|
34
|
+
db.function('->>', { useBigIntArguments: true, varargs: true, deterministic: true }, (...args) => {
|
|
35
|
+
return functions.operatorJsonExtractSql.call(...args);
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
return {
|
|
39
|
+
prepareEvaluator(input) {
|
|
40
|
+
const stmt = db.prepare(scalarStatementToSql(input));
|
|
41
|
+
return {
|
|
42
|
+
evaluate(inputs) {
|
|
43
|
+
// Types are wrong, all() will return a SqliteValue[][] because returnArrays is enabled.
|
|
44
|
+
return stmt.all(...inputs);
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
},
|
|
48
|
+
close() {
|
|
49
|
+
db.close();
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=sqlite.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/sync_plan/engine/sqlite.ts"],"names":[],"mappings":"AAAA,OAAO,EAAwB,mBAAmB,EAAE,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAEtD,OAAO,EAAqD,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAExH;;;;;;;;GAQG;AACH,MAAM,UAAU,0BAA0B,CACxC,MAAoC,EACpC,aAAmC;IAEnC,MAAM,EAAE,GAAG,IAAI,MAAM,CAAC,YAAY,CAAC,UAAU,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,YAAY,EAAE,IAAI,EAAS,CAAC,CAAC;IACjH,MAAM,SAAS,GAAG,oBAAoB,CAAC,aAAa,CAAC,CAAC;IAEtD,SAAS,yBAAyB,CAAC,IAAY;QAC7C,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAE,CAAC;QAEpC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YAC9F,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QAC5B,CAAC,CAAC,CAAC;IACL,CAAC;IAED,4DAA4D;IAC5D,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACvC,yBAAyB,CAAC,UAAU,CAAC,CAAC;IAEtC,yBAAyB,CAAC,cAAc,CAAC,CAAC;IAC1C,yBAAyB,CAAC,WAAW,CAAC,CAAC;IACvC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAClC,yBAAyB,CAAC,MAAM,CAAC,CAAC;IAElC,IAAI,CAAC,aAAa,CAAC,SAAS,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,CAAC;QACnE,qGAAqG;QACrG,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YAC9F,OAAO,SAAS,CAAC,uBAAuB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACzD,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YAC/F,OAAO,SAAS,CAAC,sBAAsB,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;IACL,CAAC;IAED,OAAO;QACL,gBAAgB,CAAC,KAAK;YACpB,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;YACrD,OAAO;gBACL,QAAQ,CAAC,MAAM;oBACb,wFAAwF;oBACxF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAA+B,CAAC;gBAC3D,CAAC;aACF,CAAC;QACJ,CAAC;QACD,KAAK;YACH,EAAE,CAAC,KAAK,EAAE,CAAC;QACb,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { BucketDataSource } from '../../BucketSource.js';
|
|
2
|
+
import { ColumnDefinition } from '../../ExpressionType.js';
|
|
3
|
+
import { SourceTableInterface } from '../../SourceTableInterface.js';
|
|
4
|
+
import { TablePattern } from '../../TablePattern.js';
|
|
5
|
+
import { EvaluateRowOptions, SourceSchema, UnscopedEvaluationResult } from '../../types.js';
|
|
6
|
+
import * as plan from '../plan.js';
|
|
7
|
+
import { StreamEvaluationContext } from './index.js';
|
|
8
|
+
export declare class PreparedStreamBucketDataSource implements BucketDataSource {
|
|
9
|
+
readonly source: plan.StreamBucketDataSource;
|
|
10
|
+
private readonly sourceTables;
|
|
11
|
+
private readonly sources;
|
|
12
|
+
constructor(source: plan.StreamBucketDataSource, context: StreamEvaluationContext);
|
|
13
|
+
get uniqueName(): string;
|
|
14
|
+
get bucketParameters(): string[];
|
|
15
|
+
getSourceTables(): Set<TablePattern>;
|
|
16
|
+
private sourcesForTable;
|
|
17
|
+
tableSyncsData(table: SourceTableInterface): boolean;
|
|
18
|
+
evaluateRow(options: EvaluateRowOptions): UnscopedEvaluationResult[];
|
|
19
|
+
resolveResultSets(schema: SourceSchema, tables: Record<string, Record<string, ColumnDefinition>>): void;
|
|
20
|
+
debugWriteOutputTables(result: Record<string, {
|
|
21
|
+
query: string;
|
|
22
|
+
}[]>): void;
|
|
23
|
+
}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
import { filterJsonRow, idFromData, isJsonValue, isValidParameterValue, JSONBucketNameSerialize } from '../../utils.js';
|
|
2
|
+
import { ExpressionToSqlite } from '../expression_to_sql.js';
|
|
3
|
+
import { mapExternalDataToInstantiation, scalarStatementToSql } from '../engine/scalar_expression_engine.js';
|
|
4
|
+
import { SyncPlanSchemaAnalyzer } from '../schema_inference.js';
|
|
5
|
+
export class PreparedStreamBucketDataSource {
|
|
6
|
+
source;
|
|
7
|
+
sourceTables = new Set();
|
|
8
|
+
sources = [];
|
|
9
|
+
constructor(source, context) {
|
|
10
|
+
this.source = source;
|
|
11
|
+
for (const data of source.sources) {
|
|
12
|
+
const prepared = new PreparedStreamDataSource(data, context);
|
|
13
|
+
this.sources.push(prepared);
|
|
14
|
+
this.sourceTables.add(prepared.tablePattern);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
get uniqueName() {
|
|
18
|
+
return this.source.uniqueName;
|
|
19
|
+
}
|
|
20
|
+
get bucketParameters() {
|
|
21
|
+
// We can pick an arbitrary evaluator within the source, since they're all guaranteed to have the same parameters.
|
|
22
|
+
const evaluator = this.source.sources[0];
|
|
23
|
+
// It doesn't matter what we return here because it's for debugging purposes only.
|
|
24
|
+
return evaluator.parameters.map((p) => ExpressionToSqlite.toSqlite(p.expr));
|
|
25
|
+
}
|
|
26
|
+
getSourceTables() {
|
|
27
|
+
return this.sourceTables;
|
|
28
|
+
}
|
|
29
|
+
*sourcesForTable(table) {
|
|
30
|
+
for (const source of this.sources) {
|
|
31
|
+
if (source.tablePattern.matches(table)) {
|
|
32
|
+
yield source;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
tableSyncsData(table) {
|
|
37
|
+
return !this.sourcesForTable(table).next().done;
|
|
38
|
+
}
|
|
39
|
+
evaluateRow(options) {
|
|
40
|
+
const results = [];
|
|
41
|
+
for (const source of this.sourcesForTable(options.sourceTable)) {
|
|
42
|
+
source.evaluateRow(options, results);
|
|
43
|
+
}
|
|
44
|
+
return results;
|
|
45
|
+
}
|
|
46
|
+
resolveResultSets(schema, tables) {
|
|
47
|
+
const analyzer = new SyncPlanSchemaAnalyzer(schema);
|
|
48
|
+
for (const source of this.source.sources) {
|
|
49
|
+
analyzer.resolveResultSets(source, tables);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
debugWriteOutputTables(result) {
|
|
53
|
+
for (const source of this.sources) {
|
|
54
|
+
const table = source.fixedOutputTableName;
|
|
55
|
+
if (table != null) {
|
|
56
|
+
const queries = (result[table] ??= []);
|
|
57
|
+
queries.push({ query: source.debugSql });
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
class PreparedStreamDataSource {
|
|
63
|
+
tablePattern;
|
|
64
|
+
outputs = [];
|
|
65
|
+
numberOfOutputExpressions;
|
|
66
|
+
numberOfParameters;
|
|
67
|
+
evaluator;
|
|
68
|
+
evaluatorInputs;
|
|
69
|
+
fixedOutputTableName;
|
|
70
|
+
debugSql;
|
|
71
|
+
constructor(evaluator, { engine }) {
|
|
72
|
+
const mapExpressions = mapExternalDataToInstantiation();
|
|
73
|
+
const outputExpressions = [];
|
|
74
|
+
for (const column of evaluator.columns) {
|
|
75
|
+
if (column === 'star') {
|
|
76
|
+
this.outputs.push('star');
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
const expressionIndex = outputExpressions.length;
|
|
80
|
+
outputExpressions.push(mapExpressions.transform(column.expr));
|
|
81
|
+
this.outputs.push({ index: expressionIndex, alias: column.alias });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
this.numberOfOutputExpressions = outputExpressions.length;
|
|
85
|
+
for (const parameter of evaluator.parameters) {
|
|
86
|
+
outputExpressions.push(mapExpressions.transform(parameter.expr));
|
|
87
|
+
}
|
|
88
|
+
this.numberOfParameters = evaluator.parameters.length;
|
|
89
|
+
const evaluatorOptions = {
|
|
90
|
+
outputs: outputExpressions,
|
|
91
|
+
filters: evaluator.filters.map((f) => mapExpressions.transform(f))
|
|
92
|
+
};
|
|
93
|
+
this.debugSql = scalarStatementToSql(evaluatorOptions);
|
|
94
|
+
this.evaluator = engine.prepareEvaluator(evaluatorOptions);
|
|
95
|
+
this.fixedOutputTableName = evaluator.outputTableName;
|
|
96
|
+
this.tablePattern = evaluator.sourceTable;
|
|
97
|
+
this.evaluatorInputs = mapExpressions.instantiation;
|
|
98
|
+
}
|
|
99
|
+
evaluateRow(options, results) {
|
|
100
|
+
try {
|
|
101
|
+
const inputInstantiation = this.evaluatorInputs.map((input) => options.record[input.column]);
|
|
102
|
+
row: for (const source of this.evaluator.evaluate(inputInstantiation)) {
|
|
103
|
+
const record = {};
|
|
104
|
+
for (const output of this.outputs) {
|
|
105
|
+
if (output === 'star') {
|
|
106
|
+
Object.assign(record, filterJsonRow(options.record));
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
const value = source[output.index];
|
|
110
|
+
if (isJsonValue(value)) {
|
|
111
|
+
record[output.alias] = value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
const id = idFromData(record);
|
|
116
|
+
// source is [...outputs, ...partitionValues]
|
|
117
|
+
const partitionValues = source.splice(this.numberOfOutputExpressions, this.numberOfParameters);
|
|
118
|
+
for (const bucketParameter of partitionValues) {
|
|
119
|
+
if (!isValidParameterValue(bucketParameter)) {
|
|
120
|
+
continue row;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
results.push({
|
|
124
|
+
id,
|
|
125
|
+
data: record,
|
|
126
|
+
table: this.fixedOutputTableName ?? options.sourceTable.name,
|
|
127
|
+
serializedBucketParameters: JSONBucketNameSerialize.stringify(partitionValues)
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
return results;
|
|
131
|
+
}
|
|
132
|
+
catch (e) {
|
|
133
|
+
return results.push({ error: e.message });
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=bucket_data_source.js.map
|
|
@@ -0,0 +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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"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { BucketDataSource, BucketSource, BucketSourceType, CreateSourceParams, HydratedBucketSource, ParameterIndexLookupCreator } from '../../BucketSource.js';
|
|
2
|
+
import { StreamEvaluationContext } from './index.js';
|
|
3
|
+
import * as plan from '../plan.js';
|
|
4
|
+
export interface StreamInput extends StreamEvaluationContext {
|
|
5
|
+
preparedBuckets: Map<plan.StreamBucketDataSource, BucketDataSource>;
|
|
6
|
+
preparedLookups: Map<plan.StreamParameterIndexLookupCreator, ParameterIndexLookupCreator>;
|
|
7
|
+
}
|
|
8
|
+
export declare class StreamBucketSource implements BucketSource {
|
|
9
|
+
readonly stream: plan.CompiledSyncStream;
|
|
10
|
+
private readonly input;
|
|
11
|
+
readonly dataSources: BucketDataSource[];
|
|
12
|
+
readonly parameterIndexLookupCreators: ParameterIndexLookupCreator[];
|
|
13
|
+
constructor(stream: plan.CompiledSyncStream, input: StreamInput);
|
|
14
|
+
get name(): string;
|
|
15
|
+
get subscribedToByDefault(): boolean;
|
|
16
|
+
get type(): BucketSourceType;
|
|
17
|
+
debugRepresentation(): string;
|
|
18
|
+
hydrate(params: CreateSourceParams): HydratedBucketSource;
|
|
19
|
+
}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
import { BucketSourceType } from '../../BucketSource.js';
|
|
2
|
+
import { mapExternalDataToInstantiation } from '../engine/scalar_expression_engine.js';
|
|
3
|
+
import { parametersForRequest, RequestParameterEvaluators } from './parameter_evaluator.js';
|
|
4
|
+
import { buildBucketName, JSONBucketNameSerialize } from '../../utils.js';
|
|
5
|
+
export class StreamBucketSource {
|
|
6
|
+
stream;
|
|
7
|
+
input;
|
|
8
|
+
dataSources = [];
|
|
9
|
+
parameterIndexLookupCreators = [];
|
|
10
|
+
constructor(stream, input) {
|
|
11
|
+
this.stream = stream;
|
|
12
|
+
this.input = input;
|
|
13
|
+
for (const querier of stream.queriers) {
|
|
14
|
+
const mappedSource = input.preparedBuckets.get(querier.bucket);
|
|
15
|
+
this.dataSources.push(mappedSource);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
get name() {
|
|
19
|
+
return this.stream.stream.name;
|
|
20
|
+
}
|
|
21
|
+
get subscribedToByDefault() {
|
|
22
|
+
return this.stream.stream.isSubscribedByDefault;
|
|
23
|
+
}
|
|
24
|
+
get type() {
|
|
25
|
+
return BucketSourceType.SYNC_STREAM;
|
|
26
|
+
}
|
|
27
|
+
debugRepresentation() {
|
|
28
|
+
// TODO: Implement debugRepresentation for compiled sync streams
|
|
29
|
+
return `stream ${this.stream.stream.name}`;
|
|
30
|
+
}
|
|
31
|
+
hydrate(params) {
|
|
32
|
+
const queriers = this.stream.queriers.map((q) => new PreparedQuerier(this.stream.stream, q, this.input));
|
|
33
|
+
return {
|
|
34
|
+
definition: this,
|
|
35
|
+
pushBucketParameterQueriers: (result, options) => {
|
|
36
|
+
const subscriptions = options.streams[this.name] ?? [];
|
|
37
|
+
if (!this.subscribedToByDefault && !subscriptions.length) {
|
|
38
|
+
// The client is not subscribing to this stream, so don't query buckets related to it.
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
let hasExplicitDefaultSubscription = false;
|
|
42
|
+
for (const subscription of subscriptions) {
|
|
43
|
+
let subscriptionParams = options.globalParameters;
|
|
44
|
+
if (subscription.parameters != null) {
|
|
45
|
+
subscriptionParams = subscriptionParams.withAddedStreamParameters(subscription.parameters);
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
hasExplicitDefaultSubscription = true;
|
|
49
|
+
}
|
|
50
|
+
for (const querier of queriers) {
|
|
51
|
+
querier.querierForSubscription(params, result, subscriptionParams, subscription);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// If the stream is subscribed to by default and there is no explicit subscription that would match the default
|
|
55
|
+
// subscription, also include the default querier.
|
|
56
|
+
if (this.subscribedToByDefault && !hasExplicitDefaultSubscription) {
|
|
57
|
+
for (const querier of queriers) {
|
|
58
|
+
querier.querierForSubscription(params, result, options.globalParameters, null);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
class PreparedQuerier {
|
|
66
|
+
stream;
|
|
67
|
+
matchesParameters;
|
|
68
|
+
lookupStages;
|
|
69
|
+
dataSource;
|
|
70
|
+
constructor(stream, querier, options) {
|
|
71
|
+
this.stream = stream;
|
|
72
|
+
this.dataSource = options.preparedBuckets.get(querier.bucket);
|
|
73
|
+
this.matchesParameters = PreparedQuerier.prepareFilters(options.engine, querier.requestFilters);
|
|
74
|
+
this.lookupStages = RequestParameterEvaluators.prepare(querier.lookupStages, querier.sourceInstantiation, options);
|
|
75
|
+
}
|
|
76
|
+
querierForSubscription(hydration, result, params, subscription) {
|
|
77
|
+
const reason = subscription != null ? { subscription: subscription.opaque_id } : 'default';
|
|
78
|
+
try {
|
|
79
|
+
if (!this.matchesParameters(params)) {
|
|
80
|
+
return;
|
|
81
|
+
}
|
|
82
|
+
const subscriptionEvaluators = this.lookupStages.clone();
|
|
83
|
+
subscriptionEvaluators.partiallyInstantiate({ request: params });
|
|
84
|
+
if (subscriptionEvaluators.isDefinitelyUninstantiable()) {
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
const bucketScope = hydration.hydrationState.getBucketSourceScope(this.dataSource);
|
|
88
|
+
const parametersToBucket = (instantiation) => {
|
|
89
|
+
return {
|
|
90
|
+
definition: this.stream.name,
|
|
91
|
+
inclusion_reasons: [reason],
|
|
92
|
+
bucket: buildBucketName(bucketScope, JSONBucketNameSerialize.stringify(instantiation)),
|
|
93
|
+
priority: this.stream.priority
|
|
94
|
+
};
|
|
95
|
+
};
|
|
96
|
+
// Do we need parameter lookups to resolve parameters?
|
|
97
|
+
const staticInstantiation = subscriptionEvaluators.extractFullInstantiation();
|
|
98
|
+
if (staticInstantiation) {
|
|
99
|
+
// We don't! Return static querier.
|
|
100
|
+
result.queriers.push({
|
|
101
|
+
staticBuckets: staticInstantiation.map(parametersToBucket),
|
|
102
|
+
hasDynamicBuckets: false,
|
|
103
|
+
async queryDynamicBucketDescriptions() {
|
|
104
|
+
return [];
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
result.queriers.push({
|
|
110
|
+
staticBuckets: [],
|
|
111
|
+
hasDynamicBuckets: true,
|
|
112
|
+
async queryDynamicBucketDescriptions(source) {
|
|
113
|
+
const evaluators = subscriptionEvaluators.clone();
|
|
114
|
+
const instantiation = await evaluators.instantiate({
|
|
115
|
+
hydrationState: hydration.hydrationState,
|
|
116
|
+
source,
|
|
117
|
+
request: params
|
|
118
|
+
});
|
|
119
|
+
return [...instantiation].map(parametersToBucket);
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
catch (e) {
|
|
125
|
+
result.errors.push({
|
|
126
|
+
descriptor: this.stream.name,
|
|
127
|
+
message: `Error evaluating bucket ids: ${e.message}`,
|
|
128
|
+
subscription: subscription ?? undefined
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
static prepareFilters(engine, requestFilters) {
|
|
133
|
+
const mapExpressions = mapExternalDataToInstantiation();
|
|
134
|
+
const evaluator = engine.prepareEvaluator({
|
|
135
|
+
outputs: [],
|
|
136
|
+
filters: requestFilters.map((f) => mapExpressions.transform(f))
|
|
137
|
+
});
|
|
138
|
+
const instantiation = mapExpressions.instantiation;
|
|
139
|
+
return (parameters) => {
|
|
140
|
+
// We've added request filters as filters to prepareEvaluator, so if we get a row then the subscription matches.
|
|
141
|
+
return evaluator.evaluate(parametersForRequest(parameters, instantiation)).length != 0;
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=bucket_source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bucket_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { SqlSyncRules } from '../../SqlSyncRules.js';
|
|
2
|
+
import * as plan from '../plan.js';
|
|
3
|
+
import { ScalarExpressionEngine } from '../engine/scalar_expression_engine.js';
|
|
4
|
+
export interface StreamEvaluationContext {
|
|
5
|
+
engine: ScalarExpressionEngine;
|
|
6
|
+
}
|
|
7
|
+
export declare function addPrecompiledSyncPlanToRules(plan: plan.SyncPlan, rules: SqlSyncRules, context: StreamEvaluationContext): void;
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { PreparedStreamBucketDataSource } from './bucket_data_source.js';
|
|
2
|
+
import { PreparedParameterIndexLookupCreator } from './parameter_index_lookup_creator.js';
|
|
3
|
+
import { StreamBucketSource } from './bucket_source.js';
|
|
4
|
+
export function addPrecompiledSyncPlanToRules(plan, rules, context) {
|
|
5
|
+
const preparedBuckets = new Map();
|
|
6
|
+
const preparedLookups = new Map();
|
|
7
|
+
for (const bucket of plan.buckets) {
|
|
8
|
+
const prepared = new PreparedStreamBucketDataSource(bucket, context);
|
|
9
|
+
preparedBuckets.set(bucket, prepared);
|
|
10
|
+
rules.bucketDataSources.push(prepared);
|
|
11
|
+
}
|
|
12
|
+
for (const parameter of plan.parameterIndexes) {
|
|
13
|
+
const prepared = new PreparedParameterIndexLookupCreator(parameter, context);
|
|
14
|
+
preparedLookups.set(parameter, prepared);
|
|
15
|
+
rules.bucketParameterLookupSources.push(prepared);
|
|
16
|
+
}
|
|
17
|
+
const streamInput = {
|
|
18
|
+
...context,
|
|
19
|
+
preparedBuckets,
|
|
20
|
+
preparedLookups
|
|
21
|
+
};
|
|
22
|
+
for (const stream of plan.streams) {
|
|
23
|
+
rules.bucketSources.push(new StreamBucketSource(stream, streamInput));
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAC1F,OAAO,EAAE,kBAAkB,EAAe,MAAM,oBAAoB,CAAC;AAOrE,MAAM,UAAU,6BAA6B,CAC3C,IAAmB,EACnB,KAAmB,EACnB,OAAgC;IAEhC,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+D,CAAC;IAC/F,MAAM,eAAe,GAAG,IAAI,GAAG,EAA+E,CAAC;IAE/G,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,8BAA8B,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrE,eAAe,CAAC,GAAG,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACtC,KAAK,CAAC,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACzC,CAAC;IAED,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;QAC9C,MAAM,QAAQ,GAAG,IAAI,mCAAmC,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;QAC7E,eAAe,CAAC,GAAG,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACzC,KAAK,CAAC,4BAA4B,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,WAAW,GAAgB;QAC/B,GAAG,OAAO;QACV,eAAe;QACf,eAAe;KAChB,CAAC;IACF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,EAAE,CAAC;QAClC,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,kBAAkB,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC;IACxE,CAAC;AACH,CAAC"}
|