@powersync/service-sync-rules 0.28.0 → 0.29.1
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/LICENSE +3 -3
- package/dist/BaseSqlDataQuery.d.ts +9 -1
- package/dist/BaseSqlDataQuery.js +42 -0
- package/dist/BaseSqlDataQuery.js.map +1 -1
- package/dist/BucketDescription.d.ts +16 -0
- package/dist/BucketParameterQuerier.d.ts +19 -3
- package/dist/BucketParameterQuerier.js.map +1 -1
- package/dist/BucketSource.d.ts +72 -0
- package/dist/BucketSource.js +6 -0
- package/dist/BucketSource.js.map +1 -0
- package/dist/ExpressionType.d.ts +2 -1
- package/dist/ExpressionType.js +1 -1
- package/dist/ExpressionType.js.map +1 -1
- package/dist/SqlBucketDescriptor.d.ts +40 -8
- package/dist/SqlBucketDescriptor.js +78 -10
- package/dist/SqlBucketDescriptor.js.map +1 -1
- package/dist/SqlDataQuery.d.ts +4 -3
- package/dist/SqlDataQuery.js +10 -30
- package/dist/SqlDataQuery.js.map +1 -1
- package/dist/SqlParameterQuery.d.ts +4 -4
- package/dist/SqlParameterQuery.js +9 -4
- package/dist/SqlParameterQuery.js.map +1 -1
- package/dist/SqlSyncRules.d.ts +55 -7
- package/dist/SqlSyncRules.js +126 -47
- package/dist/SqlSyncRules.js.map +1 -1
- package/dist/StaticSqlParameterQuery.d.ts +2 -2
- package/dist/StaticSqlParameterQuery.js +3 -2
- package/dist/StaticSqlParameterQuery.js.map +1 -1
- package/dist/TableValuedFunctionSqlParameterQuery.d.ts +2 -2
- package/dist/TableValuedFunctionSqlParameterQuery.js +11 -10
- package/dist/TableValuedFunctionSqlParameterQuery.js.map +1 -1
- package/dist/TableValuedFunctions.d.ts +2 -2
- package/dist/TableValuedFunctions.js +38 -35
- package/dist/TableValuedFunctions.js.map +1 -1
- package/dist/compatibility.d.ts +40 -0
- package/dist/compatibility.js +56 -0
- package/dist/compatibility.js.map +1 -0
- package/dist/events/SqlEventDescriptor.d.ts +3 -1
- package/dist/events/SqlEventDescriptor.js +4 -2
- package/dist/events/SqlEventDescriptor.js.map +1 -1
- package/dist/events/SqlEventSourceQuery.d.ts +2 -1
- package/dist/events/SqlEventSourceQuery.js +3 -2
- package/dist/events/SqlEventSourceQuery.js.map +1 -1
- package/dist/index.d.ts +7 -0
- package/dist/index.js +7 -0
- package/dist/index.js.map +1 -1
- package/dist/json_schema.js +54 -1
- package/dist/json_schema.js.map +1 -1
- package/dist/request_functions.d.ts +24 -4
- package/dist/request_functions.js +68 -17
- package/dist/request_functions.js.map +1 -1
- package/dist/schema-generators/SchemaGenerator.js +2 -12
- package/dist/schema-generators/SchemaGenerator.js.map +1 -1
- package/dist/sql_filters.d.ts +25 -2
- package/dist/sql_filters.js +223 -119
- package/dist/sql_filters.js.map +1 -1
- package/dist/sql_functions.d.ts +13 -31
- package/dist/sql_functions.js +191 -114
- package/dist/sql_functions.js.map +1 -1
- package/dist/sql_support.d.ts +20 -0
- package/dist/sql_support.js +67 -14
- package/dist/sql_support.js.map +1 -1
- package/dist/streams/filter.d.ts +148 -0
- package/dist/streams/filter.js +426 -0
- package/dist/streams/filter.js.map +1 -0
- package/dist/streams/from_sql.d.ts +4 -0
- package/dist/streams/from_sql.js +375 -0
- package/dist/streams/from_sql.js.map +1 -0
- package/dist/streams/functions.d.ts +2 -0
- package/dist/streams/functions.js +38 -0
- package/dist/streams/functions.js.map +1 -0
- package/dist/streams/parameter.d.ts +67 -0
- package/dist/streams/parameter.js +2 -0
- package/dist/streams/parameter.js.map +1 -0
- package/dist/streams/stream.d.ts +40 -0
- package/dist/streams/stream.js +139 -0
- package/dist/streams/stream.js.map +1 -0
- package/dist/streams/utils.d.ts +1 -0
- package/dist/streams/utils.js +13 -0
- package/dist/streams/utils.js.map +1 -0
- package/dist/streams/variant.d.ts +122 -0
- package/dist/streams/variant.js +266 -0
- package/dist/streams/variant.js.map +1 -0
- package/dist/types/custom_sqlite_value.d.ts +38 -0
- package/dist/types/custom_sqlite_value.js +50 -0
- package/dist/types/custom_sqlite_value.js.map +1 -0
- package/dist/types/time.d.ts +33 -0
- package/dist/types/time.js +67 -0
- package/dist/types/time.js.map +1 -0
- package/dist/types.d.ts +52 -9
- package/dist/types.js +28 -2
- package/dist/types.js.map +1 -1
- package/dist/utils.d.ts +9 -6
- package/dist/utils.js +42 -17
- package/dist/utils.js.map +1 -1
- package/package.json +3 -3
- package/schema/sync_rules.json +84 -2
package/LICENSE
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
# Functional Source License, Version 1.1,
|
|
1
|
+
# Functional Source License, Version 1.1, ALv2 Future License
|
|
2
2
|
|
|
3
3
|
## Abbreviation
|
|
4
4
|
|
|
5
|
-
FSL-1.1-
|
|
5
|
+
FSL-1.1-ALv2
|
|
6
6
|
|
|
7
7
|
## Notice
|
|
8
8
|
|
|
9
|
-
Copyright 2023-
|
|
9
|
+
Copyright 2023-2025 Journey Mobile, Inc.
|
|
10
10
|
|
|
11
11
|
## Terms and Conditions
|
|
12
12
|
|
|
@@ -4,11 +4,17 @@ import { ColumnDefinition } from './ExpressionType.js';
|
|
|
4
4
|
import { SourceTableInterface } from './SourceTableInterface.js';
|
|
5
5
|
import { SqlTools } from './sql_filters.js';
|
|
6
6
|
import { TablePattern } from './TablePattern.js';
|
|
7
|
-
import { QueryParameters, QuerySchema, SourceSchema, SourceSchemaTable, SqliteJsonRow, SqliteRow } from './types.js';
|
|
7
|
+
import { BucketIdTransformer, EvaluationResult, QueryParameters, QuerySchema, SourceSchema, SourceSchemaTable, SqliteJsonRow, SqliteRow } from './types.js';
|
|
8
8
|
export interface RowValueExtractor {
|
|
9
9
|
extract(tables: QueryParameters, into: SqliteRow): void;
|
|
10
10
|
getTypes(schema: QuerySchema, into: Record<string, ColumnDefinition>): void;
|
|
11
11
|
}
|
|
12
|
+
export interface EvaluateRowOptions {
|
|
13
|
+
table: SourceTableInterface;
|
|
14
|
+
row: SqliteRow;
|
|
15
|
+
bucketIds: (params: QueryParameters) => string[];
|
|
16
|
+
bucketIdTransformer: BucketIdTransformer | null;
|
|
17
|
+
}
|
|
12
18
|
export interface BaseSqlDataQueryOptions {
|
|
13
19
|
sourceTable: TablePattern;
|
|
14
20
|
table: string;
|
|
@@ -71,6 +77,8 @@ export declare class BaseSqlDataQuery {
|
|
|
71
77
|
name: string;
|
|
72
78
|
columns: ColumnDefinition[];
|
|
73
79
|
}[];
|
|
80
|
+
resolveResultSets(schema: SourceSchema, tables: Record<string, Record<string, ColumnDefinition>>): void;
|
|
81
|
+
evaluateRowWithOptions(options: Omit<EvaluateRowOptions, 'bucketIdTransformer'>): EvaluationResult[];
|
|
74
82
|
protected transformRow(tables: QueryParameters): SqliteJsonRow;
|
|
75
83
|
protected getColumnOutputsFor(schemaTable: SourceSchemaTable, output: Record<string, ColumnDefinition>): void;
|
|
76
84
|
}
|
package/dist/BaseSqlDataQuery.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { filterJsonRow } from './utils.js';
|
|
2
|
+
import { castAsText } from './sql_functions.js';
|
|
2
3
|
export class BaseSqlDataQuery {
|
|
3
4
|
/**
|
|
4
5
|
* Source table or table pattern.
|
|
@@ -108,6 +109,47 @@ export class BaseSqlDataQuery {
|
|
|
108
109
|
}
|
|
109
110
|
return result;
|
|
110
111
|
}
|
|
112
|
+
resolveResultSets(schema, tables) {
|
|
113
|
+
const outTables = this.getColumnOutputs(schema);
|
|
114
|
+
for (let table of outTables) {
|
|
115
|
+
tables[table.name] ??= {};
|
|
116
|
+
for (let column of table.columns) {
|
|
117
|
+
if (column.name != 'id') {
|
|
118
|
+
tables[table.name][column.name] ??= column;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
evaluateRowWithOptions(options) {
|
|
124
|
+
try {
|
|
125
|
+
const { table, row, bucketIds } = options;
|
|
126
|
+
const tables = { [this.table]: this.addSpecialParameters(table, row) };
|
|
127
|
+
const resolvedBucketIds = bucketIds(tables);
|
|
128
|
+
const data = this.transformRow(tables);
|
|
129
|
+
let id = data.id;
|
|
130
|
+
if (typeof id != 'string') {
|
|
131
|
+
// While an explicit cast would be better, this covers against very common
|
|
132
|
+
// issues when initially testing out sync, for example when the id column is an
|
|
133
|
+
// auto-incrementing integer.
|
|
134
|
+
// If there is no id column, we use a blank id. This will result in the user syncing
|
|
135
|
+
// a single arbitrary row for this table - better than just not being able to sync
|
|
136
|
+
// anything.
|
|
137
|
+
id = castAsText(id) ?? '';
|
|
138
|
+
}
|
|
139
|
+
const outputTable = this.getOutputName(table.name);
|
|
140
|
+
return resolvedBucketIds.map((bucketId) => {
|
|
141
|
+
return {
|
|
142
|
+
bucket: bucketId,
|
|
143
|
+
table: outputTable,
|
|
144
|
+
id: id,
|
|
145
|
+
data
|
|
146
|
+
};
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
catch (e) {
|
|
150
|
+
return [{ error: e.message ?? `Evaluating data query failed` }];
|
|
151
|
+
}
|
|
152
|
+
}
|
|
111
153
|
transformRow(tables) {
|
|
112
154
|
let result = {};
|
|
113
155
|
for (let extractor of this.extractors) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseSqlDataQuery.js","sourceRoot":"","sources":["../src/BaseSqlDataQuery.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BaseSqlDataQuery.js","sourceRoot":"","sources":["../src/BaseSqlDataQuery.ts"],"names":[],"mappings":"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"}
|
|
@@ -25,3 +25,19 @@ export interface BucketDescription {
|
|
|
25
25
|
*/
|
|
26
26
|
priority: BucketPriority;
|
|
27
27
|
}
|
|
28
|
+
/**
|
|
29
|
+
* A bucket that was resolved to a specific request including stream subscriptions.
|
|
30
|
+
*
|
|
31
|
+
* This includes information on why the bucket has been included in a checkpoint subset
|
|
32
|
+
* shown to clients.
|
|
33
|
+
*/
|
|
34
|
+
export interface ResolvedBucket extends BucketDescription {
|
|
35
|
+
/**
|
|
36
|
+
* The name of the sync rule or stream definition from which the bucket is derived.
|
|
37
|
+
*/
|
|
38
|
+
definition: string;
|
|
39
|
+
inclusion_reasons: BucketInclusionReason[];
|
|
40
|
+
}
|
|
41
|
+
export type BucketInclusionReason = 'default' | {
|
|
42
|
+
subscription: number;
|
|
43
|
+
};
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { ResolvedBucket } from './BucketDescription.js';
|
|
2
|
+
import { RequestedStream } from './SqlSyncRules.js';
|
|
2
3
|
import { RequestParameters, SqliteJsonRow, SqliteJsonValue } from './types.js';
|
|
3
4
|
/**
|
|
4
5
|
* Represents a set of parameter queries for a specific request.
|
|
@@ -12,7 +13,7 @@ export interface BucketParameterQuerier {
|
|
|
12
13
|
* select request.user_id() as user_id()
|
|
13
14
|
* select value as project_id from json_each(request.jwt() -> 'project_ids')
|
|
14
15
|
*/
|
|
15
|
-
readonly staticBuckets:
|
|
16
|
+
readonly staticBuckets: ResolvedBucket[];
|
|
16
17
|
/**
|
|
17
18
|
* True if there are dynamic buckets, meaning queryDynamicBucketDescriptions() should be used.
|
|
18
19
|
*
|
|
@@ -31,7 +32,22 @@ export interface BucketParameterQuerier {
|
|
|
31
32
|
*
|
|
32
33
|
* select id as user_id from users where users.id = request.user_id()
|
|
33
34
|
*/
|
|
34
|
-
queryDynamicBucketDescriptions(source: ParameterLookupSource): Promise<
|
|
35
|
+
queryDynamicBucketDescriptions(source: ParameterLookupSource): Promise<ResolvedBucket[]>;
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* An error that occurred while trying to resolve the bucket ids a request should have access to.
|
|
39
|
+
*
|
|
40
|
+
* A common scenario that could cause this to happen is when parameters need to have a certain structure. For instance,
|
|
41
|
+
* `... WHERE id IN stream.parameters -> 'ids'` is unresolvable when `ids` is not set to a JSON array.
|
|
42
|
+
*/
|
|
43
|
+
export interface QuerierError {
|
|
44
|
+
descriptor: string;
|
|
45
|
+
subscription?: RequestedStream;
|
|
46
|
+
message: string;
|
|
47
|
+
}
|
|
48
|
+
export interface PendingQueriers {
|
|
49
|
+
queriers: BucketParameterQuerier[];
|
|
50
|
+
errors: QuerierError[];
|
|
35
51
|
}
|
|
36
52
|
export interface ParameterLookupSource {
|
|
37
53
|
getParameterSets: (lookups: ParameterLookup[]) => Promise<SqliteJsonRow[]>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BucketParameterQuerier.js","sourceRoot":"","sources":["../src/BucketParameterQuerier.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"BucketParameterQuerier.js","sourceRoot":"","sources":["../src/BucketParameterQuerier.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAAE,MAAM,YAAY,CAAC;AAgErD,MAAM,UAAU,4BAA4B,CAAC,QAAkC;IAC7E,MAAM,qBAAqB,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,qBAAqB,CAAC,CAAC;IAC/E,OAAO;QACL,aAAa,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC;QACvD,iBAAiB,EAAE,qBAAqB,CAAC,MAAM,GAAG,CAAC;QACnD,qBAAqB,EAAE,qBAAqB;QAC5C,KAAK,CAAC,8BAA8B,CAAC,MAA6B;YAChE,IAAI,OAAO,GAAqB,EAAE,CAAC;YACnC,KAAK,IAAI,CAAC,IAAI,QAAQ,EAAE,CAAC;gBACvB,IAAI,CAAC,CAAC,iBAAiB,EAAE,CAAC;oBACxB,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,8BAA8B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;gBACpE,CAAC;YACH,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,OAAO,eAAe;IAC1B,kEAAkE;IACzD,MAAM,CAAoB;IAEnC,MAAM,CAAC,UAAU,CAAC,oBAA4B,EAAE,UAAkB,EAAE,MAAyB;QAC3F,OAAO,IAAI,eAAe,CAAC,CAAC,oBAAoB,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC,CAAC;IACzG,CAAC;IAED;;;OAGG;IACH,YAAY,MAAyB;QACnC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { PendingQueriers } from './BucketParameterQuerier.js';
|
|
2
|
+
import { ColumnDefinition } from './ExpressionType.js';
|
|
3
|
+
import { SourceTableInterface } from './SourceTableInterface.js';
|
|
4
|
+
import { GetQuerierOptions } from './SqlSyncRules.js';
|
|
5
|
+
import { TablePattern } from './TablePattern.js';
|
|
6
|
+
import { EvaluatedParametersResult, EvaluateRowOptions, EvaluationResult, SourceSchema, SqliteInputRow } from './types.js';
|
|
7
|
+
/**
|
|
8
|
+
* An interface declaring
|
|
9
|
+
*
|
|
10
|
+
* - which buckets the sync service should create when processing change streams from the database.
|
|
11
|
+
* - how data in source tables maps to data in buckets (e.g. when we're not selecting all columns).
|
|
12
|
+
* - which buckets a given connection has access to.
|
|
13
|
+
*
|
|
14
|
+
* There are two ways to define bucket sources: Via sync rules made up of parameter and data queries, and via stream
|
|
15
|
+
* definitions that only consist of a single query.
|
|
16
|
+
*/
|
|
17
|
+
export interface BucketSource {
|
|
18
|
+
readonly name: string;
|
|
19
|
+
readonly type: BucketSourceType;
|
|
20
|
+
readonly subscribedToByDefault: boolean;
|
|
21
|
+
/**
|
|
22
|
+
* Given a row in a source table that affects sync parameters, returns a structure to index which buckets rows should
|
|
23
|
+
* be associated with.
|
|
24
|
+
*
|
|
25
|
+
* The returned {@link ParameterLookup} can be referenced by {@link pushBucketParameterQueriers} to allow the storage
|
|
26
|
+
* system to find buckets.
|
|
27
|
+
*/
|
|
28
|
+
evaluateParameterRow(sourceTable: SourceTableInterface, row: SqliteInputRow): EvaluatedParametersResult[];
|
|
29
|
+
/**
|
|
30
|
+
* Given a row as it appears in a table that affects sync data, return buckets, logical table names and transformed
|
|
31
|
+
* data for rows to add to buckets.
|
|
32
|
+
*/
|
|
33
|
+
evaluateRow(options: EvaluateRowOptions): EvaluationResult[];
|
|
34
|
+
/**
|
|
35
|
+
* Reports {@link BucketParameterQuerier}s resolving buckets that a specific stream request should have access to.
|
|
36
|
+
*
|
|
37
|
+
* @param result The target array to insert queriers and errors into.
|
|
38
|
+
* @param options Options, including parameters that may affect the buckets loaded by this source.
|
|
39
|
+
*/
|
|
40
|
+
pushBucketParameterQueriers(result: PendingQueriers, options: GetQuerierOptions): void;
|
|
41
|
+
/**
|
|
42
|
+
* Whether {@link pushBucketParameterQueriers} may include a querier where
|
|
43
|
+
* {@link BucketParameterQuerier.hasDynamicBuckets} is true.
|
|
44
|
+
*
|
|
45
|
+
* This is mostly used for testing.
|
|
46
|
+
*/
|
|
47
|
+
hasDynamicBucketQueries(): boolean;
|
|
48
|
+
getSourceTables(): Set<TablePattern>;
|
|
49
|
+
/** Whether the table possibly affects the buckets resolved by this source. */
|
|
50
|
+
tableSyncsParameters(table: SourceTableInterface): boolean;
|
|
51
|
+
/** Whether the table possibly affects the contents of buckets resolved by this source. */
|
|
52
|
+
tableSyncsData(table: SourceTableInterface): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Given a static schema, infer all logical tables and associated columns that appear in buckets defined by this
|
|
55
|
+
* source.
|
|
56
|
+
*
|
|
57
|
+
* This is use to generate the client-side schema.
|
|
58
|
+
*/
|
|
59
|
+
resolveResultSets(schema: SourceSchema, tables: Record<string, Record<string, ColumnDefinition>>): void;
|
|
60
|
+
debugWriteOutputTables(result: Record<string, {
|
|
61
|
+
query: string;
|
|
62
|
+
}[]>): void;
|
|
63
|
+
debugRepresentation(): any;
|
|
64
|
+
}
|
|
65
|
+
export declare enum BucketSourceType {
|
|
66
|
+
SYNC_RULE = 0,
|
|
67
|
+
SYNC_STREAM = 1
|
|
68
|
+
}
|
|
69
|
+
export type ResultSetDescription = {
|
|
70
|
+
name: string;
|
|
71
|
+
columns: ColumnDefinition[];
|
|
72
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export var BucketSourceType;
|
|
2
|
+
(function (BucketSourceType) {
|
|
3
|
+
BucketSourceType[BucketSourceType["SYNC_RULE"] = 0] = "SYNC_RULE";
|
|
4
|
+
BucketSourceType[BucketSourceType["SYNC_STREAM"] = 1] = "SYNC_STREAM";
|
|
5
|
+
})(BucketSourceType || (BucketSourceType = {}));
|
|
6
|
+
//# sourceMappingURL=BucketSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BucketSource.js","sourceRoot":"","sources":["../src/BucketSource.ts"],"names":[],"mappings":"AAiFA,MAAM,CAAN,IAAY,gBAGX;AAHD,WAAY,gBAAgB;IAC1B,iEAAS,CAAA;IACT,qEAAW,CAAA;AACb,CAAC,EAHW,gBAAgB,KAAhB,gBAAgB,QAG3B"}
|
package/dist/ExpressionType.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export declare const TYPE_TEXT = 2;
|
|
|
4
4
|
export declare const TYPE_INTEGER = 4;
|
|
5
5
|
export declare const TYPE_REAL = 8;
|
|
6
6
|
export type SqliteType = 'null' | 'blob' | 'text' | 'integer' | 'real' | 'numeric';
|
|
7
|
+
export type SqliteValueType = 'null' | 'blob' | 'text' | 'integer' | 'real';
|
|
7
8
|
export interface ColumnDefinition {
|
|
8
9
|
name: string;
|
|
9
10
|
type: ExpressionType;
|
|
@@ -34,6 +35,6 @@ export declare class ExpressionType {
|
|
|
34
35
|
isNone(): boolean;
|
|
35
36
|
}
|
|
36
37
|
/**
|
|
37
|
-
* Here only for backwards-compatibility only.
|
|
38
|
+
* @deprecated Here only for backwards-compatibility only.
|
|
38
39
|
*/
|
|
39
40
|
export declare function expressionTypeFromPostgresType(type: string | undefined): ExpressionType;
|
package/dist/ExpressionType.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ExpressionType.js","sourceRoot":"","sources":["../src/ExpressionType.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;AAC3B,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,CAAC;AAC9B,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"ExpressionType.js","sourceRoot":"","sources":["../src/ExpressionType.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,15 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { BucketParameterQuerier } from './BucketParameterQuerier.js';
|
|
1
|
+
import { BucketInclusionReason, ResolvedBucket } from './BucketDescription.js';
|
|
2
|
+
import { BucketParameterQuerier, PendingQueriers } from './BucketParameterQuerier.js';
|
|
3
|
+
import { BucketSource, BucketSourceType } from './BucketSource.js';
|
|
4
|
+
import { ColumnDefinition } from './ExpressionType.js';
|
|
3
5
|
import { IdSequence } from './IdSequence.js';
|
|
4
6
|
import { SourceTableInterface } from './SourceTableInterface.js';
|
|
5
7
|
import { SqlDataQuery } from './SqlDataQuery.js';
|
|
6
8
|
import { SqlParameterQuery } from './SqlParameterQuery.js';
|
|
7
|
-
import { SyncRulesOptions } from './SqlSyncRules.js';
|
|
9
|
+
import { GetQuerierOptions, SyncRulesOptions } from './SqlSyncRules.js';
|
|
8
10
|
import { StaticSqlParameterQuery } from './StaticSqlParameterQuery.js';
|
|
9
11
|
import { TablePattern } from './TablePattern.js';
|
|
10
12
|
import { TableValuedFunctionSqlParameterQuery } from './TableValuedFunctionSqlParameterQuery.js';
|
|
11
13
|
import { SqlRuleError } from './errors.js';
|
|
12
|
-
import {
|
|
14
|
+
import { CompatibilityContext } from './compatibility.js';
|
|
15
|
+
import { BucketIdTransformer, EvaluatedParametersResult, EvaluateRowOptions, EvaluationResult, QueryParseOptions, RequestParameters, SourceSchema, SqliteRow } from './types.js';
|
|
13
16
|
export interface QueryParseResult {
|
|
14
17
|
/**
|
|
15
18
|
* True if parsed in some form, even if there are errors.
|
|
@@ -17,10 +20,12 @@ export interface QueryParseResult {
|
|
|
17
20
|
parsed: boolean;
|
|
18
21
|
errors: SqlRuleError[];
|
|
19
22
|
}
|
|
20
|
-
export declare class SqlBucketDescriptor {
|
|
23
|
+
export declare class SqlBucketDescriptor implements BucketSource {
|
|
21
24
|
name: string;
|
|
22
25
|
bucketParameters?: string[];
|
|
23
26
|
constructor(name: string);
|
|
27
|
+
get type(): BucketSourceType;
|
|
28
|
+
get subscribedToByDefault(): boolean;
|
|
24
29
|
/**
|
|
25
30
|
* source table -> queries
|
|
26
31
|
*/
|
|
@@ -28,14 +33,41 @@ export declare class SqlBucketDescriptor {
|
|
|
28
33
|
parameterQueries: SqlParameterQuery[];
|
|
29
34
|
globalParameterQueries: (StaticSqlParameterQuery | TableValuedFunctionSqlParameterQuery)[];
|
|
30
35
|
parameterIdSequence: IdSequence;
|
|
31
|
-
addDataQuery(sql: string, options: SyncRulesOptions): QueryParseResult;
|
|
36
|
+
addDataQuery(sql: string, options: SyncRulesOptions, compatibility: CompatibilityContext): QueryParseResult;
|
|
32
37
|
addParameterQuery(sql: string, options: QueryParseOptions): QueryParseResult;
|
|
33
38
|
evaluateRow(options: EvaluateRowOptions): EvaluationResult[];
|
|
34
39
|
evaluateParameterRow(sourceTable: SourceTableInterface, row: SqliteRow): EvaluatedParametersResult[];
|
|
35
|
-
|
|
36
|
-
|
|
40
|
+
/**
|
|
41
|
+
* @deprecated Use `pushBucketParameterQueriers` instead and merge at the top-level.
|
|
42
|
+
*/
|
|
43
|
+
getBucketParameterQuerier(options: GetQuerierOptions): BucketParameterQuerier;
|
|
44
|
+
pushBucketParameterQueriers(result: PendingQueriers, options: GetQuerierOptions): void;
|
|
45
|
+
getStaticBucketDescriptions(parameters: RequestParameters, reasons: BucketInclusionReason[], transformer: BucketIdTransformer): ResolvedBucket[];
|
|
37
46
|
hasDynamicBucketQueries(): boolean;
|
|
38
47
|
getSourceTables(): Set<TablePattern>;
|
|
48
|
+
private bucketInclusionReason;
|
|
39
49
|
tableSyncsData(table: SourceTableInterface): boolean;
|
|
40
50
|
tableSyncsParameters(table: SourceTableInterface): boolean;
|
|
51
|
+
resolveResultSets(schema: SourceSchema, tables: Record<string, Record<string, ColumnDefinition>>): void;
|
|
52
|
+
debugWriteOutputTables(result: Record<string, {
|
|
53
|
+
query: string;
|
|
54
|
+
}[]>): void;
|
|
55
|
+
debugRepresentation(): {
|
|
56
|
+
name: string;
|
|
57
|
+
type: string;
|
|
58
|
+
bucket_parameters: string[] | undefined;
|
|
59
|
+
global_parameter_queries: {
|
|
60
|
+
sql: string;
|
|
61
|
+
}[];
|
|
62
|
+
parameter_queries: {
|
|
63
|
+
sql: string;
|
|
64
|
+
table: TablePattern;
|
|
65
|
+
input_parameters: import("./types.js").InputParameter[];
|
|
66
|
+
}[];
|
|
67
|
+
data_queries: {
|
|
68
|
+
sql: string;
|
|
69
|
+
table: TablePattern;
|
|
70
|
+
columns: string[];
|
|
71
|
+
}[];
|
|
72
|
+
};
|
|
41
73
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { mergeBucketParameterQueriers } from './BucketParameterQuerier.js';
|
|
2
|
+
import { BucketSourceType } from './BucketSource.js';
|
|
2
3
|
import { IdSequence } from './IdSequence.js';
|
|
3
4
|
import { SqlDataQuery } from './SqlDataQuery.js';
|
|
4
5
|
import { SqlParameterQuery } from './SqlParameterQuery.js';
|
|
@@ -8,6 +9,12 @@ export class SqlBucketDescriptor {
|
|
|
8
9
|
constructor(name) {
|
|
9
10
|
this.name = name;
|
|
10
11
|
}
|
|
12
|
+
get type() {
|
|
13
|
+
return BucketSourceType.SYNC_RULE;
|
|
14
|
+
}
|
|
15
|
+
get subscribedToByDefault() {
|
|
16
|
+
return true;
|
|
17
|
+
}
|
|
11
18
|
/**
|
|
12
19
|
* source table -> queries
|
|
13
20
|
*/
|
|
@@ -15,11 +22,11 @@ export class SqlBucketDescriptor {
|
|
|
15
22
|
parameterQueries = [];
|
|
16
23
|
globalParameterQueries = [];
|
|
17
24
|
parameterIdSequence = new IdSequence();
|
|
18
|
-
addDataQuery(sql, options) {
|
|
25
|
+
addDataQuery(sql, options, compatibility) {
|
|
19
26
|
if (this.bucketParameters == null) {
|
|
20
27
|
throw new Error('Bucket parameters must be defined');
|
|
21
28
|
}
|
|
22
|
-
const dataRows = SqlDataQuery.fromSql(this.name, this.bucketParameters, sql, options);
|
|
29
|
+
const dataRows = SqlDataQuery.fromSql(this.name, this.bucketParameters, sql, options, compatibility);
|
|
23
30
|
this.dataQueries.push(dataRows);
|
|
24
31
|
return {
|
|
25
32
|
parsed: true,
|
|
@@ -53,7 +60,7 @@ export class SqlBucketDescriptor {
|
|
|
53
60
|
if (!query.applies(options.sourceTable)) {
|
|
54
61
|
continue;
|
|
55
62
|
}
|
|
56
|
-
results.push(...query.evaluateRow(options.sourceTable, options.record));
|
|
63
|
+
results.push(...query.evaluateRow(options.sourceTable, options.record, options.bucketIdTransformer));
|
|
57
64
|
}
|
|
58
65
|
return results;
|
|
59
66
|
}
|
|
@@ -66,24 +73,40 @@ export class SqlBucketDescriptor {
|
|
|
66
73
|
}
|
|
67
74
|
return results;
|
|
68
75
|
}
|
|
69
|
-
|
|
70
|
-
|
|
76
|
+
/**
|
|
77
|
+
* @deprecated Use `pushBucketParameterQueriers` instead and merge at the top-level.
|
|
78
|
+
*/
|
|
79
|
+
getBucketParameterQuerier(options) {
|
|
80
|
+
const queriers = [];
|
|
81
|
+
this.pushBucketParameterQueriers({ queriers, errors: [] }, options);
|
|
82
|
+
return mergeBucketParameterQueriers(queriers);
|
|
83
|
+
}
|
|
84
|
+
pushBucketParameterQueriers(result, options) {
|
|
85
|
+
const reasons = [this.bucketInclusionReason()];
|
|
86
|
+
const staticBuckets = this.getStaticBucketDescriptions(options.globalParameters, reasons, options.bucketIdTransformer);
|
|
71
87
|
const staticQuerier = {
|
|
72
88
|
staticBuckets,
|
|
73
89
|
hasDynamicBuckets: false,
|
|
74
90
|
parameterQueryLookups: [],
|
|
75
91
|
queryDynamicBucketDescriptions: async () => []
|
|
76
92
|
};
|
|
93
|
+
result.queriers.push(staticQuerier);
|
|
77
94
|
if (this.parameterQueries.length == 0) {
|
|
78
|
-
return
|
|
95
|
+
return;
|
|
79
96
|
}
|
|
80
|
-
const dynamicQueriers = this.parameterQueries.map((query) => query.getBucketParameterQuerier(
|
|
81
|
-
|
|
97
|
+
const dynamicQueriers = this.parameterQueries.map((query) => query.getBucketParameterQuerier(options.globalParameters, reasons, options.bucketIdTransformer));
|
|
98
|
+
result.queriers.push(...dynamicQueriers);
|
|
82
99
|
}
|
|
83
|
-
getStaticBucketDescriptions(parameters) {
|
|
100
|
+
getStaticBucketDescriptions(parameters, reasons, transformer) {
|
|
84
101
|
let results = [];
|
|
85
102
|
for (let query of this.globalParameterQueries) {
|
|
86
|
-
|
|
103
|
+
for (const desc of query.getStaticBucketDescriptions(parameters, transformer)) {
|
|
104
|
+
results.push({
|
|
105
|
+
...desc,
|
|
106
|
+
definition: this.name,
|
|
107
|
+
inclusion_reasons: reasons
|
|
108
|
+
});
|
|
109
|
+
}
|
|
87
110
|
}
|
|
88
111
|
return results;
|
|
89
112
|
}
|
|
@@ -101,6 +124,9 @@ export class SqlBucketDescriptor {
|
|
|
101
124
|
// Note: No physical tables for global_parameter_queries
|
|
102
125
|
return result;
|
|
103
126
|
}
|
|
127
|
+
bucketInclusionReason() {
|
|
128
|
+
return 'default';
|
|
129
|
+
}
|
|
104
130
|
tableSyncsData(table) {
|
|
105
131
|
for (let query of this.dataQueries) {
|
|
106
132
|
if (query.applies(table)) {
|
|
@@ -117,5 +143,47 @@ export class SqlBucketDescriptor {
|
|
|
117
143
|
}
|
|
118
144
|
return false;
|
|
119
145
|
}
|
|
146
|
+
resolveResultSets(schema, tables) {
|
|
147
|
+
for (let query of this.dataQueries) {
|
|
148
|
+
query.resolveResultSets(schema, tables);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
debugWriteOutputTables(result) {
|
|
152
|
+
for (let q of this.dataQueries) {
|
|
153
|
+
result[q.table] ??= [];
|
|
154
|
+
const r = {
|
|
155
|
+
query: q.sql
|
|
156
|
+
};
|
|
157
|
+
result[q.table].push(r);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
debugRepresentation() {
|
|
161
|
+
let all_parameter_queries = [...this.parameterQueries.values()].flat();
|
|
162
|
+
let all_data_queries = [...this.dataQueries.values()].flat();
|
|
163
|
+
return {
|
|
164
|
+
name: this.name,
|
|
165
|
+
type: BucketSourceType[this.type],
|
|
166
|
+
bucket_parameters: this.bucketParameters,
|
|
167
|
+
global_parameter_queries: this.globalParameterQueries.map((q) => {
|
|
168
|
+
return {
|
|
169
|
+
sql: q.sql
|
|
170
|
+
};
|
|
171
|
+
}),
|
|
172
|
+
parameter_queries: all_parameter_queries.map((q) => {
|
|
173
|
+
return {
|
|
174
|
+
sql: q.sql,
|
|
175
|
+
table: q.sourceTable,
|
|
176
|
+
input_parameters: q.inputParameters
|
|
177
|
+
};
|
|
178
|
+
}),
|
|
179
|
+
data_queries: all_data_queries.map((q) => {
|
|
180
|
+
return {
|
|
181
|
+
sql: q.sql,
|
|
182
|
+
table: q.sourceTable,
|
|
183
|
+
columns: q.columnOutputNames()
|
|
184
|
+
};
|
|
185
|
+
})
|
|
186
|
+
};
|
|
187
|
+
}
|
|
120
188
|
}
|
|
121
189
|
//# sourceMappingURL=SqlBucketDescriptor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SqlBucketDescriptor.js","sourceRoot":"","sources":["../src/SqlBucketDescriptor.ts"],"names":[],"mappings":"AACA,OAAO,EAA0B,4BAA4B,
|
|
1
|
+
{"version":3,"file":"SqlBucketDescriptor.js","sourceRoot":"","sources":["../src/SqlBucketDescriptor.ts"],"names":[],"mappings":"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"}
|
package/dist/SqlDataQuery.d.ts
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import { BaseSqlDataQuery, BaseSqlDataQueryOptions } from './BaseSqlDataQuery.js';
|
|
2
2
|
import { SourceTableInterface } from './SourceTableInterface.js';
|
|
3
3
|
import { SyncRulesOptions } from './SqlSyncRules.js';
|
|
4
|
-
import { EvaluationResult, ParameterMatchClause, SqliteRow } from './types.js';
|
|
4
|
+
import { BucketIdTransformer, EvaluationResult, ParameterMatchClause, SqliteRow } from './types.js';
|
|
5
|
+
import { CompatibilityContext } from './compatibility.js';
|
|
5
6
|
export interface SqlDataQueryOptions extends BaseSqlDataQueryOptions {
|
|
6
7
|
filter: ParameterMatchClause;
|
|
7
8
|
}
|
|
8
9
|
export declare class SqlDataQuery extends BaseSqlDataQuery {
|
|
9
|
-
static fromSql(descriptorName: string, bucketParameters: string[], sql: string, options: SyncRulesOptions): SqlDataQuery;
|
|
10
|
+
static fromSql(descriptorName: string, bucketParameters: string[], sql: string, options: SyncRulesOptions, compatibility: CompatibilityContext): SqlDataQuery;
|
|
10
11
|
/**
|
|
11
12
|
* The query WHERE clause.
|
|
12
13
|
*
|
|
@@ -16,5 +17,5 @@ export declare class SqlDataQuery extends BaseSqlDataQuery {
|
|
|
16
17
|
*/
|
|
17
18
|
readonly filter: ParameterMatchClause;
|
|
18
19
|
constructor(options: SqlDataQueryOptions);
|
|
19
|
-
evaluateRow(table: SourceTableInterface, row: SqliteRow): EvaluationResult[];
|
|
20
|
+
evaluateRow(table: SourceTableInterface, row: SqliteRow, bucketIdTransformer: BucketIdTransformer): EvaluationResult[];
|
|
20
21
|
}
|