@powersync/service-sync-rules 0.35.0 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -3
- package/dist/BaseSqlDataQuery.d.ts +4 -4
- package/dist/BaseSqlDataQuery.js.map +1 -1
- package/dist/BucketDescription.d.ts +1 -1
- package/dist/BucketParameterQuerier.d.ts +23 -1
- package/dist/BucketParameterQuerier.js +24 -0
- package/dist/BucketParameterQuerier.js.map +1 -1
- package/dist/BucketSource.d.ts +36 -29
- package/dist/BucketSource.js +12 -28
- package/dist/BucketSource.js.map +1 -1
- package/dist/HydratedSyncConfig.d.ts +80 -0
- package/dist/HydratedSyncConfig.js +207 -0
- package/dist/HydratedSyncConfig.js.map +1 -0
- package/dist/HydrationState.d.ts +29 -6
- package/dist/HydrationState.js +17 -5
- package/dist/HydrationState.js.map +1 -1
- package/dist/SourceTableRef.d.ts +9 -0
- package/dist/SourceTableRef.js +4 -0
- package/dist/SourceTableRef.js.map +1 -0
- package/dist/SqlBucketDescriptor.d.ts +5 -4
- package/dist/SqlBucketDescriptor.js +3 -0
- package/dist/SqlBucketDescriptor.js.map +1 -1
- package/dist/SqlDataQuery.d.ts +2 -2
- package/dist/SqlDataQuery.js.map +1 -1
- package/dist/SqlParameterQuery.d.ts +8 -7
- package/dist/SqlParameterQuery.js +8 -4
- package/dist/SqlParameterQuery.js.map +1 -1
- package/dist/SqlSyncRules.d.ts +1 -1
- package/dist/StaticSqlParameterQuery.d.ts +2 -2
- package/dist/StaticSqlParameterQuery.js.map +1 -1
- package/dist/StorageVersion.d.ts +27 -0
- package/dist/StorageVersion.js +17 -0
- package/dist/StorageVersion.js.map +1 -0
- package/dist/SyncConfig.d.ts +17 -11
- package/dist/SyncConfig.js +17 -19
- package/dist/SyncConfig.js.map +1 -1
- package/dist/TablePattern.d.ts +8 -2
- package/dist/TablePattern.js +8 -0
- package/dist/TablePattern.js.map +1 -1
- package/dist/TableValuedFunctionSqlParameterQuery.d.ts +2 -2
- package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
- package/dist/TableValuedFunctions.js +16 -10
- package/dist/TableValuedFunctions.js.map +1 -1
- package/dist/cast.js +7 -5
- package/dist/cast.js.map +1 -1
- package/dist/compatibility.d.ts +3 -1
- package/dist/compatibility.js +12 -3
- package/dist/compatibility.js.map +1 -1
- package/dist/compiler/compiler.d.ts +2 -2
- package/dist/compiler/equality.d.ts +2 -0
- package/dist/compiler/equality.js +36 -0
- package/dist/compiler/equality.js.map +1 -1
- package/dist/compiler/parser.d.ts +1 -1
- package/dist/compiler/parser.js +7 -5
- package/dist/compiler/parser.js.map +1 -1
- package/dist/compiler/querier_graph.js +13 -2
- package/dist/compiler/querier_graph.js.map +1 -1
- package/dist/compiler/scope.d.ts +2 -2
- package/dist/compiler/scope.js +2 -1
- package/dist/compiler/scope.js.map +1 -1
- package/dist/compiler/sqlite.d.ts +4 -0
- package/dist/compiler/sqlite.js.map +1 -1
- package/dist/compiler/table.d.ts +26 -0
- package/dist/compiler/table.js +76 -0
- package/dist/compiler/table.js.map +1 -1
- package/dist/events/SqlEventDescriptor.d.ts +3 -3
- package/dist/events/SqlEventDescriptor.js +1 -1
- package/dist/events/SqlEventDescriptor.js.map +1 -1
- package/dist/events/SqlEventSourceQuery.d.ts +2 -2
- package/dist/events/SqlEventSourceQuery.js.map +1 -1
- package/dist/from_yaml.js +83 -19
- package/dist/from_yaml.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.js +4 -4
- package/dist/index.js.map +1 -1
- package/dist/json_schema.js +7 -0
- package/dist/json_schema.js.map +1 -1
- package/dist/sql_functions.d.ts +4 -4
- package/dist/sql_functions.js +12 -6
- package/dist/sql_functions.js.map +1 -1
- package/dist/streams/filter.d.ts +8 -7
- package/dist/streams/filter.js +5 -3
- package/dist/streams/filter.js.map +1 -1
- package/dist/streams/stream.d.ts +5 -4
- package/dist/streams/stream.js +3 -0
- package/dist/streams/stream.js.map +1 -1
- package/dist/streams/variant.js +2 -2
- package/dist/streams/variant.js.map +1 -1
- package/dist/sync_plan/engine/factory.d.ts +4 -0
- package/dist/sync_plan/engine/factory.js +13 -0
- package/dist/sync_plan/engine/factory.js.map +1 -0
- package/dist/sync_plan/engine/javascript.js +0 -1
- package/dist/sync_plan/engine/javascript.js.map +1 -1
- package/dist/sync_plan/engine/scalar_expression_engine.d.ts +0 -4
- package/dist/sync_plan/engine/scalar_expression_engine.js +2 -2
- package/dist/sync_plan/engine/scalar_expression_engine.js.map +1 -1
- package/dist/sync_plan/engine/sqlite.d.ts +26 -5
- package/dist/sync_plan/engine/sqlite.js +38 -23
- package/dist/sync_plan/engine/sqlite.js.map +1 -1
- package/dist/sync_plan/evaluator/bucket_data_source.d.ts +6 -7
- package/dist/sync_plan/evaluator/bucket_data_source.js +67 -57
- package/dist/sync_plan/evaluator/bucket_data_source.js.map +1 -1
- package/dist/sync_plan/evaluator/bucket_source.d.ts +2 -2
- package/dist/sync_plan/evaluator/bucket_source.js +4 -4
- package/dist/sync_plan/evaluator/bucket_source.js.map +1 -1
- package/dist/sync_plan/evaluator/index.d.ts +0 -2
- package/dist/sync_plan/evaluator/index.js.map +1 -1
- package/dist/sync_plan/evaluator/parameter_evaluator.d.ts +52 -3
- package/dist/sync_plan/evaluator/parameter_evaluator.js +238 -25
- package/dist/sync_plan/evaluator/parameter_evaluator.js.map +1 -1
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.d.ts +9 -11
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js +63 -32
- package/dist/sync_plan/evaluator/parameter_index_lookup_creator.js.map +1 -1
- package/dist/sync_plan/expression.js +1 -1
- package/dist/sync_plan/expression.js.map +1 -1
- package/dist/sync_plan/expression_to_sql.js +1 -1
- package/dist/sync_plan/expression_to_sql.js.map +1 -1
- package/dist/sync_plan/expression_visitor.d.ts +4 -1
- package/dist/sync_plan/expression_visitor.js +21 -12
- package/dist/sync_plan/expression_visitor.js.map +1 -1
- package/dist/sync_plan/plan.d.ts +3 -3
- package/dist/sync_plan/serialize.d.ts +2 -2
- package/dist/types/custom_sqlite_value.d.ts +1 -1
- package/dist/types/custom_sqlite_value.js +1 -1
- package/dist/types.d.ts +13 -3
- package/dist/types.js +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +2 -1
- package/dist/utils.js +14 -1
- package/dist/utils.js.map +1 -1
- package/package.json +6 -6
- package/schema/sync_rules.json +13 -0
- package/dist/HydratedSyncRules.d.ts +0 -46
- package/dist/HydratedSyncRules.js +0 -88
- package/dist/HydratedSyncRules.js.map +0 -1
- package/dist/SourceTableInterface.d.ts +0 -5
- package/dist/SourceTableInterface.js +0 -2
- package/dist/SourceTableInterface.js.map +0 -1
|
@@ -1,21 +1,48 @@
|
|
|
1
|
-
import { CompatibilityOption } from '../../compatibility.js';
|
|
2
1
|
import { evaluateOperator, generateSqlFunctions } from '../../index.js';
|
|
3
2
|
import { scalarStatementToSql } from './scalar_expression_engine.js';
|
|
4
3
|
/**
|
|
5
|
-
*
|
|
4
|
+
* A {@link SQLite} implementation based on builtin `node:sqlite` support.
|
|
5
|
+
*/
|
|
6
|
+
export function nodeSqlite(module) {
|
|
7
|
+
return {
|
|
8
|
+
openInMemory() {
|
|
9
|
+
// We don't close this database instance, which is acceptable. It's an in-memory database, so we don't care about
|
|
10
|
+
// closing file descriptors at a specific point in time. Node makes the destructor run when V8 deallocates the JS
|
|
11
|
+
// object (the DatabaseSync::DatabaseSync() constructor calls MakeWeak(), and DatabaseSync::~DatabaseSync calls
|
|
12
|
+
// sqlite3_close_v2, see node_sqlite.cc).
|
|
13
|
+
const db = new module.DatabaseSync(':memory:', { readOnly: true, readBigInts: true, returnArrays: true });
|
|
14
|
+
return {
|
|
15
|
+
registerFunction(name, options, func) {
|
|
16
|
+
db.function(name, { useBigIntArguments: true, varargs: options.variadic, deterministic: true }, func);
|
|
17
|
+
},
|
|
18
|
+
prepare(sql) {
|
|
19
|
+
// Note: Like databases, node will finalize the underlying statement once it's no longer referenced from JS.
|
|
20
|
+
const stmt = db.prepare(sql);
|
|
21
|
+
return {
|
|
22
|
+
run(inputs) {
|
|
23
|
+
// Types are wrong, all() will return a SqliteValue[][] because returnArrays is enabled.
|
|
24
|
+
return stmt.all(...inputs);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Creates a {@link ScalarExpressionEngine} backed by an in-memory SQLite database.
|
|
6
34
|
*
|
|
7
|
-
* @param
|
|
8
|
-
* browsers).
|
|
35
|
+
* @param sqlite The {@link SQLite} implementation to use.
|
|
9
36
|
*
|
|
10
37
|
* @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.
|
|
38
|
+
* engine when a new compatibility option is enabled.
|
|
12
39
|
*/
|
|
13
|
-
export function
|
|
14
|
-
const db =
|
|
40
|
+
export function sqliteExpressionEngine(sqlite, compatibility) {
|
|
41
|
+
const db = sqlite.openInMemory();
|
|
15
42
|
const functions = generateSqlFunctions(compatibility);
|
|
16
43
|
function registerPowerSyncFunction(name) {
|
|
17
44
|
const impl = functions.named[name];
|
|
18
|
-
db.
|
|
45
|
+
db.registerFunction(name, { variadic: true }, (...args) => {
|
|
19
46
|
return impl.call(...args);
|
|
20
47
|
});
|
|
21
48
|
}
|
|
@@ -26,28 +53,16 @@ export function nodeSqliteExpressionEngine(module, compatibility) {
|
|
|
26
53
|
registerPowerSyncFunction('st_astext');
|
|
27
54
|
registerPowerSyncFunction('st_x');
|
|
28
55
|
registerPowerSyncFunction('st_y');
|
|
29
|
-
db.
|
|
30
|
-
if (!compatibility.isEnabled(CompatibilityOption.fixedJsonExtract)) {
|
|
31
|
-
// For backwards compatibility, use the old JSON operators which parse the path argument differently.
|
|
32
|
-
db.function('->', { useBigIntArguments: true, varargs: true, deterministic: true }, (...args) => {
|
|
33
|
-
return functions.operatorJsonExtractJson.call(...args);
|
|
34
|
-
});
|
|
35
|
-
db.function('->>', { useBigIntArguments: true, varargs: true, deterministic: true }, (...args) => {
|
|
36
|
-
return functions.operatorJsonExtractSql.call(...args);
|
|
37
|
-
});
|
|
38
|
-
}
|
|
56
|
+
db.registerFunction('ps_json_contains', { variadic: false }, (a, b) => evaluateOperator('IN', a, b));
|
|
39
57
|
return {
|
|
40
58
|
prepareEvaluator(input) {
|
|
59
|
+
// Note: Like databases, node will finalize the underlying statement once it's no longer referenced from JS.
|
|
41
60
|
const stmt = db.prepare(scalarStatementToSql(input));
|
|
42
61
|
return {
|
|
43
62
|
evaluate(inputs) {
|
|
44
|
-
|
|
45
|
-
return stmt.all(...inputs);
|
|
63
|
+
return stmt.run(inputs);
|
|
46
64
|
}
|
|
47
65
|
};
|
|
48
|
-
},
|
|
49
|
-
close() {
|
|
50
|
-
db.close();
|
|
51
66
|
}
|
|
52
67
|
};
|
|
53
68
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/sync_plan/engine/sqlite.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../../../src/sync_plan/engine/sqlite.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAExE,OAAO,EAAqD,oBAAoB,EAAE,MAAM,+BAA+B,CAAC;AAoBxH;;GAEG;AACH,MAAM,UAAU,UAAU,CAAC,MAAoC;IAC7D,OAAO;QACL,YAAY;YACV,iHAAiH;YACjH,iHAAiH;YACjH,+GAA+G;YAC/G,yCAAyC;YACzC,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;YAEjH,OAAO;gBACL,gBAAgB,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI;oBAClC,EAAE,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,QAAQ,EAAE,aAAa,EAAE,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;gBACxG,CAAC;gBACD,OAAO,CAAC,GAAG;oBACT,4GAA4G;oBAC5G,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;oBAC7B,OAAO;wBACL,GAAG,CAAC,MAAM;4BACR,wFAAwF;4BACxF,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,MAAM,CAA+B,CAAC;wBAC3D,CAAC;qBACF,CAAC;gBACJ,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CAAC,MAAc,EAAE,aAAmC;IACxF,MAAM,EAAE,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACjC,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,gBAAgB,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,EAAE,EAAE;YACxD,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,EAAE,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAErG,OAAO;QACL,gBAAgB,CAAC,KAAK;YACpB,4GAA4G;YAC5G,MAAM,IAAI,GAAG,EAAE,CAAC,OAAO,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;YACrD,OAAO;gBACL,QAAQ,CAAC,MAAM;oBACb,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC1B,CAAC;aACF,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1,22 +1,21 @@
|
|
|
1
|
-
import { BucketDataSource } from '../../BucketSource.js';
|
|
1
|
+
import { BucketDataEvaluator, BucketDataSource, HydrationInput } from '../../BucketSource.js';
|
|
2
2
|
import { ColumnDefinition } from '../../ExpressionType.js';
|
|
3
|
-
import {
|
|
3
|
+
import { SourceTableRef } from '../../SourceTableRef.js';
|
|
4
4
|
import { TablePattern } from '../../TablePattern.js';
|
|
5
|
-
import {
|
|
5
|
+
import { SourceSchema } from '../../types.js';
|
|
6
6
|
import * as plan from '../plan.js';
|
|
7
7
|
import { StreamEvaluationContext } from './index.js';
|
|
8
8
|
export declare class PreparedStreamBucketDataSource implements BucketDataSource {
|
|
9
9
|
readonly source: plan.StreamBucketDataSource;
|
|
10
10
|
private readonly sourceTables;
|
|
11
|
-
private readonly
|
|
11
|
+
private readonly pendingSources;
|
|
12
12
|
private readonly defaultSchema;
|
|
13
13
|
constructor(source: plan.StreamBucketDataSource, context: StreamEvaluationContext);
|
|
14
14
|
get uniqueName(): string;
|
|
15
15
|
get bucketParameters(): string[];
|
|
16
16
|
getSourceTables(): Set<TablePattern>;
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
evaluateRow(options: EvaluateRowOptions): UnscopedEvaluationResult[];
|
|
17
|
+
tableSyncsData(table: SourceTableRef): boolean;
|
|
18
|
+
createEvaluator(context: HydrationInput): BucketDataEvaluator;
|
|
20
19
|
resolveResultSets(schema: SourceSchema, tables: Record<string, Record<string, ColumnDefinition>>): void;
|
|
21
20
|
debugWriteOutputTables(result: Record<string, {
|
|
22
21
|
query: string;
|
|
@@ -7,15 +7,15 @@ import { TableProcessorToSqlHelper } from './table_processor_to_sql.js';
|
|
|
7
7
|
export class PreparedStreamBucketDataSource {
|
|
8
8
|
source;
|
|
9
9
|
sourceTables = new Set();
|
|
10
|
-
|
|
10
|
+
pendingSources = [];
|
|
11
11
|
defaultSchema;
|
|
12
12
|
constructor(source, context) {
|
|
13
13
|
this.source = source;
|
|
14
14
|
this.defaultSchema = context.defaultSchema;
|
|
15
15
|
for (const data of source.sources) {
|
|
16
|
-
const
|
|
17
|
-
this.
|
|
18
|
-
this.sourceTables.add(
|
|
16
|
+
const pending = new PendingStreamDataSource(data, context.defaultSchema);
|
|
17
|
+
this.pendingSources.push(pending);
|
|
18
|
+
this.sourceTables.add(pending.tablePattern);
|
|
19
19
|
}
|
|
20
20
|
}
|
|
21
21
|
get uniqueName() {
|
|
@@ -30,22 +30,29 @@ export class PreparedStreamBucketDataSource {
|
|
|
30
30
|
getSourceTables() {
|
|
31
31
|
return this.sourceTables;
|
|
32
32
|
}
|
|
33
|
-
*sourcesForTable(table) {
|
|
34
|
-
for (const source of this.sources) {
|
|
35
|
-
if (source.tablePattern.matches(table)) {
|
|
36
|
-
yield source;
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
}
|
|
40
33
|
tableSyncsData(table) {
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const results = [];
|
|
45
|
-
for (const source of this.sourcesForTable(options.sourceTable)) {
|
|
46
|
-
source.evaluateRow(options, results);
|
|
34
|
+
for (const source of this.sourceTables) {
|
|
35
|
+
if (source.matches(table))
|
|
36
|
+
return true;
|
|
47
37
|
}
|
|
48
|
-
return
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
createEvaluator(context) {
|
|
41
|
+
const sources = this.pendingSources.map((s) => ({
|
|
42
|
+
pattern: s.tablePattern,
|
|
43
|
+
evaluate: s.instantiate(context.scalarExpressions)
|
|
44
|
+
}));
|
|
45
|
+
return {
|
|
46
|
+
evaluateRow(options) {
|
|
47
|
+
const results = [];
|
|
48
|
+
for (const { pattern, evaluate } of sources) {
|
|
49
|
+
if (pattern.matches(options.sourceTable)) {
|
|
50
|
+
evaluate(options, results);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return results;
|
|
54
|
+
}
|
|
55
|
+
};
|
|
49
56
|
}
|
|
50
57
|
resolveResultSets(schema, tables) {
|
|
51
58
|
const analyzer = new SyncPlanSchemaAnalyzer(this.defaultSchema, schema);
|
|
@@ -54,7 +61,7 @@ export class PreparedStreamBucketDataSource {
|
|
|
54
61
|
}
|
|
55
62
|
}
|
|
56
63
|
debugWriteOutputTables(result) {
|
|
57
|
-
for (const source of this.
|
|
64
|
+
for (const source of this.pendingSources) {
|
|
58
65
|
const table = source.fixedOutputTableName;
|
|
59
66
|
if (table != null) {
|
|
60
67
|
const queries = (result[table] ??= []);
|
|
@@ -63,16 +70,15 @@ export class PreparedStreamBucketDataSource {
|
|
|
63
70
|
}
|
|
64
71
|
}
|
|
65
72
|
}
|
|
66
|
-
class
|
|
73
|
+
class PendingStreamDataSource {
|
|
67
74
|
tablePattern;
|
|
68
75
|
outputs = [];
|
|
69
76
|
numberOfOutputExpressions;
|
|
70
77
|
numberOfParameters;
|
|
71
|
-
evaluator;
|
|
72
78
|
evaluatorInputs;
|
|
79
|
+
statement;
|
|
73
80
|
fixedOutputTableName;
|
|
74
|
-
|
|
75
|
-
constructor(evaluator, { engine, defaultSchema }) {
|
|
81
|
+
constructor(evaluator, defaultSchema) {
|
|
76
82
|
const translationHelper = new TableProcessorToSqlHelper(evaluator);
|
|
77
83
|
const outputExpressions = [];
|
|
78
84
|
for (const column of evaluator.columns) {
|
|
@@ -90,53 +96,57 @@ class PreparedStreamDataSource {
|
|
|
90
96
|
outputExpressions.push(translationHelper.mapper.transform(parameter.expr));
|
|
91
97
|
}
|
|
92
98
|
this.numberOfParameters = evaluator.parameters.length;
|
|
93
|
-
|
|
99
|
+
this.statement = {
|
|
94
100
|
outputs: outputExpressions,
|
|
95
101
|
filters: translationHelper.filterExpressions,
|
|
96
102
|
tableValuedFunctions: translationHelper.tableValuedFunctions
|
|
97
103
|
};
|
|
98
|
-
this.debugSql = scalarStatementToSql(evaluatorOptions);
|
|
99
|
-
this.evaluator = engine.prepareEvaluator(evaluatorOptions);
|
|
100
104
|
this.fixedOutputTableName = evaluator.outputTableName;
|
|
101
105
|
this.tablePattern = evaluator.sourceTable.toTablePattern(defaultSchema);
|
|
102
106
|
this.evaluatorInputs = translationHelper.mapper.instantiation;
|
|
103
107
|
}
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (
|
|
116
|
-
record
|
|
108
|
+
get debugSql() {
|
|
109
|
+
return scalarStatementToSql(this.statement);
|
|
110
|
+
}
|
|
111
|
+
instantiate(engine) {
|
|
112
|
+
const evaluator = engine.prepareEvaluator(this.statement);
|
|
113
|
+
return (options, results) => {
|
|
114
|
+
try {
|
|
115
|
+
const inputInstantiation = this.evaluatorInputs.map((input) => options.record[input.column]);
|
|
116
|
+
row: for (const source of evaluator.evaluate(inputInstantiation)) {
|
|
117
|
+
const record = {};
|
|
118
|
+
for (const output of this.outputs) {
|
|
119
|
+
if (output === 'star') {
|
|
120
|
+
Object.assign(record, filterJsonRow(options.record));
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
const value = source[output.index];
|
|
124
|
+
if (isJsonValue(value)) {
|
|
125
|
+
record[output.alias] = value;
|
|
126
|
+
}
|
|
117
127
|
}
|
|
118
128
|
}
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
129
|
+
const id = idFromData(record);
|
|
130
|
+
// source is [...outputs, ...partitionValues]
|
|
131
|
+
const partitionValues = source.splice(this.numberOfOutputExpressions, this.numberOfParameters);
|
|
132
|
+
for (const bucketParameter of partitionValues) {
|
|
133
|
+
if (!isValidParameterValue(bucketParameter)) {
|
|
134
|
+
continue row;
|
|
135
|
+
}
|
|
126
136
|
}
|
|
137
|
+
results.push({
|
|
138
|
+
id,
|
|
139
|
+
data: record,
|
|
140
|
+
table: this.fixedOutputTableName ?? options.sourceTable.name,
|
|
141
|
+
serializedBucketParameters: JSONBucketNameSerialize.stringify(partitionValues)
|
|
142
|
+
});
|
|
127
143
|
}
|
|
128
|
-
results
|
|
129
|
-
id,
|
|
130
|
-
data: record,
|
|
131
|
-
table: this.fixedOutputTableName ?? options.sourceTable.name,
|
|
132
|
-
serializedBucketParameters: JSONBucketNameSerialize.stringify(partitionValues)
|
|
133
|
-
});
|
|
144
|
+
return results;
|
|
134
145
|
}
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
}
|
|
146
|
+
catch (e) {
|
|
147
|
+
return results.push({ error: e.message });
|
|
148
|
+
}
|
|
149
|
+
};
|
|
140
150
|
}
|
|
141
151
|
}
|
|
142
152
|
//# sourceMappingURL=bucket_data_source.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucket_data_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_data_source.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAW3C,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,qBAAqB,EAAE,uBAAuB,EAAE,MAAM,gBAAgB,CAAC;AAC5G,OAAO,
|
|
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,4 +1,4 @@
|
|
|
1
|
-
import { BucketDataSource, BucketSource, BucketSourceType,
|
|
1
|
+
import { BucketDataSource, BucketSource, BucketSourceType, HydratedBucketSource, HydrationInput, ParameterIndexLookupCreator } from '../../BucketSource.js';
|
|
2
2
|
import * as plan from '../plan.js';
|
|
3
3
|
import { StreamEvaluationContext } from './index.js';
|
|
4
4
|
export interface StreamInput extends StreamEvaluationContext {
|
|
@@ -15,5 +15,5 @@ export declare class StreamBucketSource implements BucketSource {
|
|
|
15
15
|
get subscribedToByDefault(): boolean;
|
|
16
16
|
get type(): BucketSourceType;
|
|
17
17
|
debugRepresentation(): string;
|
|
18
|
-
hydrate(params:
|
|
18
|
+
hydrate(params: HydrationInput): HydratedBucketSource;
|
|
19
19
|
}
|
|
@@ -29,7 +29,7 @@ export class StreamBucketSource {
|
|
|
29
29
|
return `stream ${this.stream.stream.name}`;
|
|
30
30
|
}
|
|
31
31
|
hydrate(params) {
|
|
32
|
-
const queriers = this.stream.queriers.map((q) => new PreparedQuerier(this.stream.stream, q, this.input));
|
|
32
|
+
const queriers = this.stream.queriers.map((q) => new PreparedQuerier(this.stream.stream, q, this.input, params.scalarExpressions));
|
|
33
33
|
return {
|
|
34
34
|
definition: this,
|
|
35
35
|
pushBucketParameterQueriers: (result, options) => {
|
|
@@ -67,11 +67,11 @@ class PreparedQuerier {
|
|
|
67
67
|
matchesParameters;
|
|
68
68
|
lookupStages;
|
|
69
69
|
dataSource;
|
|
70
|
-
constructor(stream, querier, options) {
|
|
70
|
+
constructor(stream, querier, options, engine) {
|
|
71
71
|
this.stream = stream;
|
|
72
72
|
this.dataSource = options.preparedBuckets.get(querier.bucket);
|
|
73
|
-
this.matchesParameters = PreparedQuerier.prepareFilters(
|
|
74
|
-
this.lookupStages = RequestParameterEvaluators.prepare(querier.lookupStages, querier.sourceInstantiation, options);
|
|
73
|
+
this.matchesParameters = PreparedQuerier.prepareFilters(engine, querier.requestFilters);
|
|
74
|
+
this.lookupStages = RequestParameterEvaluators.prepare(stream, querier.lookupStages, querier.sourceInstantiation, options, engine);
|
|
75
75
|
}
|
|
76
76
|
querierForSubscription(hydration, result, params, subscription) {
|
|
77
77
|
const reason = subscription != null ? { subscription: subscription.opaque_id } : 'default';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bucket_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_source.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,gBAAgB,
|
|
1
|
+
{"version":3,"file":"bucket_source.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/bucket_source.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,11 +1,9 @@
|
|
|
1
1
|
import { SyncConfig } from '../../SyncConfig.js';
|
|
2
2
|
import { CompatibilityContext } from '../../compatibility.js';
|
|
3
3
|
import { SqlEventDescriptor } from '../../index.js';
|
|
4
|
-
import { ScalarExpressionEngine } from '../engine/scalar_expression_engine.js';
|
|
5
4
|
import * as plan from '../plan.js';
|
|
6
5
|
export interface StreamEvaluationContext {
|
|
7
6
|
defaultSchema: string;
|
|
8
|
-
engine: ScalarExpressionEngine;
|
|
9
7
|
/**
|
|
10
8
|
* Source contents that were used to compile the sync plan.
|
|
11
9
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/sync_plan/evaluator/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,qBAAqB,CAAC;AAIjD,OAAO,EAAE,8BAA8B,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAAE,kBAAkB,EAAe,MAAM,oBAAoB,CAAC;AACrE,OAAO,EAAE,mCAAmC,EAAE,MAAM,qCAAqC,CAAC;AAY1F,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"}
|
|
@@ -2,6 +2,7 @@ import { ParameterLookupSource } from '../../BucketParameterQuerier.js';
|
|
|
2
2
|
import { ParameterIndexLookupCreator } from '../../BucketSource.js';
|
|
3
3
|
import { HydrationState } from '../../HydrationState.js';
|
|
4
4
|
import { RequestParameters, SqliteParameterValue, SqliteValue } from '../../types.js';
|
|
5
|
+
import { ScalarExpressionEngine } from '../engine/scalar_expression_engine.js';
|
|
5
6
|
import * as plan from '../plan.js';
|
|
6
7
|
import { StreamInput } from './bucket_source.js';
|
|
7
8
|
/**
|
|
@@ -43,6 +44,7 @@ import { StreamInput } from './bucket_source.js';
|
|
|
43
44
|
* queriers by indicating that no lookups will be used.
|
|
44
45
|
*/
|
|
45
46
|
export declare class RequestParameterEvaluators {
|
|
47
|
+
readonly stream: plan.StreamOptions;
|
|
46
48
|
/**
|
|
47
49
|
* Pending lookup stages, or their cached outputs.
|
|
48
50
|
*/
|
|
@@ -81,12 +83,14 @@ export declare class RequestParameterEvaluators {
|
|
|
81
83
|
/**
|
|
82
84
|
* Prepares evaluators for a description of parameter values obtained from a compiled querier in the sync plan.
|
|
83
85
|
*
|
|
86
|
+
* @param stream Used to show the name of the stream for debugging purposes.
|
|
84
87
|
* @param lookupStages The {@link plan.StreamQuerier.lookupStages} of the querier to compile.
|
|
85
88
|
* @param values The {@link plan.StreamQuerier.sourceInstantiation} of the querier to compile.
|
|
86
89
|
* @param input Access to bucket and parameter sources generated for buckets and parameter lookups referenced by the
|
|
87
90
|
* querier.
|
|
91
|
+
* @param engine The scalar SQL engine used to evaluate operators and functions on request data.
|
|
88
92
|
*/
|
|
89
|
-
static prepare(lookupStages: plan.ExpandingLookup[][], values: plan.ParameterValue[], input: StreamInput): RequestParameterEvaluators;
|
|
93
|
+
static prepare(stream: plan.StreamOptions, lookupStages: plan.ExpandingLookup[][], values: plan.ParameterValue[], input: StreamInput, engine: ScalarExpressionEngine): RequestParameterEvaluators;
|
|
90
94
|
}
|
|
91
95
|
export type PreparedExpandingLookup = {
|
|
92
96
|
type: 'parameter';
|
|
@@ -97,7 +101,7 @@ export type PreparedExpandingLookup = {
|
|
|
97
101
|
read(request: RequestParameters): SqliteParameterValue[][];
|
|
98
102
|
} | {
|
|
99
103
|
type: 'cached';
|
|
100
|
-
values:
|
|
104
|
+
values: ParameterValueWithRow[][];
|
|
101
105
|
};
|
|
102
106
|
/**
|
|
103
107
|
* A {@link plan.ParameterValue} that can be evaluated against request parameters.
|
|
@@ -119,8 +123,52 @@ export type PreparedParameterValue = {
|
|
|
119
123
|
values: PreparedParameterValue[];
|
|
120
124
|
} | {
|
|
121
125
|
type: 'cached';
|
|
122
|
-
values:
|
|
126
|
+
values: ParameterValueWithRow[];
|
|
123
127
|
};
|
|
128
|
+
interface ParameterValueWithRow {
|
|
129
|
+
value: SqliteParameterValue;
|
|
130
|
+
/**
|
|
131
|
+
* Information on how this value was resolved.
|
|
132
|
+
*
|
|
133
|
+
* We track how a parameter value was resolved to be able to merge parameters correctly. A Sync Stream with multiple
|
|
134
|
+
* independent parameters generates their cartesian product as buckets. When multiple parameters are resolved from the
|
|
135
|
+
* same row though, we can't use the full cartesian product. As an example, consider this stream:
|
|
136
|
+
*
|
|
137
|
+
* ```sql
|
|
138
|
+
* SELECT products.* FROM products, stores
|
|
139
|
+
* WHERE stores.name = products.store_name
|
|
140
|
+
* AND stores.region = products.region
|
|
141
|
+
* AND stores.id = subscription.parameter('store');
|
|
142
|
+
* ```
|
|
143
|
+
*
|
|
144
|
+
* Here, the bucket shape consists of two parameters (`store_name` and `region`). But since they're derived from the
|
|
145
|
+
* same `stores` row, we can't combine them freely. For each parameter, `store_name` and `region` must come from the
|
|
146
|
+
* same row. Here, the `provenance` would have a single entry and both parameters would have the same
|
|
147
|
+
* {@link VirtualSourceRow.resultSet}.
|
|
148
|
+
*
|
|
149
|
+
* For static values, such as constants or scalar values derived from request parameters, this array is empty. It's
|
|
150
|
+
* also possible for this to contain more than one entry, though:
|
|
151
|
+
*
|
|
152
|
+
* 1. For intersection values, we track the provenance of all input values.
|
|
153
|
+
* 2. It's possible to nest parameters. For instance, in the query `SELECT data.* FROM data, a, b WHERE a.a = data.a
|
|
154
|
+
* 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
|
|
155
|
+
* table `a`, but we need to go through a second lookup to resolve `c`. Here, we can only combine value `c` with
|
|
156
|
+
* value `a` if the two were derived from the same row in `a`. So, the row `b` derived through `a` would include
|
|
157
|
+
* provenance elements of row `a` here.
|
|
158
|
+
*/
|
|
159
|
+
provenance: VirtualSourceRow[];
|
|
160
|
+
directOrigin?: VirtualSourceRow;
|
|
161
|
+
}
|
|
162
|
+
interface VirtualSourceRow {
|
|
163
|
+
/**
|
|
164
|
+
* An opaque identifier for the result set this row was derived from.
|
|
165
|
+
*/
|
|
166
|
+
resultSet: symbol;
|
|
167
|
+
/**
|
|
168
|
+
* A number uniquely identifying this row in its result set.
|
|
169
|
+
*/
|
|
170
|
+
row: number;
|
|
171
|
+
}
|
|
124
172
|
export interface PartialInstantiationInput {
|
|
125
173
|
request: RequestParameters;
|
|
126
174
|
}
|
|
@@ -130,3 +178,4 @@ export interface InstantiationInput extends PartialInstantiationInput {
|
|
|
130
178
|
}
|
|
131
179
|
export declare function isValidParameterValueRow(row: SqliteValue[]): row is SqliteParameterValue[];
|
|
132
180
|
export declare function parametersForRequest(parameters: RequestParameters, values: plan.SqlParameterValue[]): string[];
|
|
181
|
+
export {};
|